intel/perf: take into account that reports read can be fairly old
authorLionel Landwerlin <lionel.g.landwerlin@intel.com>
Tue, 3 Dec 2019 14:19:24 +0000 (16:19 +0200)
committerLionel Landwerlin <lionel.g.landwerlin@intel.com>
Wed, 4 Dec 2019 09:21:15 +0000 (09:21 +0000)
If we read the OA reports late enough after the query happens, we can
get a timestamp in the report that is significantly in the past
compared to the start timestamp of the query. The current code must
deal with the wraparound of the timestamp value (every ~6 minute). So
consider that if the difference is greater than half that wraparound
period, we're probably dealing with an old report and make the caller
aware it should read more reports when they're available.

Signed-off-by: Lionel Landwerlin <lionel.g.landwerlin@intel.com>
Cc: <mesa-stable@lists.freedesktop.org>
Reviewed-by: Mark Janes <mark.a.janes@intel.com>
Reviewed-by: Kenneth Graunke <kenneth@whitecape.org>
src/intel/perf/gen_perf.c

index 05103acfb217cb1e217232845b9b0bb35710b6b1..be7de571ff12899e4fd2d3700e336ad54edfad62 100644 (file)
@@ -1999,12 +1999,13 @@ read_oa_samples_until(struct gen_perf_context *perf_ctx,
          exec_list_push_tail(&perf_ctx->free_sample_buffers, &buf->link);
 
          if (len < 0) {
-            if (errno == EAGAIN)
-               return ((last_timestamp - start_timestamp) >=
+            if (errno == EAGAIN) {
+               return ((last_timestamp - start_timestamp) < INT32_MAX &&
+                       (last_timestamp - start_timestamp) >=
                        (end_timestamp - start_timestamp)) ?
                       OA_READ_STATUS_FINISHED :
                       OA_READ_STATUS_UNFINISHED;
-            else {
+            else {
                DBG("Error reading i915 perf samples: %m\n");
             }
          } else