bpf, x64: save 5 bytes in prologue when ebpf insns came from cbpf
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>
This commit is contained in:
parent
4c38e2f386
commit
0869175220
|
@ -216,7 +216,7 @@ struct jit_context {
|
||||||
/* emit x64 prologue code for BPF program and check it's size.
|
/* emit x64 prologue code for BPF program and check it's size.
|
||||||
* bpf_tail_call helper will skip it while jumping into another program
|
* 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;
|
u8 *prog = *pprog;
|
||||||
int cnt = 0;
|
int cnt = 0;
|
||||||
|
@ -251,18 +251,21 @@ static void emit_prologue(u8 **pprog, u32 stack_depth)
|
||||||
/* mov qword ptr [rbp+24],r15 */
|
/* mov qword ptr [rbp+24],r15 */
|
||||||
EMIT4(0x4C, 0x89, 0x7D, 24);
|
EMIT4(0x4C, 0x89, 0x7D, 24);
|
||||||
|
|
||||||
/* Clear the tail call counter (tail_call_cnt): for eBPF tail calls
|
if (!ebpf_from_cbpf) {
|
||||||
* we need to reset the counter to 0. It's done in two instructions,
|
/* Clear the tail call counter (tail_call_cnt): for eBPF tail
|
||||||
* resetting rax register to 0 (xor on eax gets 0 extended), and
|
* calls we need to reset the counter to 0. It's done in two
|
||||||
* moving it to the counter location.
|
* instructions, resetting rax register to 0, and moving it
|
||||||
*/
|
* to the counter location.
|
||||||
|
*/
|
||||||
|
|
||||||
/* xor eax, eax */
|
/* xor eax, eax */
|
||||||
EMIT2(0x31, 0xc0);
|
EMIT2(0x31, 0xc0);
|
||||||
/* mov qword ptr [rbp+32], rax */
|
/* mov qword ptr [rbp+32], rax */
|
||||||
EMIT4(0x48, 0x89, 0x45, 32);
|
EMIT4(0x48, 0x89, 0x45, 32);
|
||||||
|
|
||||||
|
BUILD_BUG_ON(cnt != PROLOGUE_SIZE);
|
||||||
|
}
|
||||||
|
|
||||||
BUILD_BUG_ON(cnt != PROLOGUE_SIZE);
|
|
||||||
*pprog = prog;
|
*pprog = prog;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -453,7 +456,8 @@ static int do_jit(struct bpf_prog *bpf_prog, int *addrs, u8 *image,
|
||||||
int proglen = 0;
|
int proglen = 0;
|
||||||
u8 *prog = temp;
|
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)
|
if (seen_ld_abs)
|
||||||
emit_load_skb_data_hlen(&prog);
|
emit_load_skb_data_hlen(&prog);
|
||||||
|
|
Loading…
Reference in New Issue