From: Dave Gordon <david.s.gor...@intel.com>

For: VIZ-2021
Signed-off-by: Dave Gordon <david.s.gor...@intel.com>
---
 drivers/gpu/drm/i915/i915_drv.h         |  2 ++
 drivers/gpu/drm/i915/i915_gem.c         | 11 +++++++++--
 drivers/gpu/drm/i915/i915_gpu_error.c   |  9 +++++++++
 drivers/gpu/drm/i915/intel_ringbuffer.h | 14 ++++++++++++++
 4 files changed, 34 insertions(+), 2 deletions(-)

diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h
index 779fc70..9b4ab5d 100644
--- a/drivers/gpu/drm/i915/i915_drv.h
+++ b/drivers/gpu/drm/i915/i915_drv.h
@@ -567,6 +567,8 @@ struct drm_i915_error_state {
 
                u64 ctx_desc;
 
+               struct intel_ringbuffer req_ring;
+
                struct drm_i915_error_object {
                        int page_count;
                        u64 gtt_offset;
diff --git a/drivers/gpu/drm/i915/i915_gem.c b/drivers/gpu/drm/i915/i915_gem.c
index ab6064e..785310c 100644
--- a/drivers/gpu/drm/i915/i915_gem.c
+++ b/drivers/gpu/drm/i915/i915_gem.c
@@ -2634,8 +2634,15 @@ void __i915_add_request(struct drm_i915_gem_request 
*request,
         */
        request->batch_obj = obj;
 
-       request->emitted_jiffies = jiffies;
-       ring->last_submitted_seqno = request->seqno;
+       if (ring->last_submitted_ringbuf == ringbuf)
+               ringbuf->resubmission_count += 1;
+       else
+               ringbuf->resubmission_count = 1;
+       ring->last_submitted_ringbuf = ringbuf;
+       ringbuf->total_submission_count += 1;
+       ringbuf->last_submitted_tail = request->tail;
+       ringbuf->last_submitted_seqno = ring->last_submitted_seqno = 
request->seqno;
+       ringbuf->last_submitted_jiffies = request->emitted_jiffies = jiffies;
        list_add_tail(&request->list, &ring->request_list);
 
        trace_i915_gem_request_add(request);
diff --git a/drivers/gpu/drm/i915/i915_gpu_error.c 
b/drivers/gpu/drm/i915/i915_gpu_error.c
index bafaadd..0697fc3 100644
--- a/drivers/gpu/drm/i915/i915_gpu_error.c
+++ b/drivers/gpu/drm/i915/i915_gpu_error.c
@@ -522,12 +522,20 @@ int i915_error_state_to_str(struct 
drm_i915_error_state_buf *m,
                }
 
                if ((obj = error->ring[i].req_ringbuffer)) {
+                       struct intel_ringbuffer *irb = &error->ring[i].req_ring;
+
                        err_printf(m, "%s --- ringbuffer = 0x%08x; %d pages 
(ctx_desc 0x%08x_%08x)\n",
                                   dev_priv->ring[i].name,
                                   lower_32_bits(obj->gtt_offset),
                                   obj->page_count,
                                   upper_32_bits(error->ring[i].ctx_desc),
                                   lower_32_bits(error->ring[i].ctx_desc));
+                       err_printf(m, "\t\tringbuffer head 0x%08x tail 0x%08x 
space 0x%08x lrh 0x%08x\n",
+                                  irb->head, irb->tail, irb->space, 
irb->last_retired_head);
+                       err_printf(m, "\t\t%llu submission(s), %d consecutive, 
last at %ld: tail 0x%08x seqno %08x (%d)\n",
+                                  irb->total_submission_count, 
irb->resubmission_count,
+                                  irb->last_submitted_jiffies, 
irb->last_submitted_tail,
+                                  irb->last_submitted_seqno, 
irb->last_submitted_seqno);
                        print_error_obj(m, obj);
                }
 
@@ -1163,6 +1171,7 @@ static void i915_gem_record_rings(struct drm_device *dev,
                error->ring[i].ctx_desc = ctx_desc;
                error->ring[i].req_ringbuffer =
                        i915_error_ggtt_object_create(dev_priv, rbuf->obj);
+               error->ring[i].req_ring = *rbuf;
 
                error->ring[i].hws_page =
                        i915_error_ggtt_object_create(dev_priv, 
ring->status_page.obj);
diff --git a/drivers/gpu/drm/i915/intel_ringbuffer.h 
b/drivers/gpu/drm/i915/intel_ringbuffer.h
index c472f8a..6bdc1ad 100644
--- a/drivers/gpu/drm/i915/intel_ringbuffer.h
+++ b/drivers/gpu/drm/i915/intel_ringbuffer.h
@@ -126,6 +126,19 @@ struct intel_ringbuffer {
         * we can detect new retirements.
         */
        u32 last_retired_head;
+
+       /*
+        * Consecutive resubmissions are opportunities for the h/w to do
+        * a 'lite restore' rather than a full context switch. Let's note
+        * when that happens, in case it's useful for hang diagnosis.
+        */
+       u32 resubmission_count;
+       u64 total_submission_count;
+
+       /* Info about last time this ringbuffer was submitted (to GuC) */
+       unsigned long last_submitted_jiffies;
+       u32 last_submitted_seqno;
+       u32 last_submitted_tail;
 };
 
 struct intel_context;
@@ -306,6 +319,7 @@ struct  intel_engine_cs {
         * inspecting request list.
         */
        u32 last_submitted_seqno;
+       struct intel_ringbuffer *last_submitted_ringbuf;
 
        /* deferred free list to allow unreferencing requests outside the 
driver */
        struct list_head delayed_free_list;
-- 
1.9.1

_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/intel-gfx

Reply via email to