Intel-XE Archive on lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH] drm/xe: Keep ulls alive while servicing ops.
@ 2026-11-02 18:58 Maarten Lankhorst
  2026-11-02 19:09 ` ✓ CI.KUnit: success for " Patchwork
                   ` (3 more replies)
  0 siblings, 4 replies; 5+ messages in thread
From: Maarten Lankhorst @ 2026-11-02 18:58 UTC (permalink / raw)
  To: intel-xe; +Cc: Maarten Lankhorst

Instead of bumping at the start, when performing a lot of work ulls may
run longer, so keep track using a refcount to keep the full benefit of
ulls.

Signed-off-by: Maarten Lankhorst <dev@lankhorst.se>
---
 drivers/gpu/drm/xe/xe_migrate.c   | 32 ++++++++++++++++++++++++++++++-
 drivers/gpu/drm/xe/xe_migrate.h   |  1 +
 drivers/gpu/drm/xe/xe_pagefault.c |  1 +
 drivers/gpu/drm/xe/xe_vm.c        |  6 ++++--
 4 files changed, 37 insertions(+), 3 deletions(-)

diff --git a/drivers/gpu/drm/xe/xe_migrate.c b/drivers/gpu/drm/xe/xe_migrate.c
index 19c37eb315893..308bc52e1be52 100644
--- a/drivers/gpu/drm/xe/xe_migrate.c
+++ b/drivers/gpu/drm/xe/xe_migrate.c
@@ -209,6 +209,8 @@ struct xe_migrate {
 	struct xe_tile *tile;
 	/** @job_mutex: Timeline mutex for @eng. */
 	struct mutex job_mutex;
+	/** @ulls_used: How many outstanding ulls operations there are */
+	atomic_t ulls_used;
 	/** @pt_bo: Page-table buffer object. */
 	struct xe_bo *pt_bo;
 	/** @batch_base_ofs: VM offset of the migration batch buffer */
@@ -679,6 +681,8 @@ static struct dma_fence *xe_migrate_job_push(struct xe_migrate *m,
  *
  * If DGFX, enter ULLS mode bypassing GuC / HW context switches by utilizing
  * semaphore and continuously running batches.
+ *
+ * Pairs with xe_migrate_ulls_leave().
  */
 void xe_migrate_ulls_enter(struct xe_migrate *m)
 {
@@ -692,6 +696,12 @@ void xe_migrate_ulls_enter(struct xe_migrate *m)
 	if (!IS_DGFX(xe) || !m->ulls.exit_ms)
 		return;
 
+	/* Bump */
+	if (atomic_inc_return(&m->ulls_used) > 1)
+		return;
+
+	cancel_delayed_work_sync(&m->ulls.exit_work);
+
 job_alloc:
 	if (alloc) {
 		/*
@@ -725,10 +735,30 @@ void xe_migrate_ulls_enter(struct xe_migrate *m)
 	}
 	if (job)
 		xe_sched_job_put(job);
+	mutex_unlock(&m->job_mutex);
+}
+
+/**
+ * xe_migrate_ulls_leave() - Leave ULLS mode
+ * @m: The migration context.
+ *
+ * Leaves the critical part of the migration context, it may continue to be enabled.
+ * Pairs with xe_migrate_ulls_enter().
+ */
+void xe_migrate_ulls_leave(struct xe_migrate *m)
+{
+	struct xe_device *xe = tile_to_xe(m->tile);
+
+	if (!IS_DGFX(xe) || !m->ulls.exit_ms)
+		return;
+
+	if (atomic_dec_return(&m->ulls_used))
+		return;
+
+	guard(mutex)(&m->job_mutex);
 	if (xe_migrate_ulls_enabled(m))
 		mod_delayed_work(system_percpu_wq, &m->ulls.exit_work,
 				 ULLS_EXIT_JIFFIES(m));
-	mutex_unlock(&m->job_mutex);
 }
 
 static void xe_migrate_ulls_exit(struct work_struct *work)
diff --git a/drivers/gpu/drm/xe/xe_migrate.h b/drivers/gpu/drm/xe/xe_migrate.h
index 2e8be10fdb71f..c909e1afb476e 100644
--- a/drivers/gpu/drm/xe/xe_migrate.h
+++ b/drivers/gpu/drm/xe/xe_migrate.h
@@ -98,5 +98,6 @@ int xe_migrate_debug_ccs_overlap(struct xe_migrate *m,
 #endif
 
 void xe_migrate_ulls_enter(struct xe_migrate *m);
+void xe_migrate_ulls_leave(struct xe_migrate *m);
 
 #endif
diff --git a/drivers/gpu/drm/xe/xe_pagefault.c b/drivers/gpu/drm/xe/xe_pagefault.c
index 5247321c805ec..fa2bdb76cef7f 100644
--- a/drivers/gpu/drm/xe/xe_pagefault.c
+++ b/drivers/gpu/drm/xe/xe_pagefault.c
@@ -326,6 +326,7 @@ static int xe_pagefault_service(struct xe_pagefault *pf)
 					xe_pagefault_get_error(pf), err);
 
 	up_read(&vm->lock);
+	xe_migrate_ulls_leave(gt_to_tile(gt)->migrate);
 	xe_vm_put(vm);
 
 	return err;
diff --git a/drivers/gpu/drm/xe/xe_vm.c b/drivers/gpu/drm/xe/xe_vm.c
index a26f6b20a22e3..a3770709aef3d 100644
--- a/drivers/gpu/drm/xe/xe_vm.c
+++ b/drivers/gpu/drm/xe/xe_vm.c
@@ -2632,7 +2632,7 @@ vm_bind_ioctl_ops_create(struct xe_vm *vm, struct xe_vma_ops *vops,
 				if (addr)
 					goto alloc_next_range;
 				else
-					goto print_op_label;
+					goto ulls_leave;
 			}
 
 			if (IS_ERR(svm_range)) {
@@ -2678,8 +2678,10 @@ vm_bind_ioctl_ops_create(struct xe_vm *vm, struct xe_vma_ops *vops,
 			if (need_put)
 				xe_svm_range_put(svm_range);
 
+ulls_leave:
+			for_each_tile(tile, vm->xe, id)
+				xe_migrate_ulls_leave(tile->migrate);
 		}
-print_op_label:
 		print_op(vm->xe, __op);
 	}
 
-- 
2.55.0


^ permalink raw reply related	[flat|nested] 5+ messages in thread

end of thread, other threads:[~2026-11-05 15:51 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-11-02 18:58 [PATCH] drm/xe: Keep ulls alive while servicing ops Maarten Lankhorst
2026-11-02 19:09 ` ✓ CI.KUnit: success for " Patchwork
2026-11-02 20:01 ` ✓ Xe.CI.BAT: " Patchwork
2026-11-02 21:07 ` ✓ Xe.CI.FULL: " Patchwork
2026-11-05 15:51 ` [PATCH] " sashiko-bot

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox