]> www.infradead.org Git - users/willy/xarray.git/commitdiff
perf record: Make --buildid-mmap the default
authorIan Rogers <irogers@google.com>
Thu, 24 Jul 2025 16:32:48 +0000 (09:32 -0700)
committerNamhyung Kim <namhyung@kernel.org>
Fri, 25 Jul 2025 17:37:56 +0000 (10:37 -0700)
Support for build IDs in mmap2 perf events has been present since
Linux v5.12:
https://lore.kernel.org/lkml/20210219194619.1780437-1-acme@kernel.org/
Build ID mmap events don't avoid the need to inject build IDs for DSO
touched by samples as the build ID cache is populated by perf
record. They can avoid some cases of symbol mis-resolution caused by
the file system changing from when a sample occurred and when the DSO
is sought.

Unlike the --buildid-mmap option, this chnage doesn't disable the
build ID cache but it does disable the processing of samples looking
for DSOs to inject build IDs for. To disable the build ID cache the -B
(--no-buildid) option should be used.

Making this option the default was raised on the list in:
https://lore.kernel.org/linux-perf-users/CAP-5=fXP7jN_QrGUcd55_QH5J-Y-FCaJ6=NaHVtyx0oyNh8_-Q@mail.gmail.com/

Signed-off-by: Ian Rogers <irogers@google.com>
Link: https://lore.kernel.org/r/20250724163302.596743-9-irogers@google.com
Signed-off-by: Namhyung Kim <namhyung@kernel.org>
tools/perf/Documentation/perf-record.txt
tools/perf/builtin-record.c
tools/perf/util/symbol_conf.h
tools/perf/util/synthetic-events.c

index 612612fa2d8041b94860035ed9cb01557a20b6b7..067891bd7da6edc8771507b08c5a66d96f5650b6 100644 (file)
@@ -563,7 +563,9 @@ Specify vmlinux path which has debuginfo.
 Record build-id of all DSOs regardless whether it's actually hit or not.
 
 --buildid-mmap::
-Record build ids in mmap2 events, disables build id cache (implies --no-buildid).
+Legacy record build-id in map events option which is now the
+default. Behaves indentically to --no-buildid. Disable with
+--no-buildid-mmap.
 
 --aio[=n]::
 Use <n> control blocks in asynchronous (Posix AIO) trace writing mode (default: 1, max: 4).
index 53971b9de3ba603948936118f60dc54b8aaf5fc3..a59c4e15575c34b03f914865635392a315b04fe3 100644 (file)
@@ -171,6 +171,7 @@ struct record {
        bool                    no_buildid_cache_set;
        bool                    buildid_all;
        bool                    buildid_mmap;
+       bool                    buildid_mmap_set;
        bool                    timestamp_filename;
        bool                    timestamp_boundary;
        bool                    off_cpu;
@@ -1811,6 +1812,7 @@ record__finish_output(struct record *rec)
                        data->dir.files[i].size = lseek(data->dir.files[i].fd, 0, SEEK_CUR);
        }
 
+       /* Buildid scanning disabled or build ID in kernel and synthesized map events. */
        if (!rec->no_buildid) {
                process_buildids(rec);
 
@@ -3005,6 +3007,8 @@ static int perf_record_config(const char *var, const char *value, void *cb)
                        rec->no_buildid = true;
                else if (!strcmp(value, "mmap"))
                        rec->buildid_mmap = true;
+               else if (!strcmp(value, "no-mmap"))
+                       rec->buildid_mmap = false;
                else
                        return -1;
                return 0;
@@ -3411,6 +3415,7 @@ static struct record record = {
                .synth               = PERF_SYNTH_ALL,
                .off_cpu_thresh_ns   = OFFCPU_THRESH,
        },
+       .buildid_mmap = true,
 };
 
 const char record_callchain_help[] = CALLCHAIN_RECORD_HELP
@@ -3577,8 +3582,8 @@ static struct option __record_options[] = {
                   "file", "vmlinux pathname"),
        OPT_BOOLEAN(0, "buildid-all", &record.buildid_all,
                    "Record build-id of all DSOs regardless of hits"),
-       OPT_BOOLEAN(0, "buildid-mmap", &record.buildid_mmap,
-                   "Record build-id in map events"),
+       OPT_BOOLEAN_SET(0, "buildid-mmap", &record.buildid_mmap, &record.buildid_mmap_set,
+                       "Record build-id in mmap events and skip build-id processing."),
        OPT_BOOLEAN(0, "timestamp-filename", &record.timestamp_filename,
                    "append timestamp to output filename"),
        OPT_BOOLEAN(0, "timestamp-boundary", &record.timestamp_boundary,
@@ -4108,19 +4113,24 @@ int cmd_record(int argc, const char **argv)
                record.opts.record_switch_events = true;
        }
 
