This backports the fix to the kprobe_events interface allowing to create kprobes on symbols defined in loadable modules again. The backport is simpler than ones for later kernels, since the backport of the commit introducing the bug already brought along much of the code needed to fix it.
Andrii Nakryiko (1): tracing/kprobes: Fix symbol counting logic by looking at modules as well
Jiri Olsa (1): kallsyms: Make module_kallsyms_on_each_symbol generally available
include/linux/module.h | 9 +++++++++ kernel/module.c | 2 -- kernel/trace/trace_kprobe.c | 2 ++ 3 files changed, 11 insertions(+), 2 deletions(-)
From: Jiri Olsa jolsa@kernel.org
commit 73feb8d5fa3b755bb51077c0aabfb6aa556fd498 upstream.
Making module_kallsyms_on_each_symbol generally available, so it can be used outside CONFIG_LIVEPATCH option in following changes.
Rather than adding another ifdef option let's make the function generally available (when CONFIG_KALLSYMS and CONFIG_MODULES options are defined).
Cc: Christoph Hellwig hch@lst.de Acked-by: Song Liu song@kernel.org Signed-off-by: Jiri Olsa jolsa@kernel.org Link: https://lore.kernel.org/r/20221025134148.3300700-2-jolsa@kernel.org Signed-off-by: Alexei Starovoitov ast@kernel.org Signed-off-by: Greg Kroah-Hartman gregkh@linuxfoundation.org Stable-dep-of: 926fe783c8a6 ("tracing/kprobes: Fix symbol counting logic by looking at modules as well") Signed-off-by: Markus Boehme markubo@amazon.com --- include/linux/module.h | 9 +++++++++ kernel/module.c | 2 -- 2 files changed, 9 insertions(+), 2 deletions(-)
diff --git a/include/linux/module.h b/include/linux/module.h index c9f1200b2312..701c150485b2 100644 --- a/include/linux/module.h +++ b/include/linux/module.h @@ -867,8 +867,17 @@ static inline bool module_sig_ok(struct module *module) } #endif /* CONFIG_MODULE_SIG */
+#if defined(CONFIG_MODULES) && defined(CONFIG_KALLSYMS) int module_kallsyms_on_each_symbol(int (*fn)(void *, const char *, struct module *, unsigned long), void *data); +#else +static inline int module_kallsyms_on_each_symbol(int (*fn)(void *, const char *, + struct module *, unsigned long), + void *data) +{ + return -EOPNOTSUPP; +} +#endif /* CONFIG_MODULES && CONFIG_KALLSYMS */
#endif /* _LINUX_MODULE_H */ diff --git a/kernel/module.c b/kernel/module.c index 3c90840133c0..ba9f2bb57889 100644 --- a/kernel/module.c +++ b/kernel/module.c @@ -4482,7 +4482,6 @@ unsigned long module_kallsyms_lookup_name(const char *name) return ret; }
-#ifdef CONFIG_LIVEPATCH int module_kallsyms_on_each_symbol(int (*fn)(void *, const char *, struct module *, unsigned long), void *data) @@ -4514,7 +4513,6 @@ int module_kallsyms_on_each_symbol(int (*fn)(void *, const char *, mutex_unlock(&module_mutex); return ret; } -#endif /* CONFIG_LIVEPATCH */ #endif /* CONFIG_KALLSYMS */
static void cfi_init(struct module *mod)
From: Andrii Nakryiko andrii@kernel.org
commit 926fe783c8a64b33997fec405cf1af3e61aed441 upstream.
Recent changes to count number of matching symbols when creating a kprobe event failed to take into account kernel modules. As such, it breaks kprobes on kernel module symbols, by assuming there is no match.
Fix this my calling module_kallsyms_on_each_symbol() in addition to kallsyms_on_each_match_symbol() to perform a proper counting.
Link: https://lore.kernel.org/all/20231027233126.2073148-1-andrii@kernel.org/
Cc: Francis Laniel flaniel@linux.microsoft.com Cc: stable@vger.kernel.org Cc: Masami Hiramatsu mhiramat@kernel.org Cc: Steven Rostedt rostedt@goodmis.org Fixes: b022f0c7e404 ("tracing/kprobes: Return EADDRNOTAVAIL when func matches several symbols") Signed-off-by: Andrii Nakryiko andrii@kernel.org Acked-by: Song Liu song@kernel.org Signed-off-by: Masami Hiramatsu (Google) mhiramat@kernel.org Signed-off-by: Markus Boehme markubo@amazon.com --- kernel/trace/trace_kprobe.c | 2 ++ 1 file changed, 2 insertions(+)
diff --git a/kernel/trace/trace_kprobe.c b/kernel/trace/trace_kprobe.c index 1c565db2de7b..21aef22a8489 100644 --- a/kernel/trace/trace_kprobe.c +++ b/kernel/trace/trace_kprobe.c @@ -735,6 +735,8 @@ static unsigned int number_of_same_symbols(char *func_name)
kallsyms_on_each_symbol(count_symbols, &args);
+ module_kallsyms_on_each_symbol(count_symbols, &args); + return args.count; }
On Thu, Jan 11, 2024 at 10:43:52PM +0100, Markus Boehme wrote:
This backports the fix to the kprobe_events interface allowing to create kprobes on symbols defined in loadable modules again. The backport is simpler than ones for later kernels, since the backport of the commit introducing the bug already brought along much of the code needed to fix it.
Andrii Nakryiko (1): tracing/kprobes: Fix symbol counting logic by looking at modules as well
Jiri Olsa (1): kallsyms: Make module_kallsyms_on_each_symbol generally available
include/linux/module.h | 9 +++++++++ kernel/module.c | 2 -- kernel/trace/trace_kprobe.c | 2 ++ 3 files changed, 11 insertions(+), 2 deletions(-)
-- 2.40.1
Now queued up, thanks.
greg k-h
linux-stable-mirror@lists.linaro.org