drm/msm: Acquire reservation lock in GEM pin/unpin callback
authorThomas Zimmermann <tzimmermann@suse.de>
Tue, 27 Feb 2024 10:14:51 +0000 (11:14 +0100)
committerThomas Zimmermann <tzimmermann@suse.de>
Mon, 11 Mar 2024 12:33:50 +0000 (13:33 +0100)
Export msm_gem_pin_pages_locked() and acquire the reservation lock
directly in GEM pin callback. Same for unpin. Prepares for further
changes.

Dma-buf locking semantics require callers to hold the buffer's
reservation lock when invoking the pin and unpin callbacks. Prepare
msm accordingly by pushing locking out of the implementation. A
follow-up patch will fix locking for all GEM code at once.

Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de>
Reviewed-by: Dmitry Osipenko <dmitry.osipenko@collabora.com>
Tested-by: Dmitry Osipenko <dmitry.osipenko@collabora.com> # virtio-gpu
Acked-by: Christian König <christian.koenig@amd.com>
Acked-by: Zack Rusin <zack.rusin@broadcom.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20240227113853.8464-5-tzimmermann@suse.de
drivers/gpu/drm/msm/msm_gem.c
drivers/gpu/drm/msm/msm_gem.h
drivers/gpu/drm/msm/msm_gem_prime.c

index bb729353d3a8d4cf72dda82412e03ca3bc5a8629..a5c6498a43f066901270aa376ff3e4d4c0c35013 100644 (file)
@@ -257,24 +257,24 @@ static void pin_obj_locked(struct drm_gem_object *obj)
        mutex_unlock(&priv->lru.lock);
 }
 
-struct page **msm_gem_pin_pages(struct drm_gem_object *obj)
+struct page **msm_gem_pin_pages_locked(struct drm_gem_object *obj)
 {
        struct page **p;
 
-       msm_gem_lock(obj);
+       msm_gem_assert_locked(obj);
+
        p = msm_gem_get_pages_locked(obj, MSM_MADV_WILLNEED);
        if (!IS_ERR(p))
                pin_obj_locked(obj);
-       msm_gem_unlock(obj);
 
        return p;
 }
 
-void msm_gem_unpin_pages(struct drm_gem_object *obj)
+void msm_gem_unpin_pages_locked(struct drm_gem_object *obj)
 {
-       msm_gem_lock(obj);
+       msm_gem_assert_locked(obj);
+
        msm_gem_unpin_locked(obj);
-       msm_gem_unlock(obj);
 }
 
 static pgprot_t msm_gem_pgprot(struct msm_gem_object *msm_obj, pgprot_t prot)
index 8d414b072c29da32984fba5ab566f6ae06b97a58..85f0257e83dab6f6cf38753270a0d068fd785dc7 100644 (file)
@@ -140,8 +140,8 @@ int msm_gem_get_and_pin_iova(struct drm_gem_object *obj,
 void msm_gem_unpin_iova(struct drm_gem_object *obj,
                struct msm_gem_address_space *aspace);
 void msm_gem_pin_obj_locked(struct drm_gem_object *obj);
-struct page **msm_gem_pin_pages(struct drm_gem_object *obj);
-void msm_gem_unpin_pages(struct drm_gem_object *obj);
+struct page **msm_gem_pin_pages_locked(struct drm_gem_object *obj);
+void msm_gem_unpin_pages_locked(struct drm_gem_object *obj);
 int msm_gem_dumb_create(struct drm_file *file, struct drm_device *dev,
                struct drm_mode_create_dumb *args);
 int msm_gem_dumb_map_offset(struct drm_file *file, struct drm_device *dev,
index 0915f3b68752e34702ae8864249d049e3b277ee2..0d22df53ab98a032aa997f042d4ea1ea9e3d1dd2 100644 (file)
@@ -47,13 +47,27 @@ struct drm_gem_object *msm_gem_prime_import_sg_table(struct drm_device *dev,
 
 int msm_gem_prime_pin(struct drm_gem_object *obj)
 {
-       if (!obj->import_attach)
-               msm_gem_pin_pages(obj);
-       return 0;
+       struct page **pages;
+       int ret = 0;
+
+       if (obj->import_attach)
+               return 0;
+
+       msm_gem_lock(obj);
+       pages = msm_gem_pin_pages_locked(obj);
+       if (IS_ERR(pages))
+               ret = PTR_ERR(pages);
+       msm_gem_unlock(obj);
+
+       return ret;
 }
 
 void msm_gem_prime_unpin(struct drm_gem_object *obj)
 {
-       if (!obj->import_attach)
-               msm_gem_unpin_pages(obj);
+       if (obj->import_attach)
+               return;
+
+       msm_gem_lock(obj);
+       msm_gem_unpin_pages_locked(obj);
+       msm_gem_unlock(obj);
 }