perf evlist: Add evlist__add_dummy_on_all_cpus()
Add evlist__add_dummy_on_all_cpus() to enable creating a system-wide dummy event that sets up the system-wide maps before map propagation. For convenience, add evlist__add_aux_dummy() so that the logic can be used whether or not the event needs to be system-wide. 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-6-adrian.hunter@intel.com Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
This commit is contained in:
parent
8294489914
commit
126d68fdca
|
@ -264,6 +264,51 @@ int evlist__add_dummy(struct evlist *evlist)
|
|||
return 0;
|
||||
}
|
||||
|
||||
static void evlist__add_on_all_cpus(struct evlist *evlist, struct evsel *evsel)
|
||||
{
|
||||
evsel->core.system_wide = true;
|
||||
|
||||
/*
|
||||
* All CPUs.
|
||||
*
|
||||
* Note perf_event_open() does not accept CPUs that are not online, so
|
||||
* in fact this CPU list will include only all online CPUs.
|
||||
*/
|
||||
perf_cpu_map__put(evsel->core.own_cpus);
|
||||
evsel->core.own_cpus = perf_cpu_map__new(NULL);
|
||||
perf_cpu_map__put(evsel->core.cpus);
|
||||
evsel->core.cpus = perf_cpu_map__get(evsel->core.own_cpus);
|
||||
|
||||
/* No threads */
|
||||
perf_thread_map__put(evsel->core.threads);
|
||||
evsel->core.threads = perf_thread_map__new_dummy();
|
||||
|
||||
evlist__add(evlist, evsel);
|
||||
}
|
||||
|
||||
struct evsel *evlist__add_aux_dummy(struct evlist *evlist, bool system_wide)
|
||||
{
|
||||
struct evsel *evsel = evlist__dummy_event(evlist);
|
||||
|
||||
if (!evsel)
|
||||
return NULL;
|
||||
|
||||
evsel->core.attr.exclude_kernel = 1;
|
||||
evsel->core.attr.exclude_guest = 1;
|
||||
evsel->core.attr.exclude_hv = 1;
|
||||
evsel->core.attr.freq = 0;
|
||||
evsel->core.attr.sample_period = 1;
|
||||
evsel->no_aux_samples = true;
|
||||
evsel->name = strdup("dummy:u");
|
||||
|
||||
if (system_wide)
|
||||
evlist__add_on_all_cpus(evlist, evsel);
|
||||
else
|
||||
evlist__add(evlist, evsel);
|
||||
|
||||
return evsel;
|
||||
}
|
||||
|
||||
static int evlist__add_attrs(struct evlist *evlist, struct perf_event_attr *attrs, size_t nr_attrs)
|
||||
{
|
||||
struct evsel *evsel, *n;
|
||||
|
|
|
@ -114,6 +114,11 @@ int arch_evlist__add_default_attrs(struct evlist *evlist);
|
|||
struct evsel *arch_evlist__leader(struct list_head *list);
|
||||
|
||||
int evlist__add_dummy(struct evlist *evlist);
|
||||
struct evsel *evlist__add_aux_dummy(struct evlist *evlist, bool system_wide);
|
||||
static inline struct evsel *evlist__add_dummy_on_all_cpus(struct evlist *evlist)
|
||||
{
|
||||
return evlist__add_aux_dummy(evlist, true);
|
||||
}
|
||||
|
||||
int evlist__add_sb_event(struct evlist *evlist, struct perf_event_attr *attr,
|
||||
evsel__sb_cb_t cb, void *data);
|
||||
|
|
Loading…
Reference in New Issue