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.hun...@intel.com>
---
 tools/perf/builtin-report.c |  1 +
 tools/perf/builtin-script.c |  1 +
 tools/perf/util/auxtrace.c  | 10 ++++++++++
 tools/perf/util/auxtrace.h  |  2 ++
 4 files changed, 14 insertions(+)

diff --git a/tools/perf/builtin-report.c b/tools/perf/builtin-report.c
index 22478ff2b706..6de88f156ec6 100644
--- a/tools/perf/builtin-report.c
+++ b/tools/perf/builtin-report.c
@@ -558,6 +558,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) {
diff --git a/tools/perf/builtin-script.c b/tools/perf/builtin-script.c
index 4a13daacba25..4c41d0358966 100644
--- a/tools/perf/builtin-script.c
+++ b/tools/perf/builtin-script.c
@@ -2874,6 +2874,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)
diff --git a/tools/perf/util/auxtrace.c b/tools/perf/util/auxtrace.c
index 651c01dfa5d3..5547457566a7 100644
--- a/tools/perf/util/auxtrace.c
+++ b/tools/perf/util/auxtrace.c
@@ -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;
diff --git a/tools/perf/util/auxtrace.h b/tools/perf/util/auxtrace.h
index 68e0aa40b24a..33b5e6cdf38c 100644
--- a/tools/perf/util/auxtrace.h
+++ b/tools/perf/util/auxtrace.h
@@ -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;
 };
 
 /**
-- 
1.9.1

Reply via email to