mirror of
https://github.com/torvalds/linux.git
synced 2026-09-24 06:24:02 +02:00
LoongArch: BPF: Optimize redundant TCC loads in epilogue
The legacy epilogue implementation pops the tail call counter (TCC) context via a redundant double-load pattern. It first decrements the load_offset by 2 slots to fetch 'tcc_ptr', and then immediately bumps it back up by 1 slot to load the original 'tcc' value into REG_TCC, unnecessarily overwriting the register. Optimize this sequence by adjusting the load_offset by only 1 slot. This aligns the offset directly with the higher stack slot containing the entry TCC counter (or caller state), allowing us to restore the REG_TCC register safely with a single load. This removes one redundant instruction from the epilogue hot path, improves code readability, and ensures the correct TCC register context is handed back cleanly upon normal return. Cc: stable@vger.kernel.org Fixes:c0fcc955ff("LoongArch: BPF: Fix the tailcall hierarchy") Fixes:ef54c517a9("LoongArch: BPF: Implement PROBE_MEM32 pseudo instructions") Signed-off-by: Tiezhu Yang <yangtiezhu@loongson.cn> Signed-off-by: Huacai Chen <chenhuacai@loongson.cn>
This commit is contained in:
parent
29479b1431
commit
fd3cb1bfeb
|
|
@ -246,14 +246,8 @@ static void __build_epilogue(struct jit_ctx *ctx, bool is_tail_call)
|
|||
emit_insn(ctx, ldd, REG_ARENA, LOONGARCH_GPR_SP, load_offset);
|
||||
}
|
||||
|
||||
/*
|
||||
* When push into the stack, follow the order of tcc then tcc_ptr.
|
||||
* When pop from the stack, first pop tcc_ptr then followed by tcc.
|
||||
*/
|
||||
load_offset -= 2 * sizeof(long);
|
||||
emit_insn(ctx, ldd, REG_TCC, LOONGARCH_GPR_SP, load_offset);
|
||||
|
||||
load_offset += sizeof(long);
|
||||
/* Only restore the TCC state into REG_TCC from the higher slot */
|
||||
load_offset -= sizeof(long);
|
||||
emit_insn(ctx, ldd, REG_TCC, LOONGARCH_GPR_SP, load_offset);
|
||||
|
||||
emit_insn(ctx, addid, LOONGARCH_GPR_SP, LOONGARCH_GPR_SP, stack_adjust);
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user