> 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.