[PATCH v2 2/2] drm/xe: Move ASID allocation and user PT BO tracking into xe_vm_create

Piórkowski, Piotr piotr.piorkowski at intel.com
Mon Aug 11 07:38:56 UTC 2025


From: Piotr Piórkowski <piotr.piorkowski at intel.com>

Currently, ASID assignment for user VMs and page-table BO accounting for
client memory tracking are performed in xe_vm_create_ioctl.
To consolidate VM object initialization, move this logic to
xe_vm_create.

No functional change intended.

Suggested-by: Matthew Auld <matthew.auld at intel.com>
Signed-off-by: Piotr Piórkowski <piotr.piorkowski at intel.com>
---
 drivers/gpu/drm/xe/xe_vm.c | 41 ++++++++++++++++++++------------------
 1 file changed, 22 insertions(+), 19 deletions(-)

diff --git a/drivers/gpu/drm/xe/xe_vm.c b/drivers/gpu/drm/xe/xe_vm.c
index 157e11bd2121..ae3a2871ede5 100644
--- a/drivers/gpu/drm/xe/xe_vm.c
+++ b/drivers/gpu/drm/xe/xe_vm.c
@@ -1795,6 +1795,27 @@ struct xe_vm *xe_vm_create(struct xe_device *xe, u32 flags, struct xe_file *xef)
 	if (number_tiles > 1)
 		vm->composite_fence_ctx = dma_fence_context_alloc(1);
 
+	if (vm->xef) {
+		if (xe->info.has_asid) {
+			u32 asid;
+
+			down_write(&xe->usm.lock);
+			err = xa_alloc_cyclic(&xe->usm.asid_to_vm, &asid, vm,
+					      XA_LIMIT(1, XE_MAX_ASID - 1),
+					&xe->usm.next_asid, GFP_KERNEL);
+			up_write(&xe->usm.lock);
+			if (err < 0)
+				goto err_unlock_close;
+
+			vm->usm.asid = asid;
+		}
+
+		/* Record BO memory for VM pagetable created against client */
+		for_each_tile(tile, xe, id)
+			if (vm->pt_root[id])
+				xe_drm_client_add_bo(vm->xef->client, vm->pt_root[id]->bo);
+	}
+
 	trace_xe_vm_create(vm);
 
 	return vm;
@@ -2062,9 +2083,8 @@ int xe_vm_create_ioctl(struct drm_device *dev, void *data,
 	struct xe_device *xe = to_xe_device(dev);
 	struct xe_file *xef = to_xe_file(file);
 	struct drm_xe_vm_create *args = data;
-	struct xe_tile *tile;
 	struct xe_vm *vm;
-	u32 id, asid;
+	u32 id;
 	int err;
 	u32 flags = 0;
 
@@ -2104,23 +2124,6 @@ int xe_vm_create_ioctl(struct drm_device *dev, void *data,
 	if (IS_ERR(vm))
 		return PTR_ERR(vm);
 
-	if (xe->info.has_asid) {
-		down_write(&xe->usm.lock);
-		err = xa_alloc_cyclic(&xe->usm.asid_to_vm, &asid, vm,
-				      XA_LIMIT(1, XE_MAX_ASID - 1),
-				      &xe->usm.next_asid, GFP_KERNEL);
-		up_write(&xe->usm.lock);
-		if (err < 0)
-			goto err_close_and_put;
-
-		vm->usm.asid = asid;
-	}
-
-	/* Record BO memory for VM pagetable created against client */
-	for_each_tile(tile, xe, id)
-		if (vm->pt_root[id])
-			xe_drm_client_add_bo(vm->xef->client, vm->pt_root[id]->bo);
-
 #if IS_ENABLED(CONFIG_DRM_XE_DEBUG_MEM)
 	/* Warning: Security issue - never enable by default */
 	args->reserved[0] = xe_bo_main_addr(vm->pt_root[0]->bo, XE_PAGE_SIZE);
-- 
2.34.1



More information about the Intel-xe mailing list