On 05/01/26 4:45 pm, [email protected] wrote:
diff --git a/arch/powerpc/net/bpf_jit_comp.c b/arch/powerpc/net/bpf_jit_comp.c
index 069a8822c30d..4aaa0a287a45 100644
--- a/arch/powerpc/net/bpf_jit_comp.c
+++ b/arch/powerpc/net/bpf_jit_comp.c
[ ... ]
-static void bpf_trampoline_setup_tail_call_cnt(u32 *image, struct
codegen_context *ctx,
- int func_frame_offset, int
r4_off)
+static void bpf_trampoline_setup_tail_call_info(u32 *image, struct
codegen_context *ctx,
+ int func_frame_offset,
+ int bpf_dummy_frame_size, int
r4_off)
{
if (IS_ENABLED(CONFIG_PPC64)) {
/* See bpf_jit_stack_tailcallinfo_offset() */
- int tailcallcnt_offset = 7 * 8;
+ int tailcallinfo_offset = BPF_PPC_STACK_SAVE + SZL;
[ ... ]
+ EMIT(PPC_RAW_STL(_R3, _R1, func_frame_offset
+ - bpf_dummy_frame_size - tailcallinfo_offset));
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
The new setup function stores tail_call_info at offset
(func_frame_offset - bpf_dummy_frame_size - tailcallinfo_offset) from R1.
Since func_frame_offset = bpf_dummy_frame_size + bpf_frame_size, this
resolves to (bpf_frame_size - 56), which is a positive offset from R1.
With this patchset, back propagation of tail call count is not needed
anymore, as tail call count is saved only at one place and all
subsequent uses only hold the pointer to it. So, I can't think of a
good reason to restore tailcall count. Restore can be skipped?
@abhishek, a comment explaining how tailcall count/pointer is being
setup would help here...
Also, the trampoline frame has increased by as much as the size of
the redzone for bpf program. We are doing that just to keep tailcall
info at the same offset. No reason to save the NVRs in this frame
though. I suggest to adjust the stack layout to have tailcall info
as the first doubleword in the redzone instead of being the (n+1)th
doubleword after n NVRs. Saves stack space and makes tailcall info
offset calculation simpler.
- Hari