]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
s390/bpf: Write back tail call counter for BPF_TRAMP_F_CALL_ORIG
authorIlya Leoshkevich <iii@linux.ibm.com>
Fri, 17 Oct 2025 09:19:07 +0000 (11:19 +0200)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Sun, 19 Oct 2025 14:34:05 +0000 (16:34 +0200)
commit bc3905a71f02511607d3ccf732360580209cac4c upstream.

The tailcall_bpf2bpf_hierarchy_fentry test hangs on s390. Its call
graph is as follows:

  entry()
    subprog_tail()
      trampoline()
        fentry()
        the rest of subprog_tail()  # via BPF_TRAMP_F_CALL_ORIG
        return to entry()

The problem is that the rest of subprog_tail() increments the tail call
counter, but the trampoline discards the incremented value. This
results in an astronomically large number of tail calls.

Fix by making the trampoline write the incremented tail call counter
back.

Fixes: 528eb2cb87bc ("s390/bpf: Implement arch_prepare_bpf_trampoline()")
Signed-off-by: Ilya Leoshkevich <iii@linux.ibm.com>
Signed-off-by: Daniel Borkmann <daniel@iogearbox.net>
Link: https://lore.kernel.org/bpf/20250813121016.163375-4-iii@linux.ibm.com
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
arch/s390/net/bpf_jit_comp.c

index 2526a3d53fadbfb8b000601416ba1021e92ea6ab..f305cb42070df71d6e144ec9066e0adf28b34fd9 100644 (file)
@@ -2828,6 +2828,9 @@ static int __arch_prepare_bpf_trampoline(struct bpf_tramp_image *im,
                /* stg %r2,retval_off(%r15) */
                EMIT6_DISP_LH(0xe3000000, 0x0024, REG_2, REG_0, REG_15,
                              tjit->retval_off);
+               /* mvc tccnt_off(%r15),tail_call_cnt(4,%r15) */
+               _EMIT6(0xd203f000 | tjit->tccnt_off,
+                      0xf000 | offsetof(struct prog_frame, tail_call_cnt));
 
                im->ip_after_call = jit->prg_buf + jit->prg;