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

Matthew Auld matthew.auld at intel.com
Mon Aug 11 13:19:18 UTC 2025


On 11/08/2025 11:43, Piórkowski, Piotr wrote:
> 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.
> 
> v2:
>   - removed unnecessary duplicate BO tracking code
>   - using the local variable xef to verify whether the VM is being created
>     by userspace
> 
> Suggested-by: Matthew Auld <matthew.auld at intel.com>
> Signed-off-by: Piotr Piórkowski <piotr.piorkowski at intel.com>

Having the vm initialisation fully contained within vm_create() seems 
less error prone to me.

Reviewed-by: Matthew Auld <matthew.auld at intel.com>

> ---
>   drivers/gpu/drm/xe/xe_vm.c | 34 +++++++++++++++-------------------
>   1 file changed, 15 insertions(+), 19 deletions(-)
> 
> diff --git a/drivers/gpu/drm/xe/xe_vm.c b/drivers/gpu/drm/xe/xe_vm.c
> index 157e11bd2121..486d345b82de 100644
> --- a/drivers/gpu/drm/xe/xe_vm.c
> +++ b/drivers/gpu/drm/xe/xe_vm.c
> @@ -1795,6 +1795,20 @@ 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 (xef && 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;
> +	}
> +
>   	trace_xe_vm_create(vm);
>   
>   	return vm;
> @@ -2062,9 +2076,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 +2117,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);



More information about the Intel-xe mailing list