]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
drm/xe: Add explicit abort page reclaim list
authorBrian Nguyen <brian3.nguyen@intel.com>
Wed, 7 Jan 2026 01:04:50 +0000 (09:04 +0800)
committerMatthew Brost <matthew.brost@intel.com>
Thu, 8 Jan 2026 22:33:31 +0000 (14:33 -0800)
PRLs could be invalidated to indicate its getting dropped from current
scope but are still valid. So standardize calls and add abort to clearly
define when an invalidation is a real abort and PRL should fallback.

v3:
 - Update abort function to macro. (Matthew B)

Signed-off-by: Brian Nguyen <brian3.nguyen@intel.com>
Reviewed-by: Matthew Brost <matthew.brost@intel.com>
Signed-off-by: Matthew Brost <matthew.brost@intel.com>
Link: https://patch.msgid.link/20260107010447.4125005-8-brian3.nguyen@intel.com
drivers/gpu/drm/xe/xe_page_reclaim.h
drivers/gpu/drm/xe/xe_pt.c

index a4f58e0ce9b49ac3334707503637795889800552..12f861f357d8439283c3d1c0a41ef43948d25e40 100644 (file)
@@ -19,6 +19,7 @@
 struct xe_tlb_inval;
 struct xe_tlb_inval_fence;
 struct xe_tile;
+struct xe_gt;
 struct xe_vma;
 
 struct xe_guc_page_reclaim_entry {
@@ -75,6 +76,24 @@ struct drm_suballoc *xe_page_reclaim_create_prl_bo(struct xe_tlb_inval *tlb_inva
                                                   struct xe_page_reclaim_list *prl,
                                                   struct xe_tlb_inval_fence *fence);
 void xe_page_reclaim_list_invalidate(struct xe_page_reclaim_list *prl);
+
+/**
+ * xe_page_reclaim_list_abort() - Invalidate a PRL and log an abort reason
+ * @gt: GT owning the page reclaim request
+ * @prl: Page reclaim list to invalidate
+ * @fmt: format string for the log message with args
+ *
+ * Abort page reclaim process by invalidating PRL and doing any relevant logging.
+ */
+#define xe_page_reclaim_list_abort(gt, prl, fmt, ...)                                  \
+       do {                                                                            \
+               struct xe_gt *__gt = (gt);                                              \
+               struct xe_page_reclaim_list *__prl = (prl);                             \
+                                                                                       \
+               xe_page_reclaim_list_invalidate(__prl);                                 \
+               vm_dbg(&gt_to_xe(__gt)->drm, "PRL aborted: " fmt, ##__VA_ARGS__);       \
+       } while (0)
+
 void xe_page_reclaim_list_init(struct xe_page_reclaim_list *prl);
 int xe_page_reclaim_list_alloc_entries(struct xe_page_reclaim_list *prl);
 /**
index 6cd78bb2b652322bdd675e19a47e9460717ca5ab..2752a5a48a978a692b5f77bdc1d96f75472524b4 100644 (file)
@@ -1618,10 +1618,9 @@ static int generate_reclaim_entry(struct xe_tile *tile,
        } else if (is_2m_pte(xe_child)) {
                reclamation_size = COMPUTE_RECLAIM_ADDRESS_MASK(SZ_2M);  /* reclamation_size = 9 */
        } else {
-               xe_page_reclaim_list_invalidate(prl);
-               vm_dbg(&tile_to_xe(tile)->drm,
-                      "PRL invalidate: unsupported PTE level=%u pte=%#llx\n",
-                      xe_child->level, pte);
+               xe_page_reclaim_list_abort(tile->primary_gt, prl,
+                                          "unsupported PTE level=%u pte=%#llx",
+                                          xe_child->level, pte);
                return -EINVAL;
        }
 
@@ -1670,10 +1669,9 @@ static int xe_pt_stage_unbind_entry(struct xe_ptw *parent, pgoff_t offset,
                                        break;
                        } else {
                                /* overflow, mark as invalid */
-                               xe_page_reclaim_list_invalidate(xe_walk->prl);
-                               vm_dbg(&xe->drm,
-                                      "PRL invalidate: overflow while adding pte=%#llx",
-                                      pte);
+                               xe_page_reclaim_list_abort(xe_walk->tile->primary_gt, xe_walk->prl,
+                                                          "overflow while adding pte=%#llx",
+                                                          pte);
                                break;
                        }
                }
@@ -1682,10 +1680,9 @@ static int xe_pt_stage_unbind_entry(struct xe_ptw *parent, pgoff_t offset,
        /* If aborting page walk early, invalidate PRL since PTE may be dropped from this abort */
        if (xe_pt_check_kill(addr, next, level - 1, xe_child, action, walk) &&
            xe_walk->prl && level > 1 && xe_child->base.children && xe_child->num_live != 0) {
-               xe_page_reclaim_list_invalidate(xe_walk->prl);
-               vm_dbg(&xe->drm,
-                      "PRL invalidate: kill at level=%u addr=%#llx next=%#llx num_live=%u\n",
-                      level, addr, next, xe_child->num_live);
+               xe_page_reclaim_list_abort(xe_walk->tile->primary_gt, xe_walk->prl,
+                                          "kill at level=%u addr=%#llx next=%#llx num_live=%u\n",
+                                          level, addr, next, xe_child->num_live);
        }
 
        return 0;