Re: [PATCH v5 07/13] perf stat: Use affinity for closing file descriptors

Andi Kleen
2019-11-11T16:56:31Z

On Mon, Nov 11, 2019 at 02:30:52PM +0100, Jiri Olsa wrote:
> On Thu, Nov 07, 2019 at 10:16:40AM -0800, Andi Kleen wrote:
> > From: Andi Kleen <ak@linux.intel.com>
> >
> > Closing a perf fd can also trigger an IPI to the target CPU.
> > Use the same affinity technique as we use for reading/enabling events
> > to closing to optimize the CPU transitions.
> >
> > Before on a large test case with 94 CPUs:
> >
> > % time seconds usecs/call calls errors syscall
> > ------ ----------- ----------- --------- --------- ----------------
> > 32.56 3.085463 50 61483 close
> >
> > After:
> >
> > 10.54 0.735704 11 61485 close
> >
> > Signed-off-by: Andi Kleen <ak@linux.intel.com>
> >
> > ---
> >
> > v2: Use new iterator macros
> > v3: Use new iterator macros
> > Add missing affinity__cleanup
> > v4:
> > Update iterators again
> > ---
> > tools/perf/util/evlist.c | 27 +++++++++++++++++++++++++--
> > 1 file changed, 25 insertions(+), 2 deletions(-)
> >
> > diff --git a/tools/perf/util/evlist.c b/tools/perf/util/evlist.c
> > index dae6e846b2f8..0dcea66329e2 100644
> > --- a/tools/perf/util/evlist.c
> > +++ b/tools/perf/util/evlist.c
> > @@ -18,6 +18,7 @@
> > #include "debug.h"
> > #include "units.h"
> > #include <internal/lib.h> // page_size
> > +#include "affinity.h"
> > #include "../perf.h"
> > #include "asm/bug.h"
> > #include "bpf-event.h"
> > @@ -1169,9 +1170,31 @@ void perf_evlist__set_selected(struct evlist *evlist,
> > void evlist__close(struct evlist *evlist)
> > {
> > struct evsel *evsel;
> > + struct affinity affinity;
> > + int cpu, i;
> >
> > - evlist__for_each_entry_reverse(evlist, evsel)
> > - evsel__close(evsel);
> > + if (!evlist->core.cpus) {
>
> should this be evlist->all_cpus?

This detects perf record essentially. I had some problems with perf record
in early testing, so I just disabled it, since I was just focussing
on stat. all_cpus would be set for perf record too.

-Andi