]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
perf: Extract is_ignored_kernel_symbol() for kernel mapping symbol filtering
authorRui Qi <qirui.001@bytedance.com>
Fri, 22 May 2026 08:26:03 +0000 (16:26 +0800)
committerArnaldo Carvalho de Melo <acme@redhat.com>
Wed, 27 May 2026 11:14:37 +0000 (08:14 -0300)
Mapping symbol filtering is scattered across multiple files with
inconsistent checks.  The kernel's own is_mapping_symbol() covers x86
local symbols ('.L*' and 'L0*') on top of the '$' prefix used by
ARM/AArch64/RISC-V, but the perf tool only checks '$'.

Extract is_ignored_kernel_symbol() into symbol.h matching the kernel
definition, and convert the kallsyms and ksymbol event paths to use it.
Add ksymbol event name validation and early mapping symbol filtering
before any state mutation.

Signed-off-by: Rui Qi <qirui.001@bytedance.com>
Acked-by: Namhyung Kim <namhyung@kernel.org>
Cc: Adrian Hunter <adrian.hunter@intel.com>
Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com>
Cc: Ian Rogers <irogers@google.com>
Cc: Ingo Molnar <mingo@redhat.com>
Cc: James Clark <james.clark@linaro.org>
Cc: Jiri Olsa <jolsa@kernel.org>
Cc: Mark Rutland <mark.rutland@arm.com>
Cc: Peter Zijlstra <peterz@infradead.org>
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
tools/perf/util/machine.c
tools/perf/util/symbol.c
tools/perf/util/symbol.h

index c2e0a99efe97dd3db8c62fedf915cb05a0e34305..e5d1e8b882a91f76cce226c1efda098b4c22573f 100644 (file)
@@ -4,6 +4,7 @@
 #include <inttypes.h>
 #include <regex.h>
 #include <stdlib.h>
+#include <string.h>
 #include "callchain.h"
 #include "debug.h"
 #include "dso.h"
@@ -729,9 +730,15 @@ static int machine__process_ksymbol_register(struct machine *machine,
 {
        struct symbol *sym;
        struct dso *dso = NULL;
-       struct map *map = maps__find(machine__kernel_maps(machine), event->ksymbol.addr);
+       struct map *map;
        int err = 0;
 
+       /* Ignore mapping symbols in ksymbol events - check early before any state mutation */
+       if (is_ignored_kernel_symbol(event->ksymbol.name))
+               return 0;
+
+       map = maps__find(machine__kernel_maps(machine), event->ksymbol.addr);
+
        if (!map) {
                dso = dso__new(event->ksymbol.name);
 
@@ -790,6 +797,10 @@ static int machine__process_ksymbol_unregister(struct machine *machine,
        struct symbol *sym;
        struct map *map;
 
+       /* Ignore mapping symbols in ksymbol events */
+       if (is_ignored_kernel_symbol(event->ksymbol.name))
+               return 0;
+
        map = maps__find(machine__kernel_maps(machine), event->ksymbol.addr);
        if (!map)
                return 0;
@@ -814,6 +825,11 @@ int machine__process_ksymbol(struct machine *machine __maybe_unused,
        if (dump_trace)
                perf_event__fprintf_ksymbol(event, stdout);
 
+       if (event->header.size < offsetof(struct perf_record_ksymbol, name) + 2 ||
+           !memchr(event->ksymbol.name, '\0',
+                   event->header.size - offsetof(struct perf_record_ksymbol, name)))
+               return -EINVAL;
+
        /* no need to process non-JIT BPF as it cannot get samples */
        if (event->ksymbol.len == 0)
                return 0;
index fcaeeddbbb6b98455b93a0e3f5c987f7baec5c3b..714b6e6048fa2f95dc2c8d2ca190b2a114e74982 100644 (file)
@@ -770,8 +770,8 @@ static int map__process_kallsym_symbol(void *arg, const char *name,
        if (!symbol_type__filter(type))
                return 0;
 
-       /* Ignore local symbols for ARM modules */
-       if (name[0] == '$')
+       /* Ignore mapping symbols in kallsyms */
+       if (is_ignored_kernel_symbol(name))
                return 0;
 
        /*
index bd6eb90c86683762c7dbe4139053b78b5f8d5e65..95592779eb77cecdb11e56907c09df8336b6e620 100644 (file)
@@ -28,6 +28,21 @@ struct maps;
 struct option;
 struct build_id;
 
+/*
+ * Ignore kernel mapping symbols, matching kernel is_mapping_symbol() logic.
+ * This checks for '$' prefix (used by ARM, AArch64, RISC-V) and
+ * x86 local symbol prefixes (.L* and L0*).
+ * Only use this for kernel symbols (kallsyms, ksymbol events, kernel ELF DSOs).
+ */
+static inline bool is_ignored_kernel_symbol(const char *str)
+{
+       if (str[0] == '.' && str[1] == 'L')
+               return true;
+       if (str[0] == 'L' && str[1] == '0')
+               return true;
+       return str[0] == '$';
+}
+
 /*
  * libelf 0.8.x and earlier do not support ELF_C_READ_MMAP;
  * for newer versions we can use mmap to reduce memory usage: