perf auxtrace: Add CPU filter support
authorAdrian Hunter <adrian.hunter@intel.com>
Fri, 26 May 2017 08:17:38 +0000 (11:17 +0300)
committerArnaldo Carvalho de Melo <acme@redhat.com>
Fri, 30 Jun 2017 14:50:55 +0000 (11:50 -0300)
Decoding auxtrace data can take a long time. To avoid decoding
unnecessarily, filter auxtrace data that is collected per-cpu before it is
decoded.

Signed-off-by: Adrian Hunter <adrian.hunter@intel.com>
Cc: Andi Kleen <ak@linux.intel.com>
Link: http://lkml.kernel.org/r/1495786658-18063-38-git-send-email-adrian.hunter@intel.com
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
tools/perf/builtin-report.c
tools/perf/builtin-script.c
tools/perf/util/auxtrace.c
tools/perf/util/auxtrace.h

index 1174a426d0901a1681ff06b9ae6f9fdf273dbac6..79a33eb1a10d6b2ec69d1928525b88dd15aff9c9 100644 (file)
@@ -557,6 +557,7 @@ static int __cmd_report(struct report *rep)
                        ui__error("failed to set cpu bitmap\n");
                        return ret;
                }
+               session->itrace_synth_opts->cpu_bitmap = rep->cpu_bitmap;
        }
 
        if (rep->show_threads) {
index b458a0cc3544eef7b62d1eccc5ec3086bfa6a00c..83cdc0a61fd6fc38813d8bac07894a4190655438 100644 (file)
@@ -2992,6 +2992,7 @@ int cmd_script(int argc, const char **argv)
                err = perf_session__cpu_bitmap(session, cpu_list, cpu_bitmap);
                if (err < 0)
                        goto out_delete;
+               itrace_synth_opts.cpu_bitmap = cpu_bitmap;
        }
 
        if (!no_callchain)
index 651c01dfa5d3210d416e6922c0c11873ecfdb28e..5547457566a7130d25e97d012811e6ac8775ecf0 100644 (file)
@@ -322,6 +322,13 @@ static int auxtrace_queues__add_event_buffer(struct auxtrace_queues *queues,
        return auxtrace_queues__add_buffer(queues, idx, buffer);
 }
 
+static bool filter_cpu(struct perf_session *session, int cpu)
+{
+       unsigned long *cpu_bitmap = session->itrace_synth_opts->cpu_bitmap;
+
+       return cpu_bitmap && cpu != -1 && !test_bit(cpu, cpu_bitmap);
+}
+
 int auxtrace_queues__add_event(struct auxtrace_queues *queues,
                               struct perf_session *session,
                               union perf_event *event, off_t data_offset,
@@ -331,6 +338,9 @@ int auxtrace_queues__add_event(struct auxtrace_queues *queues,
        unsigned int idx;
        int err;
 
+       if (filter_cpu(session, event->auxtrace.cpu))
+               return 0;
+
        buffer = zalloc(sizeof(struct auxtrace_buffer));
        if (!buffer)
                return -ENOMEM;
index 68e0aa40b24afa11d493b04a74ec9eff79b56fe0..33b5e6cdf38c8302727fe55446b8f24d8342084d 100644 (file)
@@ -74,6 +74,7 @@ enum itrace_period_type {
  * @period: 'instructions' events period
  * @period_type: 'instructions' events period type
  * @initial_skip: skip N events at the beginning.
+ * @cpu_bitmap: CPUs for which to synthesize events, or NULL for all
  */
 struct itrace_synth_opts {
        bool                    set;
@@ -96,6 +97,7 @@ struct itrace_synth_opts {
        unsigned long long      period;
        enum itrace_period_type period_type;
        unsigned long           initial_skip;
+       unsigned long           *cpu_bitmap;
 };
 
 /**