perf intel-pt: Do not try to queue auxtrace data on pipe
authorNamhyung Kim <namhyung@kernel.org>
Tue, 31 Jan 2023 02:33:48 +0000 (18:33 -0800)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Fri, 10 Mar 2023 08:39:33 +0000 (09:39 +0100)
[ Upstream commit aeb802f872a7c42e4381f36041e77d1745908255 ]

When it processes AUXTRACE_INFO, it calls to auxtrace_queue_data() to
collect AUXTRACE data first.  That won't work with pipe since it needs
lseek() to read the scattered aux data.

  $ perf record -o- -e intel_pt// true | perf report -i- --itrace=i100
  # To display the perf.data header info, please use --header/--header-only options.
  #
  0x4118 [0xa0]: failed to process type: 70
  Error:
  failed to process sample

For the pipe mode, it can handle the aux data as it gets.  But there's
no guarantee it can get the aux data in time.  So the following warning
will be shown at the beginning:

  WARNING: Intel PT with pipe mode is not recommended.
           The output cannot relied upon.  In particular,
           time stamps and the order of events may be incorrect.

Fixes: dbd134322e74f19d ("perf intel-pt: Add support for decoding AUX area samples")
Reviewed-by: Adrian Hunter <adrian.hunter@intel.com>
Reviewed-by: James Clark <james.clark@arm.com>
Signed-off-by: Namhyung Kim <namhyung@kernel.org>
Cc: Adrian Hunter <adrian.hunter@intel.com>
Cc: Ian Rogers <irogers@google.com>
Cc: Ingo Molnar <mingo@kernel.org>
Cc: Jiri Olsa <jolsa@kernel.org>
Cc: Leo Yan <leo.yan@linaro.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Stephane Eranian <eranian@google.com>
Link: https://lore.kernel.org/r/20230131023350.1903992-3-namhyung@kernel.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
Signed-off-by: Sasha Levin <sashal@kernel.org>
tools/perf/Documentation/perf-intel-pt.txt
tools/perf/util/auxtrace.c
tools/perf/util/intel-pt.c

index 5415c4993c6b406882e356e39dbab774a8dad9ee..de63c418e4d1f6a1cfe7e5beffdade65d69cf105 100644 (file)
@@ -1526,6 +1526,36 @@ Can be compiled and traced:
  $
 
 
+Pipe mode
+---------
+Pipe mode is a problem for Intel PT and possibly other auxtrace users.
+It's not recommended to use a pipe as data output with Intel PT because
+of the following reason.
+
+Essentially the auxtrace buffers do not behave like the regular perf
+event buffers.  That is because the head and tail are updated by
+software, but in the auxtrace case the data is written by hardware.
+So the head and tail do not get updated as data is written.
+
+In the Intel PT case, the head and tail are updated only when the trace
+is disabled by software, for example:
+    - full-trace, system wide : when buffer passes watermark
+    - full-trace, not system-wide : when buffer passes watermark or
+                                    context switches
+    - snapshot mode : as above but also when a snapshot is made
+    - sample mode : as above but also when a sample is made
+
+That means finished-round ordering doesn't work.  An auxtrace buffer
+can turn up that has data that extends back in time, possibly to the
+very beginning of tracing.
+
+For a perf.data file, that problem is solved by going through the trace
+and queuing up the auxtrace buffers in advance.
+
+For pipe mode, the order of events and timestamps can presumably
+be messed up.
+
+
 EXAMPLE
 -------
 
index 0ef4cbf21e6276a8da2e436f7b49e5703773fd74..344b65a8f7687e7959c784cdcdfcb3655ae5715d 100644 (file)
@@ -1107,6 +1107,9 @@ int auxtrace_queue_data(struct perf_session *session, bool samples, bool events)
        if (auxtrace__dont_decode(session))
                return 0;
 
+       if (perf_data__is_pipe(session->data))
+               return 0;
+
        if (!session->auxtrace || !session->auxtrace->queue_data)
                return -EINVAL;
 
index 89863efedc82c9128c1c742db5a61344821007d3..7a2ce387079e3bffd80560cd78863771cff57151 100644 (file)
@@ -3942,6 +3942,12 @@ int intel_pt_process_auxtrace_info(union perf_event *event,
 
        intel_pt_setup_pebs_events(pt);
 
+       if (perf_data__is_pipe(session->data)) {
+               pr_warning("WARNING: Intel PT with pipe mode is not recommended.\n"
+                          "         The output cannot relied upon.  In particular,\n"
+                          "         timestamps and the order of events may be incorrect.\n");
+       }
+
        if (pt->sampling_mode || list_empty(&session->auxtrace_index))
                err = auxtrace_queue_data(session, true, true);
        else