perf intel-pt: Time filter logged perf events
authorAdrian Hunter <adrian.hunter@intel.com>
Fri, 10 Jul 2020 15:11:01 +0000 (18:11 +0300)
committerArnaldo Carvalho de Melo <acme@redhat.com>
Thu, 6 Aug 2020 11:23:19 +0000 (08:23 -0300)
Change the debug logging (when used with the --time option) to time
filter logged perf events, but allow that to be overridden by using
"d+a" instead of plain "d".

That can reduce the size of the log file.

Signed-off-by: Adrian Hunter <adrian.hunter@intel.com>
Reviewed-by: Andi Kleen <ak@linux.intel.com>
Cc: Jiri Olsa <jolsa@redhat.com>
Link: http://lore.kernel.org/lkml/20200710151104.15137-10-adrian.hunter@intel.com
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
tools/perf/Documentation/perf-intel-pt.txt
tools/perf/util/intel-pt.c

index d22dead7bbe08dd942a7a956d5ed40eae2a92c77..4666e4a83615382742aeda2bbbc2ea6c9eccc621 100644 (file)
@@ -886,6 +886,9 @@ and that the resulting file may be very large.  The "d" option may be followed
 by flags which affect what debug messages will or will not be logged. Each flag
 must be preceded by either '+' or '-'. The flags support by Intel PT are:
                -a      Suppress logging of perf events
+               +a      Log all perf events
+By default, logged perf events are filtered by any specified time ranges, but
+flag +a overrides that.
 
 In addition, the period of the "instructions" event can be specified. e.g.
 
index 5f70f009d6162806b1650c9a6668ce9e6e9f63d5..0715d6e23b2fd768be85f3bcecfbffce08ef1b63 100644 (file)
@@ -249,9 +249,22 @@ static void intel_pt_dump_sample(struct perf_session *session,
        intel_pt_dump(pt, sample->aux_sample.data, sample->aux_sample.size);
 }
 
-static bool intel_pt_log_events(struct intel_pt *pt)
+static bool intel_pt_log_events(struct intel_pt *pt, u64 tm)
 {
-       return !(pt->synth_opts.log_minus_flags & AUXTRACE_LOG_FLG_ALL_PERF_EVTS);
+       struct perf_time_interval *range = pt->synth_opts.ptime_range;
+       int n = pt->synth_opts.range_num;
+
+       if (pt->synth_opts.log_plus_flags & AUXTRACE_LOG_FLG_ALL_PERF_EVTS)
+               return true;
+
+       if (pt->synth_opts.log_minus_flags & AUXTRACE_LOG_FLG_ALL_PERF_EVTS)
+               return false;
+
+       /* perf_time__ranges_skip_sample does not work if time is zero */
+       if (!tm)
+               tm = 1;
+
+       return !n || !perf_time__ranges_skip_sample(range, n, tm);
 }
 
 static int intel_pt_do_fix_overlap(struct intel_pt *pt, struct auxtrace_buffer *a,
@@ -2747,7 +2760,7 @@ static int intel_pt_process_event(struct perf_session *session,
        if (!err && event->header.type == PERF_RECORD_TEXT_POKE)
                err = intel_pt_text_poke(pt, event);
 
-       if (intel_pt_enable_logging && intel_pt_log_events(pt)) {
+       if (intel_pt_enable_logging && intel_pt_log_events(pt, sample->time)) {
                intel_pt_log("event %u: cpu %d time %"PRIu64" tsc %#"PRIx64" ",
                             event->header.type, sample->cpu, sample->time, timestamp);
                intel_pt_log_event(event);