bpf, x64: save 5 bytes in prologue when ebpf insns came from cbpf
authorDaniel Borkmann <daniel@iogearbox.net>
Sat, 24 Feb 2018 00:08:02 +0000 (01:08 +0100)
committerAlexei Starovoitov <ast@kernel.org>
Sat, 24 Feb 2018 06:50:00 +0000 (22:50 -0800)
While it's rather cumbersome to reduce prologue for cBPF->eBPF
migrations wrt spill/fill for r15 which is callee saved register
due to bpf_error path in bpf_jit.S that is both used by migrations
as well as native eBPF, we can still trivially save 5 bytes in
prologue for the former since tail calls can never be used there.
cBPF->eBPF migrations also have their own custom prologue in BPF
asm that xors A and X reg anyway, so it's fine we skip this here.

Signed-off-by: Daniel Borkmann <daniel@iogearbox.net>
Signed-off-by: Alexei Starovoitov <ast@kernel.org>
arch/x86/net/bpf_jit_comp.c

index 5b8fc1326aa1c1dad0511c7aed1879342a446e3c..70f9748da7aaaedf1e1ae1ec3c26ab3497029436 100644 (file)
@@ -216,7 +216,7 @@ struct jit_context {
 /* emit x64 prologue code for BPF program and check it's size.
  * bpf_tail_call helper will skip it while jumping into another program
  */
-static void emit_prologue(u8 **pprog, u32 stack_depth)
+static void emit_prologue(u8 **pprog, u32 stack_depth, bool ebpf_from_cbpf)
 {
        u8 *prog = *pprog;
        int cnt = 0;
@@ -251,18 +251,21 @@ static void emit_prologue(u8 **pprog, u32 stack_depth)
        /* mov qword ptr [rbp+24],r15 */
        EMIT4(0x4C, 0x89, 0x7D, 24);
 
-       /* Clear the tail call counter (tail_call_cnt): for eBPF tail calls
-        * we need to reset the counter to 0. It's done in two instructions,
-        * resetting rax register to 0 (xor on eax gets 0 extended), and
-        * moving it to the counter location.
-        */
+       if (!ebpf_from_cbpf) {
+               /* Clear the tail call counter (tail_call_cnt): for eBPF tail
+                * calls we need to reset the counter to 0. It's done in two
+                * instructions, resetting rax register to 0, and moving it
+                * to the counter location.
+                */
 
-       /* xor eax, eax */
-       EMIT2(0x31, 0xc0);
-       /* mov qword ptr [rbp+32], rax */
-       EMIT4(0x48, 0x89, 0x45, 32);
+               /* xor eax, eax */
+               EMIT2(0x31, 0xc0);
+               /* mov qword ptr [rbp+32], rax */
+               EMIT4(0x48, 0x89, 0x45, 32);
+
+               BUILD_BUG_ON(cnt != PROLOGUE_SIZE);
+       }
 
-       BUILD_BUG_ON(cnt != PROLOGUE_SIZE);
        *pprog = prog;
 }
 
@@ -453,7 +456,8 @@ static int do_jit(struct bpf_prog *bpf_prog, int *addrs, u8 *image,
        int proglen = 0;
        u8 *prog = temp;
 
-       emit_prologue(&prog, bpf_prog->aux->stack_depth);
+       emit_prologue(&prog, bpf_prog->aux->stack_depth,
+                     bpf_prog_was_classic(bpf_prog));
 
        if (seen_ld_abs)
                emit_load_skb_data_hlen(&prog);