drm/xe: Fix splat during error dump
authorFrancois Dugast <francois.dugast@intel.com>
Thu, 4 May 2023 20:29:43 +0000 (22:29 +0200)
committerRodrigo Vivi <rodrigo.vivi@intel.com>
Tue, 19 Dec 2023 23:33:13 +0000 (18:33 -0500)
Allow xe_bo_addr without lock to print debug information, such
as from xe_analyze_vm.

Signed-off-by: Francois Dugast <francois.dugast@intel.com>
Reviewed-by: Matthew Brost <matthew.brost@intel.com>
Signed-off-by: Rodrigo Vivi <rodrigo.vivi@intel.com>
drivers/gpu/drm/xe/xe_bo.c
drivers/gpu/drm/xe/xe_bo.h
drivers/gpu/drm/xe/xe_vm.c

index 9a565203deacae6b43e30f32a29f3d0ce31072a0..4693372ec82e927cee5c3bf289ec44e9fae688e0 100644 (file)
@@ -1545,15 +1545,18 @@ bool xe_bo_is_xe_bo(struct ttm_buffer_object *bo)
        return false;
 }
 
-dma_addr_t xe_bo_addr(struct xe_bo *bo, u64 offset,
+/*
+ * Resolve a BO address. There is no assert to check if the proper lock is held
+ * so it should only be used in cases where it is not fatal to get the wrong
+ * address, such as printing debug information, but not in cases where memory is
+ * written based on this result.
+ */
+dma_addr_t __xe_bo_addr(struct xe_bo *bo, u64 offset,
                      size_t page_size, bool *is_vram)
 {
        struct xe_res_cursor cur;
        u64 page;
 
-       if (!READ_ONCE(bo->ttm.pin_count))
-               xe_bo_assert_held(bo);
-
        XE_BUG_ON(page_size > PAGE_SIZE);
        page = offset >> PAGE_SHIFT;
        offset &= (PAGE_SIZE - 1);
@@ -1575,6 +1578,14 @@ dma_addr_t xe_bo_addr(struct xe_bo *bo, u64 offset,
        }
 }
 
+dma_addr_t xe_bo_addr(struct xe_bo *bo, u64 offset,
+                     size_t page_size, bool *is_vram)
+{
+       if (!READ_ONCE(bo->ttm.pin_count))
+               xe_bo_assert_held(bo);
+       return __xe_bo_addr(bo, offset, page_size, is_vram);
+}
+
 int xe_bo_vmap(struct xe_bo *bo)
 {
        void *virtual;
index 8354d05ccdf3768bc90a36fdad70b3692611fc6b..7e111332c35aac9f87d98a0276884855509ef0e8 100644 (file)
@@ -199,6 +199,8 @@ static inline void xe_bo_unpin_map_no_vm(struct xe_bo *bo)
 }
 
 bool xe_bo_is_xe_bo(struct ttm_buffer_object *bo);
+dma_addr_t __xe_bo_addr(struct xe_bo *bo, u64 offset,
+                     size_t page_size, bool *is_vram);
 dma_addr_t xe_bo_addr(struct xe_bo *bo, u64 offset,
                      size_t page_size, bool *is_vram);
 
index e634bb96f9ccdf7c88291f8c5486cd1136245be1..06b559ff80bf5689422249085c2e3756036b1746 100644 (file)
@@ -3421,7 +3421,7 @@ int xe_analyze_vm(struct drm_printer *p, struct xe_vm *vm, int gt_id)
                                        &cur);
                        addr = xe_res_dma(&cur);
                } else {
-                       addr = xe_bo_addr(vma->bo, 0, XE_PAGE_SIZE, &is_vram);
+                       addr = __xe_bo_addr(vma->bo, 0, XE_PAGE_SIZE, &is_vram);
                }
                drm_printf(p, " [%016llx-%016llx] S:0x%016llx A:%016llx %s\n",
                           vma->start, vma->end, vma->end - vma->start + 1ull,