]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
perf record: Make sure to update build-ID cache
authorNamhyung Kim <namhyung@kernel.org>
Thu, 6 Nov 2025 19:00:23 +0000 (11:00 -0800)
committerNamhyung Kim <namhyung@kernel.org>
Fri, 7 Nov 2025 01:29:16 +0000 (17:29 -0800)
Recent change on enabling --buildid-mmap by default brought an issue
with build-id handling.  With build-ID in MMAP2 records, we don't need
to save the build-ID table in the header of a perf data file.

But the actual file contents still need to be cached in the debug
directory for annotation etc.  Split the build-ID header processing and
caching and make sure perf record to save hit DSOs in the build-ID cache
by moving perf_session__cache_build_ids() to the end of the record__
finish_output().

Reviewed-by: Ian Rogers <irogers@google.com>
Signed-off-by: Namhyung Kim <namhyung@kernel.org>
tools/perf/builtin-record.c
tools/perf/util/header.c

index ffb94a8339b03ec2edf31aa9b61bcec193dd4e07..fe10bb7f35cbea05cd146e4321e032995bde3531 100644 (file)
@@ -1890,15 +1890,14 @@ record__finish_output(struct record *rec)
        }
 
        /* Buildid scanning disabled or build ID in kernel and synthesized map events. */
-       if (!rec->no_buildid) {
+       if (!rec->no_buildid || !rec->no_buildid_cache) {
                process_buildids(rec);
 
                if (rec->buildid_all)
                        perf_session__dsos_hit_all(rec->session);
        }
        perf_session__write_header(rec->session, rec->evlist, fd, true);
-
-       return;
+       perf_session__cache_build_ids(rec->session);
 }
 
 static int record__synthesize_workload(struct record *rec, bool tail)
@@ -3083,7 +3082,7 @@ static int perf_record_config(const char *var, const char *value, void *cb)
                else if (!strcmp(value, "no-cache"))
                        rec->no_buildid_cache = true;
                else if (!strcmp(value, "skip"))
-                       rec->no_buildid = true;
+                       rec->no_buildid = rec->no_buildid_cache = true;
                else if (!strcmp(value, "mmap"))
                        rec->buildid_mmap = true;
                else if (!strcmp(value, "no-mmap"))
@@ -4192,24 +4191,25 @@ 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) {
                /* Enable perf_event_attr::build_id bit. */
                rec->opts.build_id = true;
+               /* Disable build-ID table in the header. */
+               rec->no_buildid = true;
+       } else {
+               pr_debug("Disabling build id in synthesized mmap2 events.\n");
+               symbol_conf.no_buildid_mmap2 = true;
+       }
+
+       if (rec->no_buildid_set && rec->no_buildid) {
+               /* -B implies -N for historic reasons. */
+               rec->no_buildid_cache = true;
        }
 
        if (rec->opts.record_cgroup && !perf_can_record_cgroup()) {
@@ -4306,7 +4306,7 @@ int cmd_record(int argc, const char **argv)
 
        err = -ENOMEM;
 
-       if (rec->no_buildid_cache || rec->no_buildid) {
+       if (rec->no_buildid_cache) {
                disable_buildid_cache();
        } else if (rec->switch_output.enabled) {
                /*
index 4f2a6e10ed5cc0bd63213e04e28e8ecb4cf7053e..4de7ca16b5522c47cb528f966b3fe3847bad7fd0 100644 (file)
@@ -335,7 +335,6 @@ static int write_build_id(struct feat_fd *ff,
                pr_debug("failed to write buildid table\n");
                return err;
        }
-       perf_session__cache_build_ids(session);
 
        return 0;
 }