drm/gem: Inline drm_gem_pin() into PRIME helpers

Inline drm_gem_pin() into its only caller drm_gem_map_attach()
and update the documentation in the callback's purpose. Do the
equivalent for drm_gem_unpin(). Also add stricter error checking
on the involved locking.

The pin operation in the GEM object functions is a helper for
PRIME-exported buffer objects. Having drm_gem_pin() gives the
impression of a general-purpose interface, which is not the case.
Removing it makes the pin callback a bit harder to misuse.

v2:
- clarify comment on pin callback (Dmitry)

Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de>
Reviewed-by: Dmitry Osipenko <dmitry.osipenko@collabora.com>
Link: https://lore.kernel.org/r/20250526132634.531789-5-tzimmermann@suse.de
This commit is contained in:
Thomas Zimmermann 2025-05-26 15:25:20 +02:00
parent 3c89f2d85c
commit df1c3093ae
4 changed files with 22 additions and 39 deletions

View file

@ -1184,38 +1184,6 @@ void drm_gem_print_info(struct drm_printer *p, unsigned int indent,
obj->funcs->print_info(p, indent, obj);
}
int drm_gem_pin_locked(struct drm_gem_object *obj)
{
if (obj->funcs->pin)
return obj->funcs->pin(obj);
return 0;
}
void drm_gem_unpin_locked(struct drm_gem_object *obj)
{
if (obj->funcs->unpin)
obj->funcs->unpin(obj);
}
int drm_gem_pin(struct drm_gem_object *obj)
{
int ret;
dma_resv_lock(obj->resv, NULL);
ret = drm_gem_pin_locked(obj);
dma_resv_unlock(obj->resv);
return ret;
}
void drm_gem_unpin(struct drm_gem_object *obj)
{
dma_resv_lock(obj->resv, NULL);
drm_gem_unpin_locked(obj);
dma_resv_unlock(obj->resv);
}
int drm_gem_vmap_locked(struct drm_gem_object *obj, struct iosys_map *map)
{
int ret;

View file

@ -175,10 +175,6 @@ void drm_gem_release(struct drm_device *dev, struct drm_file *file_private);
void drm_gem_print_info(struct drm_printer *p, unsigned int indent,
const struct drm_gem_object *obj);
int drm_gem_pin_locked(struct drm_gem_object *obj);
void drm_gem_unpin_locked(struct drm_gem_object *obj);
int drm_gem_pin(struct drm_gem_object *obj);
void drm_gem_unpin(struct drm_gem_object *obj);
int drm_gem_vmap_locked(struct drm_gem_object *obj, struct iosys_map *map);
void drm_gem_vunmap_locked(struct drm_gem_object *obj, struct iosys_map *map);

View file

@ -599,6 +599,7 @@ int drm_gem_map_attach(struct dma_buf *dma_buf,
struct dma_buf_attachment *attach)
{
struct drm_gem_object *obj = dma_buf->priv;
int ret;
/*
* drm_gem_map_dma_buf() requires obj->get_sg_table(), but drivers
@ -608,7 +609,16 @@ int drm_gem_map_attach(struct dma_buf *dma_buf,
!obj->funcs->get_sg_table)
return -ENOSYS;
return drm_gem_pin(obj);
if (!obj->funcs->pin)
return 0;
ret = dma_resv_lock(obj->resv, NULL);
if (ret)
return ret;
ret = obj->funcs->pin(obj);
dma_resv_unlock(obj->resv);
return ret;
}
EXPORT_SYMBOL(drm_gem_map_attach);
@ -625,8 +635,16 @@ void drm_gem_map_detach(struct dma_buf *dma_buf,
struct dma_buf_attachment *attach)
{
struct drm_gem_object *obj = dma_buf->priv;
int ret;
drm_gem_unpin(obj);
if (!obj->funcs->unpin)
return;
ret = dma_resv_lock(obj->resv, NULL);
if (drm_WARN_ON(obj->dev, ret))
return;
obj->funcs->unpin(obj);
dma_resv_unlock(obj->resv);
}
EXPORT_SYMBOL(drm_gem_map_detach);

View file

@ -126,7 +126,8 @@ struct drm_gem_object_funcs {
/**
* @pin:
*
* Pin backing buffer in memory. Used by the drm_gem_map_attach() helper.
* Pin backing buffer in memory, such that dma-buf importers can
* access it. Used by the drm_gem_map_attach() helper.
*
* This callback is optional.
*/