Mesa (master): i965: perf: ensure isolated timer reports while idle don' t confuse filtering

Lionel Landwerlin llandwerlin at kemper.freedesktop.org
Tue Jun 27 12:15:08 UTC 2017


Module: Mesa
Branch: master
Commit: e277ff41c0aafa6bd213da058b0256ddccbde6ae
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=e277ff41c0aafa6bd213da058b0256ddccbde6ae

Author: Robert Bragg <robert at sixbynine.org>
Date:   Thu Apr 13 19:50:37 2017 +0100

i965: perf: ensure isolated timer reports while idle don't confuse filtering

>From experimentation in IGT, we found that the OA unit might label
some report as "idle" (using an invalid context ID), right after a
report for a given context. Deltas generated by those reports actually
belong to the previous context, even though they're not labelled as
such.

This change makes ensure that while reading OA reports, we only
consider the GPU actually idle after 2 reports with an invalid context
ID.

Signed-off-by: Lionel Landwerlin <lionel.g.landwerlin at intel.com>
Reviewed-by: Kenneth Graunke <kenneth at whitecape.org>

---

 src/mesa/drivers/dri/i965/brw_performance_query.c | 18 +++++++++++++++++-
 1 file changed, 17 insertions(+), 1 deletion(-)

diff --git a/src/mesa/drivers/dri/i965/brw_performance_query.c b/src/mesa/drivers/dri/i965/brw_performance_query.c
index 4af0618568..519c3ec2f9 100644
--- a/src/mesa/drivers/dri/i965/brw_performance_query.c
+++ b/src/mesa/drivers/dri/i965/brw_performance_query.c
@@ -832,6 +832,7 @@ accumulate_oa_reports(struct brw_context *brw,
    struct exec_node *first_samples_node;
    bool in_ctx = true;
    uint32_t ctx_id;
+   int out_duration = 0;
 
    assert(o->Ready);
    assert(obj->oa.map != NULL);
@@ -903,13 +904,27 @@ accumulate_oa_reports(struct brw_context *brw,
              * of OA counters while any other context is acctive.
              */
             if (brw->gen >= 8) {
+
                if (in_ctx && report[2] != ctx_id) {
                   DBG("i915 perf: Switch AWAY (observed by ID change)\n");
                   in_ctx = false;
+                  out_duration = 0;
                } else if (in_ctx == false && report[2] == ctx_id) {
                   DBG("i915 perf: Switch TO\n");
                   in_ctx = true;
-                  add = false;
+
+                  /* From experimentation in IGT, we found that the OA unit
+                   * might label some report as "idle" (using an invalid
+                   * context ID), right after a report for a given context.
+                   * Deltas generated by those reports actually belong to the
+                   * previous context, even though they're not labelled as
+                   * such.
+                   *
+                   * We didn't *really* Switch AWAY in the case that we e.g.
+                   * saw a single periodic report while idle...
+                   */
+                  if (out_duration >= 1)
+                     add = false;
                } else if (in_ctx) {
                   assert(report[2] == ctx_id);
                   DBG("i915 perf: Continuation IN\n");
@@ -917,6 +932,7 @@ accumulate_oa_reports(struct brw_context *brw,
                   assert(report[2] != ctx_id);
                   DBG("i915 perf: Continuation OUT\n");
                   add = false;
+                  out_duration++;
                }
             }
 




More information about the mesa-commit mailing list