> On 24 Jan 2026, at 1:22 PM, [email protected] wrote: > > From: Abhishek Dubey <[email protected]> > > This patch series enables support for two BPF JIT features > on powerpc64. The first three patches target support for > tail calls with subprogram combinations. The first patch > supports realignment of tail_call_cnt offset in stack frame. > Implementation details are provided in the commit messages. > > The last three patches add support for BPF exceptions. An > architecture-specific stack walker is implemented to assist > with stack walk during exceptions. > > All selftests related to tailcalls and exceptions are passing: > > # ./test_progs -t tailcalls > #442/1 tailcalls/tailcall_1:OK > #442/2 tailcalls/tailcall_2:OK > #442/3 tailcalls/tailcall_3:OK > #442/4 tailcalls/tailcall_4:OK > #442/5 tailcalls/tailcall_5:OK > #442/6 tailcalls/tailcall_6:OK > #442/7 tailcalls/tailcall_bpf2bpf_1:OK > #442/8 tailcalls/tailcall_bpf2bpf_2:OK > #442/9 tailcalls/tailcall_bpf2bpf_3:OK > #442/10 tailcalls/tailcall_bpf2bpf_4:OK > #442/11 tailcalls/tailcall_bpf2bpf_5:OK > #442/12 tailcalls/tailcall_bpf2bpf_6:OK > #442/13 tailcalls/tailcall_bpf2bpf_fentry:OK > #442/14 tailcalls/tailcall_bpf2bpf_fexit:OK > #442/15 tailcalls/tailcall_bpf2bpf_fentry_fexit:OK > #442/16 tailcalls/tailcall_bpf2bpf_fentry_entry:OK > #442/17 tailcalls/tailcall_poke:OK > #442/18 tailcalls/tailcall_bpf2bpf_hierarchy_1:OK > #442/19 tailcalls/tailcall_bpf2bpf_hierarchy_fentry:OK > #442/20 tailcalls/tailcall_bpf2bpf_hierarchy_fexit:OK > #442/21 tailcalls/tailcall_bpf2bpf_hierarchy_fentry_fexit:OK > #442/22 tailcalls/tailcall_bpf2bpf_hierarchy_fentry_entry:OK > #442/23 tailcalls/tailcall_bpf2bpf_hierarchy_2:OK > #442/24 tailcalls/tailcall_bpf2bpf_hierarchy_3:OK > #442/25 tailcalls/tailcall_freplace:OK > #442/26 tailcalls/tailcall_bpf2bpf_freplace:OK > #442/27 tailcalls/tailcall_failure:OK > #442/28 tailcalls/reject_tail_call_spin_lock:OK > #442/29 tailcalls/reject_tail_call_rcu_lock:OK > #442/30 tailcalls/reject_tail_call_preempt_lock:OK > #442/31 tailcalls/reject_tail_call_ref:OK > #442 tailcalls:OK > Summary: 1/31 PASSED, 0 SKIPPED, 0 FAILED > > # ./test_progs -t exceptions > #105/1 exceptions/exception_throw_always_1:OK > #105/2 exceptions/exception_throw_always_2:OK > #105/3 exceptions/exception_throw_unwind_1:OK > #105/4 exceptions/exception_throw_unwind_2:OK > #105/5 exceptions/exception_throw_default:OK > #105/6 exceptions/exception_throw_default_value:OK > #105/7 exceptions/exception_tail_call:OK > #105/8 exceptions/exception_ext:OK > #105/9 exceptions/exception_ext_mod_cb_runtime:OK > #105/10 exceptions/exception_throw_subprog:OK > #105/11 exceptions/exception_assert_nz_gfunc:OK > #105/12 exceptions/exception_assert_zero_gfunc:OK > #105/13 exceptions/exception_assert_neg_gfunc:OK > #105/14 exceptions/exception_assert_pos_gfunc:OK > #105/15 exceptions/exception_assert_negeq_gfunc:OK > #105/16 exceptions/exception_assert_poseq_gfunc:OK > #105/17 exceptions/exception_assert_nz_gfunc_with:OK > #105/18 exceptions/exception_assert_zero_gfunc_with:OK > #105/19 exceptions/exception_assert_neg_gfunc_with:OK > #105/20 exceptions/exception_assert_pos_gfunc_with:OK > #105/21 exceptions/exception_assert_negeq_gfunc_with:OK > #105/22 exceptions/exception_assert_poseq_gfunc_with:OK > #105/23 exceptions/exception_bad_assert_nz_gfunc:OK > #105/24 exceptions/exception_bad_assert_zero_gfunc:OK > #105/25 exceptions/exception_bad_assert_neg_gfunc:OK > #105/26 exceptions/exception_bad_assert_pos_gfunc:OK > #105/27 exceptions/exception_bad_assert_negeq_gfunc:OK > #105/28 exceptions/exception_bad_assert_poseq_gfunc:OK > #105/29 exceptions/exception_bad_assert_nz_gfunc_with:OK > #105/30 exceptions/exception_bad_assert_zero_gfunc_with:OK > #105/31 exceptions/exception_bad_assert_neg_gfunc_with:OK > #105/32 exceptions/exception_bad_assert_pos_gfunc_with:OK > #105/33 exceptions/exception_bad_assert_negeq_gfunc_with:OK > #105/34 exceptions/exception_bad_assert_poseq_gfunc_with:OK > #105/35 exceptions/exception_assert_range:OK > #105/36 exceptions/exception_assert_range_with:OK > #105/37 exceptions/exception_bad_assert_range:OK > #105/38 exceptions/exception_bad_assert_range_with:OK > #105/39 exceptions/non-throwing fentry -> exception_cb:OK > #105/40 exceptions/throwing fentry -> exception_cb:OK > #105/41 exceptions/non-throwing fexit -> exception_cb:OK > #105/42 exceptions/throwing fexit -> exception_cb:OK > #105/43 exceptions/throwing extension (with custom cb) -> exception_cb:OK > #105/44 exceptions/throwing extension -> global func in exception_cb:OK > #105/45 exceptions/exception_ext_mod_cb_runtime:OK > #105/46 exceptions/throwing extension (with custom cb) -> global func in > exception_cb:OK > #105/47 exceptions/exception_ext:OK > #105/48 exceptions/non-throwing fentry -> non-throwing subprog:OK > #105/49 exceptions/throwing fentry -> non-throwing subprog:OK > #105/50 exceptions/non-throwing fentry -> throwing subprog:OK > #105/51 exceptions/throwing fentry -> throwing subprog:OK > #105/52 exceptions/non-throwing fexit -> non-throwing subprog:OK > #105/53 exceptions/throwing fexit -> non-throwing subprog:OK > #105/54 exceptions/non-throwing fexit -> throwing subprog:OK > #105/55 exceptions/throwing fexit -> throwing subprog:OK > #105/56 exceptions/non-throwing fmod_ret -> non-throwing subprog:OK > #105/57 exceptions/non-throwing fmod_ret -> non-throwing global subprog:OK > #105/58 exceptions/non-throwing extension -> non-throwing subprog:OK > #105/59 exceptions/non-throwing extension -> throwing subprog:OK > #105/60 exceptions/non-throwing extension -> non-throwing subprog:OK > #105/61 exceptions/non-throwing extension -> throwing global subprog:OK > #105/62 exceptions/throwing extension -> throwing global subprog:OK > #105/63 exceptions/throwing extension -> non-throwing global subprog:OK > #105/64 exceptions/non-throwing extension -> main subprog:OK > #105/65 exceptions/throwing extension -> main subprog:OK > #105/66 exceptions/reject_exception_cb_type_1:OK > #105/67 exceptions/reject_exception_cb_type_2:OK > #105/68 exceptions/reject_exception_cb_type_3:OK > #105/69 exceptions/reject_exception_cb_type_4:OK > #105/70 exceptions/reject_async_callback_throw:OK > #105/71 exceptions/reject_with_lock:OK > #105/72 exceptions/reject_subprog_with_lock:OK > #105/73 exceptions/reject_with_rcu_read_lock:OK > #105/74 exceptions/reject_subprog_with_rcu_read_lock:OK > #105/75 exceptions/reject_with_rbtree_add_throw:OK > #105/76 exceptions/reject_with_reference:OK > #105/77 exceptions/reject_with_cb_reference:OK > #105/78 exceptions/reject_with_cb:OK > #105/79 exceptions/reject_with_subprog_reference:OK > #105/80 exceptions/reject_throwing_exception_cb:OK > #105/81 exceptions/reject_exception_cb_call_global_func:OK > #105/82 exceptions/reject_exception_cb_call_static_func:OK > #105/83 exceptions/reject_multiple_exception_cb:OK > #105/84 exceptions/reject_exception_throw_cb:OK > #105/85 exceptions/reject_exception_throw_cb_diff:OK > #105/86 exceptions/reject_set_exception_cb_bad_ret1:OK > #105/87 exceptions/reject_set_exception_cb_bad_ret2:OK > #105/88 exceptions/check_assert_eq_int_min:OK > #105/89 exceptions/check_assert_eq_int_max:OK > #105/90 exceptions/check_assert_eq_zero:OK > #105/91 exceptions/check_assert_eq_llong_min:OK > #105/92 exceptions/check_assert_eq_llong_max:OK > #105/93 exceptions/check_assert_lt_pos:OK > #105/94 exceptions/check_assert_lt_zero:OK > #105/95 exceptions/check_assert_lt_neg:OK > #105/96 exceptions/check_assert_le_pos:OK > #105/97 exceptions/check_assert_le_zero:OK > #105/98 exceptions/check_assert_le_neg:OK > #105/99 exceptions/check_assert_gt_pos:OK > #105/100 exceptions/check_assert_gt_zero:OK > #105/101 exceptions/check_assert_gt_neg:OK > #105/102 exceptions/check_assert_ge_pos:OK > #105/103 exceptions/check_assert_ge_zero:OK > #105/104 exceptions/check_assert_ge_neg:OK > #105/105 exceptions/check_assert_range_s64:OK > #105/106 exceptions/check_assert_range_u64:OK > #105/107 exceptions/check_assert_single_range_s64:OK > #105/108 exceptions/check_assert_single_range_u64:OK > #105/109 exceptions/check_assert_generic:OK > #105/110 exceptions/check_assert_with_return:OK > #105 exceptions:OK > Summary: 1/110 PASSED, 0 SKIPPED, 0 FAILED > > [v1]: > https://lore.kernel.org/all/[email protected]/ > [v2]: https://lore.kernel.org/all/[email protected]/ > [v3]: https://lore.kernel.org/all/[email protected]/ > [v4]: https://lore.kernel.org/all/[email protected]/ > > Changes v4->v5: > Patch comments and code refactoring > Handle exception callback and boundary frame checks > Changes v3->v4: > Handle bpf-ci warnings > Changes v2->v3: > Added PPC_BCC_CONST_SHORT for short jumps of constant offset > Optimize tailcall allocation for BPF_TRAMP_F_CALL_ORIG flag > New helper for stack size calculation during exceptions > Prologue JIT optimizations during non exception prog case > Changes v1->v2: > Move tail_call_cnt to offset 0 in stack frame > Remove trampoline NVR remapping-patch3/6 > > Abhishek Dubey (6): > powerpc64/bpf: Moving tail_call_cnt to bottom of frame > powerpc64/bpf: Support tailcalls with subprogs > powerpc64/bpf: Avoid tailcall restore from trampoline > powerpc64/bpf: Add arch_bpf_stack_walk() for BPF JIT > powerpc64/bpf: Support exceptions > powerpc64/bpf: Additional NVR handling for bpf_throw > > arch/powerpc/net/bpf_jit.h | 16 ++ > arch/powerpc/net/bpf_jit_comp.c | 85 +++++++-- > arch/powerpc/net/bpf_jit_comp64.c | 276 +++++++++++++++++++++++++----- > 3 files changed, 315 insertions(+), 62 deletions(-) > > -- > 2.48.1 > Tested this series, it’s working as expected. Please add below tag. Tested-by: Venkat Rao Bagalkote <[email protected]> Regards, Venkat.

