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

Reply via email to