[PATCH 12/13] [DEBUG] dump busy debug

Robert Beckett bob.beckett at collabora.com
Thu Jun 23 17:52:38 UTC 2022


---
 drivers/gpu/drm/i915/gt/selftest_reset.c | 43 +++++++++++++++++++++---
 drivers/gpu/drm/i915/intel_region_ttm.c  | 27 +++++++++++++++
 drivers/gpu/drm/i915/intel_region_ttm.h  | 13 +++++++
 3 files changed, 78 insertions(+), 5 deletions(-)

diff --git a/drivers/gpu/drm/i915/gt/selftest_reset.c b/drivers/gpu/drm/i915/gt/selftest_reset.c
index f8d4b13d7e1b..6ec15b1a9fcd 100644
--- a/drivers/gpu/drm/i915/gt/selftest_reset.c
+++ b/drivers/gpu/drm/i915/gt/selftest_reset.c
@@ -33,6 +33,7 @@ __igt_reset_stolen(struct intel_gt *gt,
 	u32 *crc;
 	int err;
 	struct page **orig;
+	struct ttm_resource_dbg *orig_busy;
 
 	/* TODO: BOB_DEBUG
 	 * use alloc_pages_bulk_array() to create shadow pages for each stolen page.
@@ -47,10 +48,18 @@ __igt_reset_stolen(struct intel_gt *gt,
 	if (!num_pages)
 		return 0;
 
+	orig_busy = vmalloc_array(num_pages, sizeof(*orig_busy));
+	if (!orig_busy) {
+		pr_err("BOB_DEBUG: %s(): failed to alloc orig_busy. size=0x%llx\n",
+				__func__, num_pages * sizeof(orig_busy));
+		return -ENOMEM;
+	}
+
 	orig = kmalloc_array(num_pages, sizeof(struct page *), GFP_KERNEL);
 	if (!orig) {
 		pr_err("BOB_DEBUG: %s(): failed to alloc orig. sz=0x%llx\n", __func__, num_pages * sizeof(struct page*));
-		return -ENOMEM;
+		err = -ENOMEM;
+		goto err_orig_busy;
 	}
 
 	crc = kmalloc_array(num_pages, sizeof(u32), GFP_KERNEL);
@@ -111,8 +120,8 @@ __igt_reset_stolen(struct intel_gt *gt,
 				      ggtt->error_capture.start,
 				      PAGE_SIZE);
 
-		busy = intel_region_ttm_range_busy(gt->i915->mm.stolen_region,
-						   PFN_PHYS(page), PAGE_SIZE);
+		busy = intel_region_ttm_range_busy_debug(gt->i915->mm.stolen_region,
+						   PFN_PHYS(page), PAGE_SIZE, &orig_busy[page]);
 		if (!busy)
 			memset_io(s, STACK_MAGIC, PAGE_SIZE);
 
@@ -147,6 +156,7 @@ __igt_reset_stolen(struct intel_gt *gt,
 		void *in;
 		u32 x;
 		bool busy;
+		struct ttm_resource_dbg dbg;
 
 		ggtt->vm.insert_page(&ggtt->vm, dma,
 				     ggtt->error_capture.start,
@@ -162,8 +172,8 @@ __igt_reset_stolen(struct intel_gt *gt,
 			in = tmp;
 		x = crc32_le(0, in, PAGE_SIZE);
 
-		busy = intel_region_ttm_range_busy(gt->i915->mm.stolen_region,
-						   PFN_PHYS(page), PAGE_SIZE);
+		busy = intel_region_ttm_range_busy_debug(gt->i915->mm.stolen_region,
+						   PFN_PHYS(page), PAGE_SIZE, &dbg);
 		if (x != crc[page] && !busy) {
 			pr_debug("unused stolen page %pa modified by GPU reset\n",
 				 &page);
@@ -173,6 +183,27 @@ __igt_reset_stolen(struct intel_gt *gt,
 				in = kmap(orig[page]);
 				igt_hexdump(in, PAGE_SIZE);
 				kunmap(orig[page]);
+				pr_debug("BOB_DEBUG: %s(): dbg.req={ start=0x%llx size=0x%llx end=0x%llx }\n",
+						__func__, dbg.req.start,
+						dbg.req.size, dbg.req.end);
+				pr_debug("BOB_DEBUG: %s(): dbg.res={ start=0x%lx num_pages=0x%lx mem_type=0x%x placement=0x%x }\n",
+						__func__, dbg.res.start,
+						dbg.res.num_pages,
+						dbg.res.mem_type,
+						dbg.res.placement);
+				pr_debug("BOB_DEBUG: %s(): orig_busy.req={ start=0x%llx size=0x%llx end=0x%llx }\n",
+						__func__, orig_busy[page].req.start,
+						orig_busy[page].req.size, orig_busy[page].req.end);
+				pr_debug("BOB_DEBUG: %s(): orig_busy.res={ start=0x%lx num_pages=0x%lx mem_type=0x%x placement=0x%x }\n",
+						__func__, orig_busy[page].res.start,
+						orig_busy[page].res.num_pages,
+						orig_busy[page].res.mem_type,
+						orig_busy[page].res.placement);
+				pr_debug("BOB_DEBUG: %s(): orig_busy.busy=%d orig_busy.err=%d\n",
+						__func__,
+						orig_busy[page].busy,
+						orig_busy[page].err);
+
 			}
 			max = page;
 		}
@@ -204,6 +235,8 @@ __igt_reset_stolen(struct intel_gt *gt,
 	kfree(crc);
 err_orig:
 	kfree(orig);
+err_orig_busy:
+	vfree(orig_busy);
 	return err;
 }
 
diff --git a/drivers/gpu/drm/i915/intel_region_ttm.c b/drivers/gpu/drm/i915/intel_region_ttm.c
index b3850188981b..a95aa84cdb7c 100644
--- a/drivers/gpu/drm/i915/intel_region_ttm.c
+++ b/drivers/gpu/drm/i915/intel_region_ttm.c
@@ -294,3 +294,30 @@ bool intel_region_ttm_range_busy(struct intel_memory_region *mem,
 	intel_region_ttm_resource_free(mem, dummy);
 	return false;
 }
+
+bool intel_region_ttm_range_busy_debug(struct intel_memory_region *mem,
+				 u64 start, u64 size, struct ttm_resource_dbg *dbg)
+{
+	struct ttm_resource *dummy;
+
+	dummy = intel_region_ttm_resource_alloc(mem, size, start, start + size,
+						I915_BO_ALLOC_CONTIGUOUS);
+	if (IS_ERR(dummy)) {
+		dbg->busy = true;
+		dbg->err = PTR_ERR(dummy);
+		return true;
+	}
+
+	dbg->res.start = dummy->start;
+	dbg->res.num_pages = dummy->num_pages;
+	dbg->res.mem_type = dummy->mem_type;
+	dbg->res.placement = dummy->placement;
+	dbg->req.start = start;
+	dbg->req.size = size;
+	dbg->req.end = start + size;
+	dbg->busy = false;
+	dbg->err = 0;
+
+	intel_region_ttm_resource_free(mem, dummy);
+	return false;
+}
diff --git a/drivers/gpu/drm/i915/intel_region_ttm.h b/drivers/gpu/drm/i915/intel_region_ttm.h
index 1e88472fb2ea..df6a91ddb0db 100644
--- a/drivers/gpu/drm/i915/intel_region_ttm.h
+++ b/drivers/gpu/drm/i915/intel_region_ttm.h
@@ -6,6 +6,7 @@
 #define _INTEL_REGION_TTM_H_
 
 #include <linux/types.h>
+#include <drm/ttm/ttm_resource.h>
 
 #include "i915_selftest.h"
 
@@ -31,6 +32,18 @@ void intel_region_ttm_resource_free(struct intel_memory_region *mem,
 
 bool intel_region_ttm_range_busy(struct intel_memory_region *mem,
 				 u64 start, u64 size);
+struct ttm_resource_dbg {
+	struct ttm_resource res;
+	struct {
+		u64 start;
+		u64 size;
+		u64 end;
+	} req;
+	bool busy;
+	int err;
+};
+bool intel_region_ttm_range_busy_debug(struct intel_memory_region *mem,
+				 u64 start, u64 size, struct ttm_resource_dbg *dbg);
 
 int intel_region_to_ttm_type(const struct intel_memory_region *mem);
 
-- 
2.25.1



More information about the Intel-gfx-trybot mailing list