Re: [PATCH net-next 2/4] x86: bpf_jit: implement bpf_tail_call() helper
From: Andy Lutomirski <hidden>
Date: 2015-05-20 16:05:50
Also in:
linux-api, lkml
On Tue, May 19, 2015 at 5:14 PM, Alexei Starovoitov [off-list ref] wrote:
On 5/19/15 5:11 PM, Andy Lutomirski wrote:quoted
On Tue, May 19, 2015 at 4:59 PM, Alexei Starovoitov [off-list ref] wrote:quoted
bpf_tail_call() arguments: ctx - context pointer jmp_table - one of BPF_MAP_TYPE_PROG_ARRAY maps used as the jump table index - index in the jump table In this implementation x64 JIT bypasses stack unwind and jumps into the callee program after prologue, so the callee program reuses the same stack. The logic can be roughly expressed in C like: u32 tail_call_cnt; void *jumptable[2] = { &&label1, &&label2 }; int bpf_prog1(void *ctx) { label1: ... } int bpf_prog2(void *ctx) { label2: ... } int bpf_prog1(void *ctx) { ... if (tail_call_cnt++ < MAX_TAIL_CALL_CNT) goto *jumptable[index]; ... and pass my 'ctx' to callee ... ... fall through if no entry in jumptable ... }What causes the stack pointer to be right? Is there some reason that the stack pointer is the same no matter where you are in the generated code?that's why I said 'it's _roughly_ expressed in C' this way. Stack pointer doesn't change. It uses the same stack frame.
I think the more relevant point is that (I think) eBPF never changes the stack pointer after the prologue (i.e. the stack depth is truly constant). --Andy