Le 02/04/2024 à 12:58, Hari Bathini a écrit : > With PCREL addressing, there is no kernel TOC. So, it is not setup in > prologue when PCREL addressing is used. But the number of instructions > to skip on a tail call was not adjusted accordingly. That resulted in > not so obvious failures while using tailcalls. 'tailcalls' selftest > crashed the system with the below call trace: > > bpf_test_run+0xe8/0x3cc (unreliable) > bpf_prog_test_run_skb+0x348/0x778 > __sys_bpf+0xb04/0x2b00 > sys_bpf+0x28/0x38 > system_call_exception+0x168/0x340 > system_call_vectored_common+0x15c/0x2ec > > Fixes: 7e3a68be42e1 ("powerpc/64: vmlinux support building with PCREL addresing") > Cc: stable@xxxxxxxxxxxxxxx > Signed-off-by: Hari Bathini <hbathini@xxxxxxxxxxxxx> > --- > > * Changes in v3: > - New patch to fix tailcall issues with PCREL addressing. > > > arch/powerpc/net/bpf_jit_comp64.c | 2 ++ > 1 file changed, 2 insertions(+) > > diff --git a/arch/powerpc/net/bpf_jit_comp64.c b/arch/powerpc/net/bpf_jit_comp64.c > index 79f23974a320..7f62ac4b4e65 100644 > --- a/arch/powerpc/net/bpf_jit_comp64.c > +++ b/arch/powerpc/net/bpf_jit_comp64.c > @@ -285,8 +285,10 @@ static int bpf_jit_emit_tail_call(u32 *image, struct codegen_context *ctx, u32 o > int b2p_index = bpf_to_ppc(BPF_REG_3); > int bpf_tailcall_prologue_size = 8; > > +#ifndef CONFIG_PPC_KERNEL_PCREL Any reason for not using IS_ENABLED(CONFIG_PPC_KERNEL_PCREL) ? > if (IS_ENABLED(CONFIG_PPC64_ELF_ABI_V2)) > bpf_tailcall_prologue_size += 4; /* skip past the toc load */ > +#endif > > /* > * if (index >= array->map.max_entries)