Skip to content

Commit 926fe78

Browse files
anakryikomhiramat
authored andcommitted
tracing/kprobes: Fix symbol counting logic by looking at modules as well
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/[email protected]/ Cc: Francis Laniel <[email protected]> Cc: [email protected] Cc: Masami Hiramatsu <[email protected]> Cc: Steven Rostedt <[email protected]> Fixes: b022f0c ("tracing/kprobes: Return EADDRNOTAVAIL when func matches several symbols") Signed-off-by: Andrii Nakryiko <[email protected]> Acked-by: Song Liu <[email protected]> Signed-off-by: Masami Hiramatsu (Google) <[email protected]>
1 parent e0f8318 commit 926fe78

File tree

1 file changed

+20
-4
lines changed

1 file changed

+20
-4
lines changed

kernel/trace/trace_kprobe.c

Lines changed: 20 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -714,14 +714,30 @@ static int count_symbols(void *data, unsigned long unused)
714714
return 0;
715715
}
716716

717+
struct sym_count_ctx {
718+
unsigned int count;
719+
const char *name;
720+
};
721+
722+
static int count_mod_symbols(void *data, const char *name, unsigned long unused)
723+
{
724+
struct sym_count_ctx *ctx = data;
725+
726+
if (strcmp(name, ctx->name) == 0)
727+
ctx->count++;
728+
729+
return 0;
730+
}
731+
717732
static unsigned int number_of_same_symbols(char *func_name)
718733
{
719-
unsigned int count;
734+
struct sym_count_ctx ctx = { .count = 0, .name = func_name };
735+
736+
kallsyms_on_each_match_symbol(count_symbols, func_name, &ctx.count);
720737

721-
count = 0;
722-
kallsyms_on_each_match_symbol(count_symbols, func_name, &count);
738+
module_kallsyms_on_each_symbol(NULL, count_mod_symbols, &ctx);
723739

724-
return count;
740+
return ctx.count;
725741
}
726742

727743
static int __trace_kprobe_create(int argc, const char *argv[])

0 commit comments

Comments
 (0)