From 12778a3f1b2ca055ff658864c538f944550c9adf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thomas=20Hellstr=C3=B6m?= Date: Thu, 14 Sep 2023 10:23:52 +0200 Subject: [PATCH] drm/gpuvm: Adjustment for extobj eviction. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Thomas Hellström --- drivers/gpu/drm/drm_gpuvm.c | 32 ++++++++++++++++++++++++-------- include/drm/drm_gpuvm.h | 7 ++++++- 2 files changed, 30 insertions(+), 9 deletions(-) diff --git a/drivers/gpu/drm/drm_gpuvm.c b/drivers/gpu/drm/drm_gpuvm.c index 11a0aee1c038..029c38d7fa4d 100644 --- a/drivers/gpu/drm/drm_gpuvm.c +++ b/drivers/gpu/drm/drm_gpuvm.c @@ -956,6 +956,11 @@ drm_gpuvm_prepare_objects(struct drm_gpuvm *gpuvm, ret = drm_exec_prepare_obj(exec, vm_bo->obj, num_fences); if (ret) break; + + if (vm_bo->evicted) { + drm_gpuvm_bo_list_add(vm_bo, evict); + vm_bo->evicted = false; + } } /* Drop ref in case we break out of the loop. */ drm_gpuvm_bo_put(vm_bo); @@ -1431,6 +1436,21 @@ drm_gpuvm_bo_extobj_add(struct drm_gpuvm_bo *vm_bo) } EXPORT_SYMBOL_GPL(drm_gpuvm_bo_extobj_add); +void +drm_gpuvm_bo_evict(struct drm_gpuvm_bo *vm_bo, bool evict) +{ + if (drm_gpuvm_is_extobj(vm_bo->vm, vm_bo->obj)) { + vm_bo->evicted = evict; + return; + } + + if (evict) + drm_gpuvm_bo_list_add(vm_bo, evict); + else + drm_gpuvm_bo_list_del(vm_bo, evict); +} +EXPORT_SYMBOL(drm_gpuvm_bo_evict); + /** * drm_gpuvm_bo_evict() - add / remove a &drm_gem_object to / from a * &drm_gpuvms evicted list @@ -1441,18 +1461,14 @@ EXPORT_SYMBOL_GPL(drm_gpuvm_bo_extobj_add); * list containing a mapping of this &drm_gem_object. */ void -drm_gpuvm_bo_evict(struct drm_gem_object *obj, bool evict) +drm_gpuvm_gem_evict(struct drm_gem_object *obj, bool evict) { struct drm_gpuvm_bo *vm_bo; - drm_gem_for_each_gpuvm_bo(vm_bo, obj) { - if (evict) - drm_gpuvm_bo_list_add(vm_bo, evict); - else - drm_gpuvm_bo_list_del(vm_bo, evict); - } + drm_gem_for_each_gpuvm_bo(vm_bo, obj) + drm_gpuvm_bo_evict(vm_bo, evict); } -EXPORT_SYMBOL_GPL(drm_gpuvm_bo_evict); +EXPORT_SYMBOL_GPL(drm_gpuvm_gem_evict); static int __drm_gpuva_insert(struct drm_gpuvm *gpuvm, diff --git a/include/drm/drm_gpuvm.h b/include/drm/drm_gpuvm.h index dce26a923d5d..c2216f18243f 100644 --- a/include/drm/drm_gpuvm.h +++ b/include/drm/drm_gpuvm.h @@ -550,6 +550,9 @@ struct drm_gpuvm_bo { */ struct kref kref; + /** @evicted: Whether the bo needs revalidation and rebinding. */ + bool evicted; + /** * @list: Structure containing all &list_heads. */ @@ -615,7 +618,9 @@ struct drm_gpuvm_bo * drm_gpuvm_bo_find(struct drm_gpuvm *gpuvm, struct drm_gem_object *obj); -void drm_gpuvm_bo_evict(struct drm_gem_object *obj, bool evict); +void drm_gpuvm_bo_evict(struct drm_gpuvm_bo *vm_bo, bool evict); + +void drm_gpuvm_gem_evict(struct drm_gem_object *obj, bool evict); void drm_gpuvm_bo_extobj_add(struct drm_gpuvm_bo *vm_bo); /** -- 2.41.0