+       if (!rec->buildid_mmap) {
+               pr_debug("Disabling build id in synthesized mmap2 events.\n");
+               symbol_conf.no_buildid_mmap2 = true;
+       } else if (rec->buildid_mmap_set) {
+               /*
+                * Explicitly passing --buildid-mmap disables buildid processing
+                * and cache generation.
+                */
+               rec->no_buildid = true;
+       }
+       if (rec->buildid_mmap && !perf_can_record_build_id()) {
+               pr_warning("Missing support for build id in kernel mmap events.\n"
+                          "Disable this warning with --no-buildid-mmap\n");
+               rec->buildid_mmap = false;
+       }
        if (rec->buildid_mmap) {
-               if (!perf_can_record_build_id()) {
-                       pr_err("Failed: no support to record build id in mmap events, update your kernel.\n");
-                       err = -EINVAL;
-                       goto out_opts;
-               }
-               pr_debug("Enabling build id in mmap2 events.\n");
-               /* Enable mmap build id synthesizing. */
-               symbol_conf.buildid_mmap2 = true;
                /* Enable perf_event_attr::build_id bit. */
                rec->opts.build_id = true;
-               /* Disable build id cache. */
-               rec->no_buildid = true;
        }
 
        if (rec->opts.record_cgroup && !perf_can_record_cgroup()) {
index cd9aa82c7d5ad941d74407c35e033010cf1c9cab..7a80d2c14d9b708556d1c1d8b6085577fa1e094e 100644 (file)
@@ -43,7 +43,7 @@ struct symbol_conf {
                        report_individual_block,
                        inline_name,
                        disable_add2line_warn,
-                       buildid_mmap2,
+                       no_buildid_mmap2,
                        guest_code,
                        lazy_load_kernel_maps,
                        keep_exited_threads,
index 3b1240c82b303d0f59cab2e7a78b655c2fc2a854..e7ca3f5eb4930c953ec9b4924772f81ff6ddc96b 100644 (file)
@@ -532,7 +532,7 @@ out:
                event->mmap2.pid = tgid;
                event->mmap2.tid = pid;
 
-               if (symbol_conf.buildid_mmap2)
+               if (!symbol_conf.no_buildid_mmap2)
                        perf_record_mmap2__read_build_id(&event->mmap2, machine, false);
 
                if (perf_tool__process_synth_event(tool, event, machine, process) != 0) {
@@ -690,7 +690,7 @@ static int perf_event__synthesize_modules_maps_cb(struct map *map, void *data)
                return 0;
 
        dso = map__dso(map);
-       if (symbol_conf.buildid_mmap2) {
+       if (!symbol_conf.no_buildid_mmap2) {
                size = PERF_ALIGN(dso__long_name_len(dso) + 1, sizeof(u64));
                event->mmap2.header.type = PERF_RECORD_MMAP2;
                event->mmap2.header.size = (sizeof(event->mmap2) -
@@ -734,9 +734,9 @@ int perf_event__synthesize_modules(const struct perf_tool *tool, perf_event__han
                .process = process,
                .machine = machine,
        };
-       size_t size = symbol_conf.buildid_mmap2
-               ? sizeof(args.event->mmap2)
-               : sizeof(args.event->mmap);
+       size_t size = symbol_conf.no_buildid_mmap2
+               ? sizeof(args.event->mmap)
+               : sizeof(args.event->mmap2);
 
        args.event = zalloc(size + machine->id_hdr_size);
        if (args.event == NULL) {
@@ -1124,8 +1124,8 @@ static int __perf_event__synthesize_kernel_mmap(const struct perf_tool *tool,
                                                struct machine *machine)
 {
        union perf_event *event;
-       size_t size = symbol_conf.buildid_mmap2 ?
-                       sizeof(event->mmap2) : sizeof(event->mmap);
+       size_t size = symbol_conf.no_buildid_mmap2 ?
+                       sizeof(event->mmap) : sizeof(event->mmap2);
        struct map *map = machine__kernel_map(machine);
        struct kmap *kmap;
        int err;
@@ -1159,7 +1159,7 @@ static int __perf_event__synthesize_kernel_mmap(const struct perf_tool *tool,
                event->header.misc = PERF_RECORD_MISC_GUEST_KERNEL;
        }
 
-       if (symbol_conf.buildid_mmap2) {
+       if (!symbol_conf.no_buildid_mmap2) {
                size = snprintf(event->mmap2.filename, sizeof(event->mmap2.filename),
                                "%s%s", machine->mmap_name, kmap->ref_reloc_sym->name) + 1;
                size = PERF_ALIGN(size, sizeof(u64));