From: Andrii Nakryiko andrii@kernel.org
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 --- kernel/trace/trace_kprobe.c | 24 ++++++++++++++++++++---- 1 file changed, 20 insertions(+), 4 deletions(-)
diff --git a/kernel/trace/trace_kprobe.c b/kernel/trace/trace_kprobe.c index 95c5b0668cb7..e834f149695b 100644 --- a/kernel/trace/trace_kprobe.c +++ b/kernel/trace/trace_kprobe.c @@ -714,14 +714,30 @@ static int count_symbols(void *data, unsigned long unused) return 0; }
+struct sym_count_ctx { + unsigned int count; + const char *name; +}; + +static int count_mod_symbols(void *data, const char *name, unsigned long unused) +{ + struct sym_count_ctx *ctx = data; + + if (strcmp(name, ctx->name) == 0) + ctx->count++; + + return 0; +} + static unsigned int number_of_same_symbols(char *func_name) { - unsigned int count; + struct sym_count_ctx ctx = { .count = 0, .name = func_name }; + + kallsyms_on_each_match_symbol(count_symbols, func_name, &ctx.count);
- count = 0; - kallsyms_on_each_match_symbol(count_symbols, func_name, &count); + module_kallsyms_on_each_symbol(NULL, count_mod_symbols, &ctx);
- return count; + return ctx.count; }
static int __trace_kprobe_create(int argc, const char *argv[])
Hi,
On Fri, 12 Apr 2024 13:54:20 +0200 Maxime MERE maxime.mere@foss.st.com wrote:
From: Andrii Nakryiko andrii@kernel.org
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/
I forgot to push this to probes/for-next. Thanks for finding. Let me pick.
Thank you,
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
kernel/trace/trace_kprobe.c | 24 ++++++++++++++++++++---- 1 file changed, 20 insertions(+), 4 deletions(-)
diff --git a/kernel/trace/trace_kprobe.c b/kernel/trace/trace_kprobe.c index 95c5b0668cb7..e834f149695b 100644 --- a/kernel/trace/trace_kprobe.c +++ b/kernel/trace/trace_kprobe.c @@ -714,14 +714,30 @@ static int count_symbols(void *data, unsigned long unused) return 0; } +struct sym_count_ctx {
- unsigned int count;
- const char *name;
+};
+static int count_mod_symbols(void *data, const char *name, unsigned long unused) +{
- struct sym_count_ctx *ctx = data;
- if (strcmp(name, ctx->name) == 0)
ctx->count++;
- return 0;
+}
static unsigned int number_of_same_symbols(char *func_name) {
- unsigned int count;
- struct sym_count_ctx ctx = { .count = 0, .name = func_name };
- kallsyms_on_each_match_symbol(count_symbols, func_name, &ctx.count);
- count = 0;
- kallsyms_on_each_match_symbol(count_symbols, func_name, &count);
- module_kallsyms_on_each_symbol(NULL, count_mod_symbols, &ctx);
- return count;
- return ctx.count;
} static int __trace_kprobe_create(int argc, const char *argv[]) -- 2.25.1
On Fri, 12 Apr 2024 22:29:20 +0900 Masami Hiramatsu (Google) mhiramat@kernel.org wrote:
Hi,
On Fri, 12 Apr 2024 13:54:20 +0200 Maxime MERE maxime.mere@foss.st.com wrote:
From: Andrii Nakryiko andrii@kernel.org
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/
I forgot to push this to probes/for-next. Thanks for finding. Let me pick.
Nevermind, I confused similar different patch[1]. This fix has been merged as commit 926fe783c8a6 ("tracing/kprobes: Fix symbol counting logic by looking at modules as well").
Thank you,
[1] https://patchwork.kernel.org/project/linux-trace-kernel/patch/169854904604.1...
Thank you,
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
kernel/trace/trace_kprobe.c | 24 ++++++++++++++++++++---- 1 file changed, 20 insertions(+), 4 deletions(-)
diff --git a/kernel/trace/trace_kprobe.c b/kernel/trace/trace_kprobe.c index 95c5b0668cb7..e834f149695b 100644 --- a/kernel/trace/trace_kprobe.c +++ b/kernel/trace/trace_kprobe.c @@ -714,14 +714,30 @@ static int count_symbols(void *data, unsigned long unused) return 0; } +struct sym_count_ctx {
- unsigned int count;
- const char *name;
+};
+static int count_mod_symbols(void *data, const char *name, unsigned long unused) +{
- struct sym_count_ctx *ctx = data;
- if (strcmp(name, ctx->name) == 0)
ctx->count++;
- return 0;
+}
static unsigned int number_of_same_symbols(char *func_name) {
- unsigned int count;
- struct sym_count_ctx ctx = { .count = 0, .name = func_name };
- kallsyms_on_each_match_symbol(count_symbols, func_name, &ctx.count);
- count = 0;
- kallsyms_on_each_match_symbol(count_symbols, func_name, &count);
- module_kallsyms_on_each_symbol(NULL, count_mod_symbols, &ctx);
- return count;
- return ctx.count;
} static int __trace_kprobe_create(int argc, const char *argv[]) -- 2.25.1
-- Masami Hiramatsu (Google) mhiramat@kernel.org
linux-stable-mirror@lists.linaro.org