mirror of
git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2025-09-04 20:19:47 +08:00
drm/xe: Move ASID allocation and user PT BO tracking into xe_vm_create
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
Fixes: 658a1c8e0a
("drm/xe: Assign ioctl xe file handler to vm in xe_vm_create")
Suggested-by: Matthew Auld <matthew.auld@intel.com>
Signed-off-by: Piotr Piórkowski <piotr.piorkowski@intel.com>
Reviewed-by: Matthew Auld <matthew.auld@intel.com>
Link: https://lore.kernel.org/r/20250811104358.2064150-3-piotr.piorkowski@intel.com
Signed-off-by: Michał Winiarski <michal.winiarski@intel.com>
(cherry picked from commit 30e0c3f43a414616e0b6ca76cf7f7b2cd387e1d4)
Signed-off-by: Rodrigo Vivi <rodrigo.vivi@intel.com>
[Rodrigo: Added fixes tag]
This commit is contained in:
parent
658a1c8e0a
commit
8a30114073
@ -1795,6 +1795,20 @@ struct xe_vm *xe_vm_create(struct xe_device *xe, u32 flags, struct xe_file *xef)
|
|||||||
if (number_tiles > 1)
|
if (number_tiles > 1)
|
||||||
vm->composite_fence_ctx = dma_fence_context_alloc(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);
|
trace_xe_vm_create(vm);
|
||||||
|
|
||||||
return 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_device *xe = to_xe_device(dev);
|
||||||
struct xe_file *xef = to_xe_file(file);
|
struct xe_file *xef = to_xe_file(file);
|
||||||
struct drm_xe_vm_create *args = data;
|
struct drm_xe_vm_create *args = data;
|
||||||
struct xe_tile *tile;
|
|
||||||
struct xe_vm *vm;
|
struct xe_vm *vm;
|
||||||
u32 id, asid;
|
u32 id;
|
||||||
int err;
|
int err;
|
||||||
u32 flags = 0;
|
u32 flags = 0;
|
||||||
|
|
||||||
@ -2104,23 +2117,6 @@ int xe_vm_create_ioctl(struct drm_device *dev, void *data,
|
|||||||
if (IS_ERR(vm))
|
if (IS_ERR(vm))
|
||||||
return PTR_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)
|
#if IS_ENABLED(CONFIG_DRM_XE_DEBUG_MEM)
|
||||||
/* Warning: Security issue - never enable by default */
|
/* Warning: Security issue - never enable by default */
|
||||||
args->reserved[0] = xe_bo_main_addr(vm->pt_root[0]->bo, XE_PAGE_SIZE);
|
args->reserved[0] = xe_bo_main_addr(vm->pt_root[0]->bo, XE_PAGE_SIZE);
|
||||||
|
Loading…
Reference in New Issue
Block a user