[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