[PATCH 1/1] drm/xe: Flush all page faults when closing a VM

Matthew Brost matthew.brost at intel.com
Mon Sep 9 22:32:25 UTC 2024


Ensure all page faults on VM are done when closing a VM before removing
page table memory.

Signed-off-by: Matthew Brost <matthew.brost at intel.com>
---
 drivers/gpu/drm/xe/xe_gt_pagefault.c | 15 +++++++++++++++
 drivers/gpu/drm/xe/xe_gt_pagefault.h |  2 ++
 drivers/gpu/drm/xe/xe_vm.c           |  7 +++++++
 3 files changed, 24 insertions(+)

diff --git a/drivers/gpu/drm/xe/xe_gt_pagefault.c b/drivers/gpu/drm/xe/xe_gt_pagefault.c
index 730eec07795e..2dd7065ce54a 100644
--- a/drivers/gpu/drm/xe/xe_gt_pagefault.c
+++ b/drivers/gpu/drm/xe/xe_gt_pagefault.c
@@ -304,6 +304,21 @@ static bool pf_queue_full(struct pf_queue *pf_queue)
 		PF_MSG_LEN_DW;
 }
 
+/**
+ * xe_gt_pagefault_flush() - Flush page faults for a VM
+ * @gt: the GT object
+ * @vm: the VM objecy
+ *
+ * Ensure all page faults per GT and VM pair are done executing.
+ */
+void xe_gt_pagefault_flush(struct xe_gt *gt, struct xe_vm *vm)
+{
+	struct pf_queue *pf_queue = gt->usm.pf_queue +
+		(vm->usm.asid % NUM_PF_QUEUE);
+
+	flush_work(&pf_queue->worker);
+}
+
 int xe_guc_pagefault_handler(struct xe_guc *guc, u32 *msg, u32 len)
 {
 	struct xe_gt *gt = guc_to_gt(guc);
diff --git a/drivers/gpu/drm/xe/xe_gt_pagefault.h b/drivers/gpu/drm/xe/xe_gt_pagefault.h
index 839c065a5e4c..9f4166617f04 100644
--- a/drivers/gpu/drm/xe/xe_gt_pagefault.h
+++ b/drivers/gpu/drm/xe/xe_gt_pagefault.h
@@ -10,8 +10,10 @@
 
 struct xe_gt;
 struct xe_guc;
+struct xe_vm;
 
 int xe_gt_pagefault_init(struct xe_gt *gt);
+void xe_gt_pagefault_flush(struct xe_gt *gt, struct xe_vm *vm);
 void xe_gt_pagefault_reset(struct xe_gt *gt);
 int xe_guc_pagefault_handler(struct xe_guc *guc, u32 *msg, u32 len);
 int xe_guc_access_counter_notify_handler(struct xe_guc *guc, u32 *msg, u32 len);
diff --git a/drivers/gpu/drm/xe/xe_vm.c b/drivers/gpu/drm/xe/xe_vm.c
index 7acd5fc9d032..5139a731ae79 100644
--- a/drivers/gpu/drm/xe/xe_vm.c
+++ b/drivers/gpu/drm/xe/xe_vm.c
@@ -1543,6 +1543,13 @@ void xe_vm_close_and_put(struct xe_vm *vm)
 	xe_vm_close(vm);
 	if (xe_vm_in_preempt_fence_mode(vm))
 		flush_work(&vm->preempt.rebind_work);
+	if (xe_vm_in_fault_mode(vm)) {
+		struct xe_gt *gt;
+
+		/* Stop all async faults */
+		for_each_gt(gt, xe, id)
+			xe_gt_pagefault_flush(gt, vm);
+	}
 
 	down_write(&vm->lock);
 	for_each_tile(tile, xe, id) {
-- 
2.34.1



More information about the Intel-xe mailing list