[PATCH V2] powerpc/text-patching: simplify the implementation of ppc_kallsyms_lookup_name()
From: Xie Yuanbin <hidden>
Date: 2026-05-06 02:12:12
Also in:
lkml
Subsystem:
linux for powerpc (32-bit and 64-bit), the rest · Maintainers:
Madhavan Srinivasan, Linus Torvalds
ppc_kallsyms_lookup_name() is called only twice in the kernel code, and the parameters are all constant strings. strnlen(name, KSYM_NAME_LEN) is called inside ppc_kallsyms_lookup_name(), when the compiler detects that KSYM_NAME_LEN is larger then the constant strings, the following error will be triggered:
CC arch/powerpc/kernel/optprobes.o
In file included from ./arch/powerpc/include/asm/kprobes.h:24,
from ./include/linux/kprobes.h:31,
from arch/powerpc/kernel/optprobes.c:8:
In function 'ppc_kallsyms_lookup_name',
inlined from 'arch_prepare_optimized_kprobe' at arch/powerpc/kernel/optprobes.c:209:21:
./arch/powerpc/include/asm/text-patching.h:232:13: error: 'strnlen' specified bound 512 exceeds source size 19 [-Werror=stringop-overread]
232 | if (strnlen(name, KSYM_NAME_LEN) >= KSYM_NAME_LEN)
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~
In function 'ppc_kallsyms_lookup_name',
inlined from 'arch_prepare_optimized_kprobe' at arch/powerpc/kernel/optprobes.c:210:22:
./arch/powerpc/include/asm/text-patching.h:232:13: error: 'strnlen' specified bound 512 exceeds source size 13 [-Werror=stringop-overread]
232 | if (strnlen(name, KSYM_NAME_LEN) >= KSYM_NAME_LEN)
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~
cc1: all warnings being treated as errors
The error can be reproduced in the following ways: Use lastest linux-next source, change ppc_kallsyms_lookup_name() to __always_inline, use default ppc64_defconfig, set CONFIG_EXPERT=y, CONFIG_PPC64_BIG_ENDIAN_ELF_ABI_V2=n, CONFIG_CC_OPTIMIZE_FOR_SIZE=y, and use gcc-14 or a later version for compilation. Since ppc_kallsyms_lookup_name() is called only twice in the kernel, and the parameters are all constant strins, simplify the implementation of ppc_kallsyms_lookup_name() and avoid calling strnlen(). Cc: Andy Shevchenko <redacted> Cc: Kees Cook <kees@kernel.org> Suggested-by: Christophe Leroy (CS GROUP) <chleroy@kernel.org> Signed-off-by: Xie Yuanbin <redacted> --- v1->v2: https://lore.kernel.org/20260205100517.292858-2-xieyuanbin1@huawei.com (local) - Not use strlen() arch/powerpc/include/asm/text-patching.h | 50 ++++++++---------------- 1 file changed, 17 insertions(+), 33 deletions(-)
diff --git a/arch/powerpc/include/asm/text-patching.h b/arch/powerpc/include/asm/text-patching.h
index e7f14720f630..2d3f698cb4f1 100644
--- a/arch/powerpc/include/asm/text-patching.h
+++ b/arch/powerpc/include/asm/text-patching.h@@ -221,39 +221,23 @@ static inline unsigned long ppc_global_function_entry(void *func) * - For ABIv1, we lookup the dot variant. * - For ABIv2, we return the local entry point. */ -static inline unsigned long ppc_kallsyms_lookup_name(const char *name) -{ - unsigned long addr; -#ifdef CONFIG_PPC64_ELF_ABI_V1 - /* check for dot variant */ - char dot_name[1 + KSYM_NAME_LEN]; - bool dot_appended = false; - - if (strnlen(name, KSYM_NAME_LEN) >= KSYM_NAME_LEN) - return 0; - - if (name[0] != '.') { - dot_name[0] = '.'; - dot_name[1] = '\0'; - strlcat(dot_name, name, sizeof(dot_name)); - dot_appended = true; - } else { - dot_name[0] = '\0'; - strlcat(dot_name, name, sizeof(dot_name)); - } - addr = kallsyms_lookup_name(dot_name); - if (!addr && dot_appended) - /* Let's try the original non-dot symbol lookup */ - addr = kallsyms_lookup_name(name); -#elif defined(CONFIG_PPC64_ELF_ABI_V2) - addr = kallsyms_lookup_name(name); - if (addr) - addr = ppc_function_entry((void *)addr); -#else - addr = kallsyms_lookup_name(name); -#endif - return addr; -} +static inline unsigned long __ppc_kallsyms_lookup_name(const char *name) +{ + unsigned long addr = kallsyms_lookup_name(name); + + if (IS_ENABLED(CONFIG_PPC64_ELF_ABI_V1) && !addr) + addr = kallsyms_lookup_name(name + 1); + if (IS_ENABLED(CONFIG_PPC64_ELF_ABI_V2) && addr) + addr = ppc_function_entry((void *)addr); + + return addr; +} + +#ifdef CONFIG_PPC64_ELF_ABI_V1 +#define ppc_kallsyms_lookup_name(x) __ppc_kallsyms_lookup_name("." x) +#else +#define ppc_kallsyms_lookup_name(x) __ppc_kallsyms_lookup_name(x) +#endif /* * Some instruction encodings commonly used in dynamic ftracing
--
2.53.0