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

From: Alexei Starovoitov
Date: Tue May 19 2015 - 20:14:40 EST


On 5/19/15 5:11 PM, Andy Lutomirski wrote:
On Tue, May 19, 2015 at 4:59 PM, Alexei Starovoitov <ast@xxxxxxxxxxxx> wrote:
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.

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/