struct xe_tlb_inval;
struct xe_tlb_inval_fence;
struct xe_tile;
+struct xe_gt;
struct xe_vma;
struct xe_guc_page_reclaim_entry {
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);
/**
} 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;
}
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;
}
}
/* 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;