Commit 126d68fd authored by Adrian Hunter's avatar Adrian Hunter Committed by Arnaldo Carvalho de Melo
Browse files

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: default avatarAdrian Hunter <adrian.hunter@intel.com>
Acked-by: default avatarIan Rogers <irogers@google.com>
Acked-by: default avatarNamhyung 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: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
parent 82944899
Loading
Loading
Loading
Loading
+45 −0
Original line number Diff line number Diff line
@@ -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;
+5 −0
Original line number Diff line number Diff line
@@ -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);