[PATCH 1/4] drm/i915: Dump the ringbuffer of the active request for debugging

Chris Wilson chris at chris-wilson.co.uk
Wed Jun 13 10:08:36 UTC 2018


Sometimes we need to see what instructions we emitted for a request to
try and gather a glimmer of insight into what the GPU is doing when it
stops responding.

Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>
---
 drivers/gpu/drm/i915/intel_engine_cs.c | 32 ++++++++++++++++++++++++++
 1 file changed, 32 insertions(+)

diff --git a/drivers/gpu/drm/i915/intel_engine_cs.c b/drivers/gpu/drm/i915/intel_engine_cs.c
index d278fed8cb31..843ae313e7a4 100644
--- a/drivers/gpu/drm/i915/intel_engine_cs.c
+++ b/drivers/gpu/drm/i915/intel_engine_cs.c
@@ -1532,6 +1532,38 @@ void intel_engine_dump(struct intel_engine_cs *engine,
 		   yesno(test_bit(ENGINE_IRQ_EXECLIST,
 				  &engine->irq_posted)));
 
+	rcu_read_lock();
+
+	rq = i915_gem_find_active_request(engine);
+	if (rq) {
+		void *ring;
+		int size;
+
+		size = rq->tail - rq->head;
+		if (rq->tail < rq->head)
+			size += rq->ring->size;
+
+		ring = kmalloc(size, GFP_ATOMIC);
+		if (ring) {
+			void *vaddr = rq->ring->vaddr;
+			unsigned int head = rq->head;
+			unsigned int len = 0;
+
+			if (rq->tail < head) {
+				len = rq->ring->size - head;
+				memcpy(ring, vaddr + head, len);
+				head = 0;
+			}
+			memcpy(ring + len, vaddr + head, rq->tail - head);
+
+			drm_printf(m, "RING (active request):\n");
+			hexdump(m, ring, size);
+			kfree(ring);
+		}
+	}
+
+	rcu_read_unlock();
+
 	drm_printf(m, "HWSP:\n");
 	hexdump(m, engine->status_page.page_addr, PAGE_SIZE);
 
-- 
2.17.1



More information about the Intel-gfx-trybot mailing list