OSDN Git Service

perf tools: Save evsel->pmu in parse_events()
authorNamhyung Kim <namhyung@kernel.org>
Tue, 18 Oct 2022 02:02:08 +0000 (19:02 -0700)
committerArnaldo Carvalho de Melo <acme@redhat.com>
Thu, 27 Oct 2022 19:37:25 +0000 (16:37 -0300)
Now evsel has a pmu pointer, let's save the info and use it like in
evsel__find_pmu().  The missing feature check needs to be changed as the
pmu pointer can be set from the beginning.

Signed-off-by: Namhyung Kim <namhyung@kernel.org>
Acked-by: Ian Rogers <irogers@google.com>
Cc: Adrian Hunter <adrian.hunter@intel.com>
Cc: Andi Kleen <ak@linux.intel.com>
Cc: Athira Jajeev <atrajeev@linux.vnet.ibm.com>
Cc: Ingo Molnar <mingo@kernel.org>
Cc: James Clark <james.clark@arm.com>
Cc: Jiri Olsa <jolsa@kernel.org>
Cc: Kan Liang <kan.liang@linux.intel.com>
Cc: Leo Yan <leo.yan@linaro.org>
Cc: Michael Petlan <mpetlan@redhat.com>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Xing Zhengjun <zhengjun.xing@linux.intel.com>
Link: https://lore.kernel.org/r/20221018020227.85905-2-namhyung@kernel.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
tools/perf/util/evsel.c
tools/perf/util/parse-events.c
tools/perf/util/pmu.c

index 76605fd..b7140be 100644 (file)
@@ -467,6 +467,7 @@ struct evsel *evsel__clone(struct evsel *orig)
        evsel->collect_stat = orig->collect_stat;
        evsel->weak_group = orig->weak_group;
        evsel->use_config_name = orig->use_config_name;
+       evsel->pmu = orig->pmu;
 
        if (evsel__copy_config_terms(evsel, orig) < 0)
                goto out_err;
@@ -1966,17 +1967,16 @@ bool evsel__detect_missing_features(struct evsel *evsel)
                perf_missing_features.mmap2 = true;
                pr_debug2_peo("switching off mmap2\n");
                return true;
-       } else if ((evsel->core.attr.exclude_guest || evsel->core.attr.exclude_host) &&
-                  (evsel->pmu == NULL || evsel->pmu->missing_features.exclude_guest)) {
-               if (evsel->pmu == NULL) {
+       } else if (evsel->core.attr.exclude_guest || evsel->core.attr.exclude_host) {
+               if (evsel->pmu == NULL)
                        evsel->pmu = evsel__find_pmu(evsel);
-                       if (evsel->pmu)
-                               evsel->pmu->missing_features.exclude_guest = true;
-                       else {
-                               /* we cannot find PMU, disable attrs now */
-                               evsel->core.attr.exclude_host = false;
-                               evsel->core.attr.exclude_guest = false;
-                       }
+
+               if (evsel->pmu)
+                       evsel->pmu->missing_features.exclude_guest = true;
+               else {
+                       /* we cannot find PMU, disable attrs now */
+                       evsel->core.attr.exclude_host = false;
+                       evsel->core.attr.exclude_guest = false;
                }
 
                if (evsel->exclude_GH) {
index 5973f46..6502cd6 100644 (file)
@@ -266,6 +266,7 @@ __add_event(struct list_head *list, int *idx,
        evsel->core.own_cpus = perf_cpu_map__get(cpus);
        evsel->core.requires_cpu = pmu ? pmu->is_uncore : false;
        evsel->auto_merge_stats = auto_merge_stats;
+       evsel->pmu = pmu;
 
        if (name)
                evsel->name = strdup(name);
index 0328405..6a86e6a 100644 (file)
@@ -1065,11 +1065,15 @@ struct perf_pmu *evsel__find_pmu(struct evsel *evsel)
 {
        struct perf_pmu *pmu = NULL;
 
+       if (evsel->pmu)
+               return evsel->pmu;
+
        while ((pmu = perf_pmu__scan(pmu)) != NULL) {
                if (pmu->type == evsel->core.attr.type)
                        break;
        }
 
+       evsel->pmu = pmu;
        return pmu;
 }