perf stat: Use affinity for enabling/disabling events
Restructure event enabling/disabling to use affinity, which minimizes the number of IPIs needed. Before on a large test case with 94 CPUs: % time seconds usecs/call calls errors syscall ------ ----------- ----------- --------- --------- ---------------- 54.65 1.899986 22 84812 660 ioctl after: 39.21 0.930451 10 84796 644 ioctl Signed-off-by: Andi Kleen <ak@linux.intel.com> Acked-by: Jiri Olsa <jolsa@kernel.org> Link: http://lore.kernel.org/lkml/20191121001522.180827-13-andi@firstfloor.org Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
This commit is contained in:
parent
363fb12189
commit
704e2f5b70
|
@ -378,11 +378,28 @@ bool evsel__cpu_iter_skip(struct evsel *ev, int cpu)
|
|||
void evlist__disable(struct evlist *evlist)
|
||||
{
|
||||
struct evsel *pos;
|
||||
struct affinity affinity;
|
||||
int cpu, i;
|
||||
|
||||
if (affinity__setup(&affinity) < 0)
|
||||
return;
|
||||
|
||||
evlist__for_each_cpu(evlist, i, cpu) {
|
||||
affinity__set(&affinity, cpu);
|
||||
|
||||
evlist__for_each_entry(evlist, pos) {
|
||||
if (evsel__cpu_iter_skip(pos, cpu))
|
||||
continue;
|
||||
if (pos->disabled || !perf_evsel__is_group_leader(pos) || !pos->core.fd)
|
||||
continue;
|
||||
evsel__disable_cpu(pos, pos->cpu_iter - 1);
|
||||
}
|
||||
}
|
||||
affinity__cleanup(&affinity);
|
||||
evlist__for_each_entry(evlist, pos) {
|
||||
if (pos->disabled || !perf_evsel__is_group_leader(pos) || !pos->core.fd)
|
||||
if (!perf_evsel__is_group_leader(pos) || !pos->core.fd)
|
||||
continue;
|
||||
evsel__disable(pos);
|
||||
pos->disabled = true;
|
||||
}
|
||||
|
||||
evlist->enabled = false;
|
||||
|
@ -391,11 +408,28 @@ void evlist__disable(struct evlist *evlist)
|
|||
void evlist__enable(struct evlist *evlist)
|
||||
{
|
||||
struct evsel *pos;
|
||||
struct affinity affinity;
|
||||
int cpu, i;
|
||||
|
||||
if (affinity__setup(&affinity) < 0)
|
||||
return;
|
||||
|
||||
evlist__for_each_cpu(evlist, i, cpu) {
|
||||
affinity__set(&affinity, cpu);
|
||||
|
||||
evlist__for_each_entry(evlist, pos) {
|
||||
if (evsel__cpu_iter_skip(pos, cpu))
|
||||
continue;
|
||||
if (!perf_evsel__is_group_leader(pos) || !pos->core.fd)
|
||||
continue;
|
||||
evsel__enable_cpu(pos, pos->cpu_iter - 1);
|
||||
}
|
||||
}
|
||||
affinity__cleanup(&affinity);
|
||||
evlist__for_each_entry(evlist, pos) {
|
||||
if (!perf_evsel__is_group_leader(pos) || !pos->core.fd)
|
||||
continue;
|
||||
evsel__enable(pos);
|
||||
pos->disabled = false;
|
||||
}
|
||||
|
||||
evlist->enabled = true;
|
||||
|
|
Loading…
Reference in New Issue