]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
LoongArch: BPF: No text_poke() for kernel text
authorHengqi Chen <hengqi.chen@gmail.com>
Thu, 2 Oct 2025 14:39:52 +0000 (22:39 +0800)
committerHuacai Chen <chenhuacai@loongson.cn>
Thu, 2 Oct 2025 14:39:52 +0000 (22:39 +0800)
The current implementation of bpf_arch_text_poke() requires 5 nops
at patch site which is not applicable for kernel/module functions.
Because LoongArch reserves ONLY 2 nops at the function entry. With
CONFIG_DYNAMIC_FTRACE_WITH_DIRECT_CALLS=y, this can be done by ftrace
instead.

See the following commit for details:
  * commit b91e014f078e ("bpf: Make BPF trampoline use register_ftrace_direct() API")
  * commit 9cdc3b6a299c ("LoongArch: ftrace: Add direct call support")

Cc: stable@vger.kernel.org
Tested-by: Vincent Li <vincent.mc.li@gmail.com>
Signed-off-by: Hengqi Chen <hengqi.chen@gmail.com>
Signed-off-by: Huacai Chen <chenhuacai@loongson.cn>
arch/loongarch/net/bpf_jit.c

index bee2e8e340e743d5837ba687ae68407e32d176e9..33e8942cc9617fa927d4a72f106a8a00d2c7de9b 100644 (file)
@@ -1292,8 +1292,10 @@ int bpf_arch_text_poke(void *ip, enum bpf_text_poke_type poke_type,
        u32 old_insns[LOONGARCH_LONG_JUMP_NINSNS] = {[0 ... 4] = INSN_NOP};
        u32 new_insns[LOONGARCH_LONG_JUMP_NINSNS] = {[0 ... 4] = INSN_NOP};
 
-       if (!is_kernel_text((unsigned long)ip) &&
-               !is_bpf_text_address((unsigned long)ip))
+       /* Only poking bpf text is supported. Since kernel function entry
+        * is set up by ftrace, we rely on ftrace to poke kernel functions.
+        */
+       if (!is_bpf_text_address((unsigned long)ip))
                return -ENOTSUPP;
 
        ret = emit_jump_or_nops(old_addr, ip, old_insns, is_call);