From: Ian Rogers Date: Tue, 24 Jun 2025 19:03:24 +0000 (-0700) Subject: perf dso: With ref count checking, avoid dso_data holding dso live X-Git-Url: https://www.infradead.org/git/?a=commitdiff_plain;h=e793e2c0f188fb7a7998224f14241c0d87df5249;p=users%2Fjedix%2Flinux-maple.git perf dso: With ref count checking, avoid dso_data holding dso live With the dso_data embedded in a dso there is a reference counted pointer to the dso rather than using container_of with reference count checking. This data can hold the dso live meaning that no dso__put ever deletes it. Add a check for this case and close the dso_data when it happens. There isn't an infinite loop as the dso_data clears the file descriptor prior to putting on the dso. Signed-off-by: Ian Rogers Link: https://lore.kernel.org/r/20250624190326.2038704-5-irogers@google.com Signed-off-by: Namhyung Kim --- diff --git a/tools/perf/util/dso.c b/tools/perf/util/dso.c index 057fcf4225ac..c6c1637e098c 100644 --- a/tools/perf/util/dso.c +++ b/tools/perf/util/dso.c @@ -1612,6 +1612,10 @@ struct dso *dso__get(struct dso *dso) void dso__put(struct dso *dso) { +#ifdef REFCNT_CHECKING + if (dso && dso__data(dso) && refcount_read(&RC_CHK_ACCESS(dso)->refcnt) == 2) + dso__data_close(dso); +#endif if (dso && refcount_dec_and_test(&RC_CHK_ACCESS(dso)->refcnt)) dso__delete(dso); else