diff --git a/tools/perf/builtin-record.c b/tools/perf/builtin-record.c index 22ebeb92ac51d9d0f60b26772e44f427e284c230..44e8fff2ea1cea144117ea2de5b4317843e01e4c 100644 --- a/tools/perf/builtin-record.c +++ b/tools/perf/builtin-record.c @@ -1132,7 +1132,7 @@ static int __cmd_record(struct record *rec, int argc, const char **argv) */ if (done && !disabled && !target__none(&opts->target)) { trigger_off(&auxtrace_snapshot_trigger); - perf_evlist__disable(rec->evlist); + perf_evlist__terminate(rec->evlist); disabled = true; } } diff --git a/tools/perf/util/evlist.c b/tools/perf/util/evlist.c index 819aa4491b534072cfebf69cded6fa4478d37510..18c61f77cc2c149415316943fbd2cda50f9470a8 100644 --- a/tools/perf/util/evlist.c +++ b/tools/perf/util/evlist.c @@ -357,6 +357,20 @@ static int perf_evlist__nr_threads(struct perf_evlist *evlist, return thread_map__nr(evlist->threads); } +void perf_evlist__terminate(struct perf_evlist *evlist) +{ + struct perf_evsel *pos; + + evlist__for_each_entry(evlist, pos) { + if (!perf_evsel__is_group_leader(pos) || !pos->fd) + continue; + perf_evsel__disable(pos); + pos->terminated = true; + } + + evlist->enabled = false; +} + void perf_evlist__disable(struct perf_evlist *evlist) { struct perf_evsel *pos; diff --git a/tools/perf/util/evlist.h b/tools/perf/util/evlist.h index dc66436add98a3c795efa3ddf0889f09f1d7abe3..a7722cc4e7d27d4f6abeb265a49d959ca3209797 100644 --- a/tools/perf/util/evlist.h +++ b/tools/perf/util/evlist.h @@ -168,6 +168,7 @@ void perf_evlist__munmap(struct perf_evlist *evlist); size_t perf_evlist__mmap_size(unsigned long pages); +void perf_evlist__terminate(struct perf_evlist *evlist); void perf_evlist__disable(struct perf_evlist *evlist); void perf_evlist__enable(struct perf_evlist *evlist); void perf_evlist__toggle_enable(struct perf_evlist *evlist); diff --git a/tools/perf/util/evsel.h b/tools/perf/util/evsel.h index 163c960614d336a62f943e2ccd2e4663e973a0ab..feec6bf22a4091319d63dc9984c1180db3de1e2c 100644 --- a/tools/perf/util/evsel.h +++ b/tools/perf/util/evsel.h @@ -146,6 +146,7 @@ struct perf_evsel { bool collect_stat; bool weak_group; const char *pmu_name; + bool terminated; }; union u64_swap {