From 2f9c0452ca4406b9b83bafe4ab82b4ff7888dd21 Mon Sep 17 00:00:00 2001 From: Wei Li Date: Mon, 25 Nov 2019 10:58:10 +0800 Subject: [PATCH] perf tools: add perf_evlist__terminate() for terminate hulk inclusion category: bugfix bugzilla: 24005 CVE: NA ------------------------------------------- In __cmd_record(), when receiving SIGINT(ctrl + c), a done flag will be set and the event list will be disabled by perf_evlist__disable() once. While in auxtrace_record.read_finish(), the related events will be enabled again, if they are continuous, the recording seems to be endless. Mark the evlist's state as terminated, preparing for the following fix. Signed-off-by: Wei Li Reviewed-by: Xuefeng Wang Reviewed-by: Tan Xiaojun Signed-off-by: Yang Yingliang --- tools/perf/builtin-record.c | 2 +- tools/perf/util/evlist.c | 14 ++++++++++++++ tools/perf/util/evlist.h | 1 + tools/perf/util/evsel.h | 1 + 4 files changed, 17 insertions(+), 1 deletion(-) diff --git a/tools/perf/builtin-record.c b/tools/perf/builtin-record.c index 22ebeb92ac51..44e8fff2ea1c 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 819aa4491b53..18c61f77cc2c 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 dc66436add98..a7722cc4e7d2 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 163c960614d3..feec6bf22a40 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 { -- GitLab