libperf evsel: Add missed puts and asserts
authorIan Rogers <irogers@google.com>
Tue, 17 Jun 2025 22:33:56 +0000 (15:33 -0700)
committerNamhyung Kim <namhyung@kernel.org>
Tue, 24 Jun 2025 17:27:51 +0000 (10:27 -0700)
A missed evsel__close before evsel__delete was the source of leaking
perf events due to a hybrid test. Add asserts in debug builds so that
this shouldn't happen in the future. Add puts missing on the cpu map
and thread maps.

Signed-off-by: Ian Rogers <irogers@google.com>
Link: https://lore.kernel.org/r/20250617223356.2752099-4-irogers@google.com
Signed-off-by: Namhyung Kim <namhyung@kernel.org>
tools/lib/perf/evsel.c

index c475319e2e410d31d072d81afb9e6277b16ef1f1..2a85e0bfee1e49e9ae55c8777c11c514de32f1d0 100644 (file)
@@ -42,6 +42,12 @@ struct perf_evsel *perf_evsel__new(struct perf_event_attr *attr)
 
 void perf_evsel__delete(struct perf_evsel *evsel)
 {
+       assert(evsel->fd == NULL);  /* If not fds were not closed. */
+       assert(evsel->mmap == NULL); /* If not munmap wasn't called. */
+       assert(evsel->sample_id == NULL); /* If not free_id wasn't called. */
+       perf_cpu_map__put(evsel->cpus);
+       perf_cpu_map__put(evsel->own_cpus);
+       perf_thread_map__put(evsel->threads);
        free(evsel);
 }