lkml.org 
[lkml]   [2019]   [Nov]   [20]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 07/12] perf stat: Use affinity for closing file descriptors
    Date
    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
    v5:
    Add comments
    ---
    tools/perf/util/evlist.c | 31 +++++++++++++++++++++++++++++--
    1 file changed, 29 insertions(+), 2 deletions(-)

    diff --git a/tools/perf/util/evlist.c b/tools/perf/util/evlist.c
    index dae6e846b2f8..7db49a0a0350 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,35 @@ 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);
    + /*
    + * With perf record core.cpus is usually NULL.
    + * Use the old method to handle this for now.
    + */
    + if (!evlist->core.cpus) {
    + evlist__for_each_entry_reverse(evlist, evsel)
    + evsel__close(evsel);
    + return;
    + }
    +
    + if (affinity__setup(&affinity) < 0)
    + return;
    + evlist__for_each_cpu (evlist, i, cpu) {
    + affinity__set(&affinity, cpu);
    +
    + evlist__for_each_entry_reverse(evlist, evsel) {
    + if (evsel__cpu_iter_skip(evsel, cpu))
    + continue;
    + perf_evsel__close_cpu(&evsel->core, evsel->cpu_iter - 1);
    + }
    + }
    + affinity__cleanup(&affinity);
    + evlist__for_each_entry_reverse(evlist, evsel) {
    + perf_evsel__free_fd(&evsel->core);
    + perf_evsel__free_id(&evsel->core);
    + }
    }

    static int perf_evlist__create_syswide_maps(struct evlist *evlist)
    --
    2.23.0

    \
     
     \ /
      Last update: 2019-11-21 01:16    [W:4.235 / U:0.292 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site