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: Andi Kleen <ak@linux.intel.com> Acked-by: Jiri Olsa <jolsa@kernel.org> Link: http://lore.kernel.org/lkml/20191121001522.180827-6-andi@firstfloor.org Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
This commit is contained in:
parent
a2408a7036
commit
a8cbe40fe9
@ -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);
|
int cpu_map__cpu(struct perf_cpu_map *cpus, int idx);
|
||||||
bool cpu_map__has(struct perf_cpu_map *cpus, int cpu);
|
bool cpu_map__has(struct perf_cpu_map *cpus, int cpu);
|
||||||
|
|
||||||
#endif /* __PERF_CPUMAP_H */
|
#endif /* __PERF_CPUMAP_H */
|
||||||
|
@ -342,6 +342,38 @@ static int perf_evlist__nr_threads(struct evlist *evlist,
|
|||||||
return perf_thread_map__nr(evlist->core.threads);
|
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)
|
void evlist__disable(struct evlist *evlist)
|
||||||
{
|
{
|
||||||
struct evsel *pos;
|
struct evsel *pos;
|
||||||
|
@ -334,9 +334,17 @@ void perf_evlist__to_front(struct evlist *evlist,
|
|||||||
#define evlist__for_each_entry_safe(evlist, tmp, evsel) \
|
#define evlist__for_each_entry_safe(evlist, tmp, evsel) \
|
||||||
__evlist__for_each_entry_safe(&(evlist)->core.entries, 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,
|
void perf_evlist__set_tracking_event(struct evlist *evlist,
|
||||||
struct evsel *tracking_evsel);
|
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 *
|
struct evsel *
|
||||||
perf_evlist__find_evsel_by_str(struct evlist *evlist, const char *str);
|
perf_evlist__find_evsel_by_str(struct evlist *evlist, const char *str);
|
||||||
|
|
||||||
|
@ -95,6 +95,7 @@ struct evsel {
|
|||||||
bool collect_stat;
|
bool collect_stat;
|
||||||
bool weak_group;
|
bool weak_group;
|
||||||
bool percore;
|
bool percore;
|
||||||
|
int cpu_iter;
|
||||||
const char *pmu_name;
|
const char *pmu_name;
|
||||||
struct {
|
struct {
|
||||||
perf_evsel__sb_cb_t *cb;
|
perf_evsel__sb_cb_t *cb;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user