From: Brian Nguyen Date: Wed, 7 Jan 2026 01:04:50 +0000 (+0800) Subject: drm/xe: Add explicit abort page reclaim list X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=7a0e86e3c9298c28f7bbbbb628bf1b7dd2de2916;p=thirdparty%2Fkernel%2Flinux.git drm/xe: Add explicit abort page reclaim list 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 Reviewed-by: Matthew Brost Signed-off-by: Matthew Brost Link: https://patch.msgid.link/20260107010447.4125005-8-brian3.nguyen@intel.com --- diff --git a/drivers/gpu/drm/xe/xe_page_reclaim.h b/drivers/gpu/drm/xe/xe_page_reclaim.h index a4f58e0ce9b4..12f861f357d8 100644 --- a/drivers/gpu/drm/xe/xe_page_reclaim.h +++ b/drivers/gpu/drm/xe/xe_page_reclaim.h @@ -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(>_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); /** diff --git a/drivers/gpu/drm/xe/xe_pt.c b/drivers/gpu/drm/xe/xe_pt.c index 6cd78bb2b652..2752a5a48a97 100644 --- a/drivers/gpu/drm/xe/xe_pt.c +++ b/drivers/gpu/drm/xe/xe_pt.c @@ -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;