Commit a8cbe40f authored by Andi Kleen's avatar Andi Kleen Committed by Arnaldo Carvalho de Melo
Browse files

perf evsel: Add iterator to iterate over events ordered by CPU



Add some common code that is needed to iterate over all events
in CPU order. Used in followon patches

Signed-off-by: default avatarAndi Kleen <ak@linux.intel.com>
Acked-by: default avatarJiri Olsa <jolsa@kernel.org>
Link: http://lore.kernel.org/lkml/20191121001522.180827-6-andi@firstfloor.org


Signed-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
parent a2408a70
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -63,4 +63,5 @@ int cpu_map__build_map(struct perf_cpu_map *cpus, struct perf_cpu_map **res,

int cpu_map__cpu(struct perf_cpu_map *cpus, int idx);
bool cpu_map__has(struct perf_cpu_map *cpus, int cpu);

#endif /* __PERF_CPUMAP_H */
+32 −0
Original line number Diff line number Diff line
@@ -342,6 +342,38 @@ static int perf_evlist__nr_threads(struct evlist *evlist,
		return perf_thread_map__nr(evlist->core.threads);
}

void evlist__cpu_iter_start(struct evlist *evlist)
{
	struct evsel *pos;

	/*
	 * Reset the per evsel cpu_iter. This is needed because
	 * each evsel's cpumap may have a different index space,
	 * and some operations need the index to modify
	 * the FD xyarray (e.g. open, close)
	 */
	evlist__for_each_entry(evlist, pos)
		pos->cpu_iter = 0;
}

bool evsel__cpu_iter_skip_no_inc(struct evsel *ev, int cpu)
{
	if (ev->cpu_iter >= ev->core.cpus->nr)
		return true;
	if (cpu >= 0 && ev->core.cpus->map[ev->cpu_iter] != cpu)
		return true;
	return false;
}

bool evsel__cpu_iter_skip(struct evsel *ev, int cpu)
{
	if (!evsel__cpu_iter_skip_no_inc(ev, cpu)) {
		ev->cpu_iter++;
		return false;
	}
	return true;
}

void evlist__disable(struct evlist *evlist)
{
	struct evsel *pos;
+8 −0
Original line number Diff line number Diff line
@@ -334,9 +334,17 @@ void perf_evlist__to_front(struct evlist *evlist,
#define evlist__for_each_entry_safe(evlist, tmp, evsel) \
	__evlist__for_each_entry_safe(&(evlist)->core.entries, tmp, evsel)

#define evlist__for_each_cpu(evlist, index, cpu)	\
	evlist__cpu_iter_start(evlist);			\
	perf_cpu_map__for_each_cpu (cpu, index, (evlist)->core.all_cpus)

void perf_evlist__set_tracking_event(struct evlist *evlist,
				     struct evsel *tracking_evsel);

void evlist__cpu_iter_start(struct evlist *evlist);
bool evsel__cpu_iter_skip(struct evsel *ev, int cpu);
bool evsel__cpu_iter_skip_no_inc(struct evsel *ev, int cpu);

struct evsel *
perf_evlist__find_evsel_by_str(struct evlist *evlist, const char *str);

+1 −0
Original line number Diff line number Diff line
@@ -95,6 +95,7 @@ struct evsel {
	bool			collect_stat;
	bool			weak_group;
	bool			percore;
	int			cpu_iter;
	const char		*pmu_name;
	struct {
		perf_evsel__sb_cb_t	*cb;