]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
drm/gem: Inline drm_gem_pin() into PRIME helpers
authorThomas Zimmermann <tzimmermann@suse.de>
Mon, 26 May 2025 13:25:20 +0000 (15:25 +0200)
committerThomas Zimmermann <tzimmermann@suse.de>
Fri, 30 May 2025 07:47:28 +0000 (09:47 +0200)
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
drivers/gpu/drm/drm_gem.c
drivers/gpu/drm/drm_internal.h
drivers/gpu/drm/drm_prime.c
include/drm/drm_gem.h

index 1e659d2660f73e7601c9264a141477f8bf120816..a0a3b6baa56903c503d833d2563b02e3b5761a7d 100644 (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;
index e44f28fd81d34bad28b2b3910edcbbf6306e87ae..442eb31351ddd998652b4758e2546a82422e1937 100644 (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);
 
index d828502268b8e6869f9efd264b3b0cd119c9c90e..a1852c02f5123f165c0073e73fc98d5c99f37414 100644 (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);
 
index a3133a08267cb7c787df61aaeb36d38855b2b75b..1a79ec3fe45c940d91d790f9ff42e5519f1e909c 100644 (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.
         */