[Intel-xe] [CI v8 12/18] drm/xe: Adjust to commit drm/gpuvm: reference count drm_gpuvm structures

Dafna Hirschfeld dhirschfeld at habana.ai
Mon Nov 13 06:14:43 UTC 2023


On 03.11.2023 16:32, Thomas Hellström wrote:
>Signed-off-by: Thomas Hellström <thomas.hellstrom at linux.intel.com>
>---
> drivers/gpu/drm/xe/xe_vm.c       | 30 ++++++++++++------------------
> drivers/gpu/drm/xe/xe_vm.h       |  5 ++---
> drivers/gpu/drm/xe/xe_vm_types.h |  2 --
> 3 files changed, 14 insertions(+), 23 deletions(-)
>
>diff --git a/drivers/gpu/drm/xe/xe_vm.c b/drivers/gpu/drm/xe/xe_vm.c
>index 46a87a4e42d8..bb44e5ca224a 100644
>--- a/drivers/gpu/drm/xe/xe_vm.c
>+++ b/drivers/gpu/drm/xe/xe_vm.c
>@@ -1197,8 +1197,11 @@ static struct drm_gpuva_op *xe_vm_op_alloc(void)
> 	return &op->base;
> }
>
>+static void xe_vm_free(struct drm_gpuvm *gpuvm);
>+
> static struct drm_gpuvm_ops gpuvm_ops = {
> 	.op_alloc = xe_vm_op_alloc,
>+	.vm_free = xe_vm_free,
> };
>
> static u64 pde_encode_pat_index(struct xe_device *xe, u16 pat_index)
>@@ -1346,7 +1349,6 @@ struct xe_vm *xe_vm_create(struct xe_device *xe, u32 flags)
> 		return ERR_PTR(-ENOMEM);
>
> 	vm->xe = xe;
>-	kref_init(&vm->refcount);
>
> 	vm->size = 1ull << xe->info.va_bits;
>
>@@ -1498,7 +1500,7 @@ struct xe_vm *xe_vm_create(struct xe_device *xe, u32 flags)
> 	}
> 	dma_resv_unlock(xe_vm_resv(vm));
> err_put:
>-	drm_gpuvm_destroy(&vm->gpuvm);
>+	//	drm_gpuvm_destroy(&vm->gpuvm);

This should be somehow replaced with xe_vm_put

Dafna,

> err_no_resv:
> 	for_each_tile(tile, xe, id)
> 		xe_range_fence_tree_fini(&vm->rftree[id]);
>@@ -1586,6 +1588,10 @@ void xe_vm_close_and_put(struct xe_vm *vm)
> 				xe_pt_destroy(vm->scratch_pt[id][i], vm->flags,
> 					      NULL);
> 		}
>+		if (vm->pt_root[id]) {
>+			xe_pt_destroy(vm->pt_root[id], vm->flags, NULL);
>+			vm->pt_root[id] = NULL;
>+		}
> 	}
> 	xe_vm_unlock(vm);
>
>@@ -1639,29 +1645,17 @@ static void vm_destroy_work_func(struct work_struct *w)
> 		}
> 	}
>
>-	/*
>-	 * XXX: We delay destroying the PT root until the VM if freed as PT root
>-	 * is needed for xe_vm_lock to work. If we remove that dependency this
>-	 * can be moved to xe_vm_close_and_put.
>-	 */
>-	xe_vm_lock(vm, false);
>-	for_each_tile(tile, xe, id) {
>-		if (vm->pt_root[id]) {
>-			xe_pt_destroy(vm->pt_root[id], vm->flags, NULL);
>-			vm->pt_root[id] = NULL;
>-		}
>-	}
>-	xe_vm_unlock(vm);
>+	for_each_tile(tile, xe, id)
>+		XE_WARN_ON(vm->pt_root[id]);
>
> 	trace_xe_vm_free(vm);
> 	dma_fence_put(vm->rebind_fence);
>-	drm_gpuvm_destroy(&vm->gpuvm);
> 	kfree(vm);
> }
>
>-void xe_vm_free(struct kref *ref)
>+static void xe_vm_free(struct drm_gpuvm *gpuvm)
> {
>-	struct xe_vm *vm = container_of(ref, struct xe_vm, refcount);
>+	struct xe_vm *vm = container_of(gpuvm, struct xe_vm, gpuvm);
>
> 	/* To destroy the VM we need to be able to sleep */
> 	queue_work(system_unbound_wq, &vm->destroy_work);
>diff --git a/drivers/gpu/drm/xe/xe_vm.h b/drivers/gpu/drm/xe/xe_vm.h
>index 88077214261f..a348dc56027c 100644
>--- a/drivers/gpu/drm/xe/xe_vm.h
>+++ b/drivers/gpu/drm/xe/xe_vm.h
>@@ -24,20 +24,19 @@ struct xe_sync_entry;
> struct drm_exec;
>
> struct xe_vm *xe_vm_create(struct xe_device *xe, u32 flags);
>-void xe_vm_free(struct kref *ref);
>
> struct xe_vm *xe_vm_lookup(struct xe_file *xef, u32 id);
> int xe_vma_cmp_vma_cb(const void *key, const struct rb_node *node);
>
> static inline struct xe_vm *xe_vm_get(struct xe_vm *vm)
> {
>-	kref_get(&vm->refcount);
>+	drm_gpuvm_get(&vm->gpuvm);
> 	return vm;
> }
>
> static inline void xe_vm_put(struct xe_vm *vm)
> {
>-	kref_put(&vm->refcount, xe_vm_free);
>+	drm_gpuvm_put(&vm->gpuvm);
> }
>
> int xe_vm_lock(struct xe_vm *vm, bool intr);
>diff --git a/drivers/gpu/drm/xe/xe_vm_types.h b/drivers/gpu/drm/xe/xe_vm_types.h
>index f11ac81cf010..d643dccf9e73 100644
>--- a/drivers/gpu/drm/xe/xe_vm_types.h
>+++ b/drivers/gpu/drm/xe/xe_vm_types.h
>@@ -137,8 +137,6 @@ struct xe_vm {
>
> 	struct xe_device *xe;
>
>-	struct kref refcount;
>-
> 	/* exec queue used for (un)binding vma's */
> 	struct xe_exec_queue *q[XE_MAX_TILES_PER_DEVICE];
>
>-- 
>2.41.0
>


More information about the Intel-xe mailing list