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

Boris Brezillon boris.brezillon at collabora.com
Tue Dec 5 10:45:21 UTC 2023


On Tue, 5 Dec 2023 02:46:32 +0100
Danilo Krummrich <dakr at redhat.com> wrote:

> 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>

Queued to drm-misc-next.

> 
> > ---
> >   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