[PATCH] drm/gpuvm: Let drm_gpuvm_bo_put() report when the vm_bo object is destroyed

Danilo Krummrich dakr at redhat.com
Tue Dec 5 01:46:32 UTC 2023


On 12/4/23 16:14, Boris Brezillon wrote:
> Some users need to release resources attached to the vm_bo object when
> it's destroyed. In Panthor's case, we need to release the pin ref so
> BO pages can be returned to the system when all GPU mappings are gone.
> 
> This could be done through a custom drm_gpuvm::vm_bo_free() hook, but
> this has all sort of locking implications that would force us to expose
> a drm_gem_shmem_unpin_locked() helper, not to mention the fact that
> having a ::vm_bo_free() implementation without a ::vm_bo_alloc() one
> seems odd. So let's keep things simple, and extend drm_gpuvm_bo_put()
> to report when the object is destroyed.
> 
> Signed-off-by: Boris Brezillon <boris.brezillon at collabora.com>

Reviewed-by: Danilo Krummrich <dakr at redhat.com>

> ---
>   drivers/gpu/drm/drm_gpuvm.c | 8 ++++++--
>   include/drm/drm_gpuvm.h     | 2 +-
>   2 files changed, 7 insertions(+), 3 deletions(-)
> 
> diff --git a/drivers/gpu/drm/drm_gpuvm.c b/drivers/gpu/drm/drm_gpuvm.c
> index 54f5e8851de5..ae13e2d63637 100644
> --- a/drivers/gpu/drm/drm_gpuvm.c
> +++ b/drivers/gpu/drm/drm_gpuvm.c
> @@ -1502,14 +1502,18 @@ drm_gpuvm_bo_destroy(struct kref *kref)
>    * hold the dma-resv or driver specific GEM gpuva lock.
>    *
>    * This function may only be called from non-atomic context.
> + *
> + * Returns: true if vm_bo was destroyed, false otherwise.
>    */
> -void
> +bool
>   drm_gpuvm_bo_put(struct drm_gpuvm_bo *vm_bo)
>   {
>   	might_sleep();
>   
>   	if (vm_bo)
> -		kref_put(&vm_bo->kref, drm_gpuvm_bo_destroy);
> +		return !!kref_put(&vm_bo->kref, drm_gpuvm_bo_destroy);
> +
> +	return false;
>   }
>   EXPORT_SYMBOL_GPL(drm_gpuvm_bo_put);
>   
> diff --git a/include/drm/drm_gpuvm.h b/include/drm/drm_gpuvm.h
> index f94fec9a8517..7cc41a7d86d5 100644
> --- a/include/drm/drm_gpuvm.h
> +++ b/include/drm/drm_gpuvm.h
> @@ -738,7 +738,7 @@ drm_gpuvm_bo_get(struct drm_gpuvm_bo *vm_bo)
>   	return vm_bo;
>   }
>   
> -void drm_gpuvm_bo_put(struct drm_gpuvm_bo *vm_bo);
> +bool drm_gpuvm_bo_put(struct drm_gpuvm_bo *vm_bo);
>   
>   struct drm_gpuvm_bo *
>   drm_gpuvm_bo_find(struct drm_gpuvm *gpuvm,



More information about the dri-devel mailing list