[PATCH v8 09/19] perf dsos: Ensure DSOs in auxtrace, machine, and symbol are in dsos
From: Ian Rogers
Date: Thu Oct 22 2026 - 16:21:15 EST
Place the DSOs created in addr_filter__resolve_syms(),
machine__process_ksymbol_register(), and maps__split_kallsyms() into a
dsos collection so that all DSOs that may have data fds opened or be
referenced by maps belong to a dsos collection.
Signed-off-by: Ian Rogers <irogers@xxxxxxxxxx>
---
tools/perf/util/auxtrace.c | 16 +++++++++++++---
tools/perf/util/machine.c | 4 ++++
tools/perf/util/symbol.c | 4 ++++
3 files changed, 21 insertions(+), 3 deletions(-)
diff --git a/tools/perf/util/auxtrace.c b/tools/perf/util/auxtrace.c
index f30f86156a3a..5fdbd77eb451 100644
--- a/tools/perf/util/auxtrace.c
+++ b/tools/perf/util/auxtrace.c
@@ -29,6 +29,7 @@
#include "config.h"
#include "evlist.h"
#include "dso.h"
+#include "dsos.h"
#include "map.h"
#include "pmu.h"
#include "evsel.h"
@@ -2684,7 +2685,7 @@ static int addr_filter__resolve_kernel_syms(struct addr_filter *filt)
return 0;
}
-static struct dso *load_dso(const char *name)
+static struct dso *load_dso(const char *name, struct dsos *dsos)
{
struct map *map;
struct dso *dso;
@@ -2693,6 +2694,11 @@ static struct dso *load_dso(const char *name)
if (!map)
return NULL;
+ if (dsos__add(dsos, map__dso(map))) {
+ map__put(map);
+ return NULL;
+ }
+
if (map__load(map) < 0)
pr_err("File '%s' not found or has no symbols.\n", name);
@@ -2794,6 +2800,7 @@ static int addr_filter__resolve_syms(struct addr_filter *filt)
{
u64 start, size;
struct dso *dso;
+ struct dsos dsos;
int err = 0;
if (!filt->sym_from && !filt->sym_to)
@@ -2802,9 +2809,11 @@ static int addr_filter__resolve_syms(struct addr_filter *filt)
if (!filt->filename)
return addr_filter__resolve_kernel_syms(filt);
- dso = load_dso(filt->filename);
+ dsos__init(&dsos);
+ dso = load_dso(filt->filename, &dsos);
if (!dso) {
pr_err("Failed to load symbols from: %s\n", filt->filename);
+ dsos__exit(&dsos);
return -EINVAL;
}
@@ -2831,13 +2840,14 @@ static int addr_filter__resolve_syms(struct addr_filter *filt)
err = check_end_after_start(filt, start, size);
if (err)
- return err;
+ goto put_dso;
filt->size = start + size - filt->addr;
}
put_dso:
dso__put(dso);
+ dsos__exit(&dsos);
return err;
}
diff --git a/tools/perf/util/machine.c b/tools/perf/util/machine.c
index cb77e82ed842..5135ecfa0467 100644
--- a/tools/perf/util/machine.c
+++ b/tools/perf/util/machine.c
@@ -775,6 +775,10 @@ static int machine__process_ksymbol_register(struct machine *machine,
dso__set_long_name(dso, "", false);
}
+ err = dsos__add(&machine->dsos, dso);
+ if (err)
+ goto out;
+
map__set_start(map, event->ksymbol.addr);
map__set_end(map, map__start(map) + event->ksymbol.len);
err = maps__fixup_overlap_and_insert(machine__kernel_maps(machine), map);
diff --git a/tools/perf/util/symbol.c b/tools/perf/util/symbol.c
index b61a574ce9a3..686fc48841c6 100644
--- a/tools/perf/util/symbol.c
+++ b/tools/perf/util/symbol.c
@@ -1090,6 +1090,10 @@ static int maps__split_kallsyms(struct maps *kmaps, struct dso *dso, u64 delta,
dso__set_symtab_type(ndso, DSO_BINARY_TYPE__KALLSYMS);
}
dso__set_loaded(ndso);
+ if (dsos__add(&machine->dsos, ndso)) {
+ dso__put(ndso);
+ return -1;
+ }
curr_map = map__new2(pos->start, ndso);
if (curr_map == NULL) {
--
2.56.0.307.g5fe7bd680c-goog