Thread (19 messages) flat view 19 messages, 4 authors, 2015-05-21

Re: [PATCH net-next 2/4] x86: bpf_jit: implement bpf_tail_call() helper

From: Alexei Starovoitov <hidden>
Date: 2015-05-20 00:14:37
Also in: linux-api, lkml

On 5/19/15 5:11 PM, Andy Lutomirski wrote:
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.
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help