This patchset fixes a tailcall hierarchy issue with a better solution than v1[0]. v1 solution stores tail_call_cnt on the stack of bpf prog: | STACK | +---------+ RBP | | | | | | +--| tcc_ptr | +->| tcc | | rbx | +---------+ RSP v2 solution stores tail_call_cnt on the stack of bpf prog's caller: | STACK | | | | rip | +->| tcc | | | rip | | | rbp | | +---------+ RBP | | | | | | | | | +--| tcc_ptr | | rbx | +---------+ RSP With this change, it requires less instructions to resolve this issue. For more resolving details, please read the following patches. The issue is confirmed in the discussions of "bpf, x64: Fix tailcall infinite loop"[1]. Currently, I only resolve this issue on x86. The ones on arm64, s390x and loongarch are waiting to be resolved. So, the ci pipeline fails to run for this issue fixing. Hopefully, this issue on s390x and arm64 will be resolved soon. v1 -> v2: * address comments from Stanislav * Separate moving emit_nops() as first patch. Links: [0] https://lore.kernel.org/bpf/20231005145814.83122-1-hffilwlqm@xxxxxxxxx/ [1] https://lore.kernel.org/bpf/6203dd01-789d-f02c-5293-def4c1b18aef@xxxxxxxxx/ Leon Hwang (4): bpf, x64: Emit nops for X86_PATCH bpf, x64: Fix tailcall hierarchy bpf, x64: Load tail_call_cnt pointer selftests/bpf: Add testcases for tailcall hierarchy fixing arch/x86/net/bpf_jit_comp.c | 99 +++-- .../selftests/bpf/prog_tests/tailcalls.c | 418 ++++++++++++++++++ .../bpf/progs/tailcall_bpf2bpf_hierarchy1.c | 34 ++ .../bpf/progs/tailcall_bpf2bpf_hierarchy2.c | 55 +++ .../bpf/progs/tailcall_bpf2bpf_hierarchy3.c | 46 ++ 5 files changed, 606 insertions(+), 46 deletions(-) create mode 100644 tools/testing/selftests/bpf/progs/tailcall_bpf2bpf_hierarchy1.c create mode 100644 tools/testing/selftests/bpf/progs/tailcall_bpf2bpf_hierarchy2.c create mode 100644 tools/testing/selftests/bpf/progs/tailcall_bpf2bpf_hierarchy3.c base-commit: 644b54d80d572438a815c05b1bab2b7871e1e5a1 -- 2.41.0