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
                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;
 
 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);
 
 
                       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
            !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);
 
                        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);
 
 
        /**
         * @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.
         */