[PATCH 3/4] drm/xe: Fix small leak in migration error path.
Maarten Lankhorst
dev at lankhorst.se
Fri May 2 09:35:12 UTC 2025
When logical_mask or hwe are zero, we should call xe_vm_close_and_put,
and on error, m->pt_bo is also not cleared.
Also call xe_bo_unpin_map_no_vm even though it is a vm bo,
to ensure the BO is freed.
Signed-off-by: Maarten Lankhorst <dev at lankhorst.se>
---
drivers/gpu/drm/xe/xe_migrate.c | 60 +++++++++++++++++++--------------
1 file changed, 35 insertions(+), 25 deletions(-)
diff --git a/drivers/gpu/drm/xe/xe_migrate.c b/drivers/gpu/drm/xe/xe_migrate.c
index 673a5d165482e..7ee27c9f77bac 100644
--- a/drivers/gpu/drm/xe/xe_migrate.c
+++ b/drivers/gpu/drm/xe/xe_migrate.c
@@ -386,6 +386,38 @@ static bool xe_migrate_needs_ccs_emit(struct xe_device *xe)
return xe_device_has_flat_ccs(xe) && !(GRAPHICS_VER(xe) >= 20 && IS_DGFX(xe));
}
+static struct xe_exec_queue *xe_migrate_create_queue(struct xe_tile *tile,
+ struct xe_vm *vm)
+{
+ struct xe_device *xe = tile_to_xe(tile);
+ struct xe_gt *primary_gt = tile->primary_gt;
+
+ if (xe->info.has_usm) {
+ struct xe_hw_engine *hwe = xe_gt_hw_engine(primary_gt,
+ XE_ENGINE_CLASS_COPY,
+ primary_gt->usm.reserved_bcs_instance,
+ false);
+ u32 logical_mask = xe_migrate_usm_logical_mask(primary_gt);
+
+ if (!hwe || !logical_mask)
+ return ERR_PTR(-EINVAL);
+
+ /*
+ * XXX: Currently only reserving 1 (likely slow) BCS instance on
+ * PVC, may want to revisit if performance is needed.
+ */
+ return xe_exec_queue_create(xe, vm, logical_mask, 1, hwe,
+ EXEC_QUEUE_FLAG_KERNEL |
+ EXEC_QUEUE_FLAG_PERMANENT |
+ EXEC_QUEUE_FLAG_HIGH_PRIORITY, 0);
+ } else {
+ return xe_exec_queue_create_class(xe, primary_gt, vm,
+ XE_ENGINE_CLASS_COPY,
+ EXEC_QUEUE_FLAG_KERNEL |
+ EXEC_QUEUE_FLAG_PERMANENT, 0);
+ }
+}
+
/**
* xe_migrate_init() - Initialize a migrate context
* @tile: Back-pointer to the tile we're initializing for.
@@ -395,7 +427,6 @@ static bool xe_migrate_needs_ccs_emit(struct xe_device *xe)
struct xe_migrate *xe_migrate_init(struct xe_tile *tile)
{
struct xe_device *xe = tile_to_xe(tile);
- struct xe_gt *primary_gt = tile->primary_gt;
struct xe_migrate *m;
struct xe_vm *vm;
int err;
@@ -420,32 +451,11 @@ struct xe_migrate *xe_migrate_init(struct xe_tile *tile)
return ERR_PTR(err);
}
- if (xe->info.has_usm) {
- struct xe_hw_engine *hwe = xe_gt_hw_engine(primary_gt,
- XE_ENGINE_CLASS_COPY,
- primary_gt->usm.reserved_bcs_instance,
- false);
- u32 logical_mask = xe_migrate_usm_logical_mask(primary_gt);
-
- if (!hwe || !logical_mask)
- return ERR_PTR(-EINVAL);
-
- /*
- * XXX: Currently only reserving 1 (likely slow) BCS instance on
- * PVC, may want to revisit if performance is needed.
- */
- m->q = xe_exec_queue_create(xe, vm, logical_mask, 1, hwe,
- EXEC_QUEUE_FLAG_KERNEL |
- EXEC_QUEUE_FLAG_PERMANENT |
- EXEC_QUEUE_FLAG_HIGH_PRIORITY, 0);
- } else {
- m->q = xe_exec_queue_create_class(xe, primary_gt, vm,
- XE_ENGINE_CLASS_COPY,
- EXEC_QUEUE_FLAG_KERNEL |
- EXEC_QUEUE_FLAG_PERMANENT, 0);
- }
+ m->q = xe_migrate_create_queue(tile, vm);
if (IS_ERR(m->q)) {
+ xe_bo_unpin_map_no_vm(m->pt_bo);
xe_vm_close_and_put(vm);
+ drm_suballoc_manager_fini(&m->vm_update_sa);
return ERR_CAST(m->q);
}
--
2.45.2
More information about the Intel-xe
mailing list