perf auxtrace: Add mmap_needed to auxtrace_mmap_params
authorAdrian Hunter <adrian.hunter@intel.com>
Tue, 24 May 2022 07:54:23 +0000 (10:54 +0300)
committerArnaldo Carvalho de Melo <acme@redhat.com>
Thu, 26 May 2022 15:36:56 +0000 (12:36 -0300)
Add mmap_needed to auxtrace_mmap_params.

Currently an auxtrace mmap is always attempted even if the event is not an
auxtrace event. That works because, when AUX area tracing, there is always
an auxtrace event first for every mmap. Prepare for that not being the
case, which it won't be when sideband tracking events are allowed on
all CPUs even when auxtrace is limited to selected CPUs.

Signed-off-by: Adrian Hunter <adrian.hunter@intel.com>
Acked-by: Ian Rogers <irogers@google.com>
Acked-by: Namhyung Kim <namhyung@kernel.org>
Cc: Alexey Bayduraev <alexey.v.bayduraev@linux.intel.com>
Cc: Ian Rogers <irogers@google.com>
Cc: Jiri Olsa <jolsa@kernel.org>
Cc: Leo Yan <leo.yan@linaro.org>
Link: https://lore.kernel.org/r/20220524075436.29144-3-adrian.hunter@intel.com
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
tools/perf/util/auxtrace.c
tools/perf/util/auxtrace.h
tools/perf/util/evlist.c
tools/perf/util/mmap.c

index b11549ae39dff80ac77d7b69841c14e4be9b1c73..b446cfa66469c7aad796c3d9f4e457c7b6f1ed15 100644 (file)
@@ -125,7 +125,7 @@ int auxtrace_mmap__mmap(struct auxtrace_mmap *mm,
        mm->tid = mp->tid;
        mm->cpu = mp->cpu.cpu;
 
-       if (!mp->len) {
+       if (!mp->len || !mp->mmap_needed) {
                mm->base = NULL;
                return 0;
        }
@@ -168,9 +168,15 @@ void auxtrace_mmap_params__init(struct auxtrace_mmap_params *mp,
 }
 
 void auxtrace_mmap_params__set_idx(struct auxtrace_mmap_params *mp,
-                                  struct evlist *evlist, int idx,
+                                  struct evlist *evlist,
+                                  struct evsel *evsel, int idx,
                                   bool per_cpu)
 {
+       mp->mmap_needed = evsel->needs_auxtrace_mmap;
+
+       if (!mp->mmap_needed)
+               return;
+
        mp->idx = idx;
 
        if (per_cpu) {
index dc38b6f57232838afeae8f77637db9dbb569942e..695591b73ae118197d81c785c9e2df257d9589b3 100644 (file)
@@ -344,6 +344,10 @@ struct auxtrace_mmap {
  * @idx: index of this mmap
  * @tid: tid for a per-thread mmap (also set if there is only 1 tid on a per-cpu
  *       mmap) otherwise %0
+ * @mmap_needed: set to %false for non-auxtrace events. This is needed because
+ *               auxtrace mmapping is done in the same code path as non-auxtrace
+ *               mmapping but not every evsel that needs non-auxtrace mmapping
+ *               also needs auxtrace mmapping.
  * @cpu: cpu number for a per-cpu mmap otherwise %-1
  */
 struct auxtrace_mmap_params {
@@ -353,6 +357,7 @@ struct auxtrace_mmap_params {
        int             prot;
        int             idx;
        pid_t           tid;
+       bool            mmap_needed;
        struct perf_cpu cpu;
 };
 
@@ -490,7 +495,8 @@ void auxtrace_mmap_params__init(struct auxtrace_mmap_params *mp,
                                unsigned int auxtrace_pages,
                                bool auxtrace_overwrite);
 void auxtrace_mmap_params__set_idx(struct auxtrace_mmap_params *mp,
-                                  struct evlist *evlist, int idx,
+                                  struct evlist *evlist,
+                                  struct evsel *evsel, int idx,
                                   bool per_cpu);
 
 typedef int (*process_auxtrace_t)(struct perf_tool *tool,
@@ -863,7 +869,8 @@ void auxtrace_mmap_params__init(struct auxtrace_mmap_params *mp,
                                unsigned int auxtrace_pages,
                                bool auxtrace_overwrite);
 void auxtrace_mmap_params__set_idx(struct auxtrace_mmap_params *mp,
-                                  struct evlist *evlist, int idx,
+                                  struct evlist *evlist,
+                                  struct evsel *evsel, int idx,
                                   bool per_cpu);
 
 #define ITRACE_HELP ""
index 7f9f588e88c63c29d5b3cbe1d8f3bcef413f69a5..9e0fabfb096d12364da6f39dfaf2f3d9f7c17ed3 100644 (file)
@@ -747,15 +747,16 @@ static struct mmap *evlist__alloc_mmap(struct evlist *evlist,
 
 static void
 perf_evlist__mmap_cb_idx(struct perf_evlist *_evlist,
-                        struct perf_evsel *_evsel __maybe_unused,
+                        struct perf_evsel *_evsel,
                         struct perf_mmap_param *_mp,
                         int idx)
 {
        struct evlist *evlist = container_of(_evlist, struct evlist, core);
        struct mmap_params *mp = container_of(_mp, struct mmap_params, core);
        bool per_cpu = !perf_cpu_map__empty(_evlist->user_requested_cpus);
+       struct evsel *evsel = container_of(_evsel, struct evsel, core);
 
-       auxtrace_mmap_params__set_idx(&mp->auxtrace_mp, evlist, idx, per_cpu);
+       auxtrace_mmap_params__set_idx(&mp->auxtrace_mp, evlist, evsel, idx, per_cpu);
 }
 
 static struct perf_mmap*
index 50502b4a7ca469c783c2eae3c8dac5ba465158e2..de59c4da852b645a3878dc2e42e4802dfe314ceb 100644 (file)
@@ -62,6 +62,7 @@ void __weak auxtrace_mmap_params__init(struct auxtrace_mmap_params *mp __maybe_u
 
 void __weak auxtrace_mmap_params__set_idx(struct auxtrace_mmap_params *mp __maybe_unused,
                                          struct evlist *evlist __maybe_unused,
+                                         struct evsel *evsel __maybe_unused,
                                          int idx __maybe_unused,
                                          bool per_cpu __maybe_unused)
 {