drm/qxl: Provide qxl_bo_{pin,unpin}_locked()
authorThomas Zimmermann <tzimmermann@suse.de>
Tue, 27 Feb 2024 10:14:54 +0000 (11:14 +0100)
committerThomas Zimmermann <tzimmermann@suse.de>
Mon, 11 Mar 2024 12:33:50 +0000 (13:33 +0100)
Rename __qxl_bo_pin() to qxl_bo_pin_locked() and update all callers.
The function will be helpful for implementing the GEM pin callback
with correct semantics. Same for __qxl_bo_unpin().

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-8-tzimmermann@suse.de
drivers/gpu/drm/qxl/qxl_object.c
drivers/gpu/drm/qxl/qxl_object.h

index 1e46b0a6e47871465dd6fbb4a9f97970ead95dc5..39218e979a807ad2a3f6a52a8bdf4625f5344a0c 100644 (file)
@@ -29,9 +29,6 @@
 #include "qxl_drv.h"
 #include "qxl_object.h"
 
-static int __qxl_bo_pin(struct qxl_bo *bo);
-static void __qxl_bo_unpin(struct qxl_bo *bo);
-
 static void qxl_ttm_bo_destroy(struct ttm_buffer_object *tbo)
 {
        struct qxl_bo *bo;
@@ -167,13 +164,13 @@ int qxl_bo_vmap_locked(struct qxl_bo *bo, struct iosys_map *map)
                goto out;
        }
 
-       r = __qxl_bo_pin(bo);
+       r = qxl_bo_pin_locked(bo);
        if (r)
                return r;
 
        r = ttm_bo_vmap(&bo->tbo, &bo->map);
        if (r) {
-               __qxl_bo_unpin(bo);
+               qxl_bo_unpin_locked(bo);
                return r;
        }
        bo->map_count = 1;
@@ -246,7 +243,7 @@ void qxl_bo_vunmap_locked(struct qxl_bo *bo)
                return;
        bo->kptr = NULL;
        ttm_bo_vunmap(&bo->tbo, &bo->map);
-       __qxl_bo_unpin(bo);
+       qxl_bo_unpin_locked(bo);
 }
 
 int qxl_bo_vunmap(struct qxl_bo *bo)
@@ -290,12 +287,14 @@ struct qxl_bo *qxl_bo_ref(struct qxl_bo *bo)
        return bo;
 }
 
-static int __qxl_bo_pin(struct qxl_bo *bo)
+int qxl_bo_pin_locked(struct qxl_bo *bo)
 {
        struct ttm_operation_ctx ctx = { false, false };
        struct drm_device *ddev = bo->tbo.base.dev;
        int r;
 
+       dma_resv_assert_held(bo->tbo.base.resv);
+
        if (bo->tbo.pin_count) {
                ttm_bo_pin(&bo->tbo);
                return 0;
@@ -309,14 +308,16 @@ static int __qxl_bo_pin(struct qxl_bo *bo)
        return r;
 }
 
-static void __qxl_bo_unpin(struct qxl_bo *bo)
+void qxl_bo_unpin_locked(struct qxl_bo *bo)
 {
+       dma_resv_assert_held(bo->tbo.base.resv);
+
        ttm_bo_unpin(&bo->tbo);
 }
 
 /*
  * Reserve the BO before pinning the object.  If the BO was reserved
- * beforehand, use the internal version directly __qxl_bo_pin.
+ * beforehand, use the internal version directly qxl_bo_pin_locked.
  *
  */
 int qxl_bo_pin(struct qxl_bo *bo)
@@ -327,14 +328,14 @@ int qxl_bo_pin(struct qxl_bo *bo)
        if (r)
                return r;
 
-       r = __qxl_bo_pin(bo);
+       r = qxl_bo_pin_locked(bo);
        qxl_bo_unreserve(bo);
        return r;
 }
 
 /*
  * Reserve the BO before pinning the object.  If the BO was reserved
- * beforehand, use the internal version directly __qxl_bo_unpin.
+ * beforehand, use the internal version directly qxl_bo_unpin_locked.
  *
  */
 int qxl_bo_unpin(struct qxl_bo *bo)
@@ -345,7 +346,7 @@ int qxl_bo_unpin(struct qxl_bo *bo)
        if (r)
                return r;
 
-       __qxl_bo_unpin(bo);
+       qxl_bo_unpin_locked(bo);
        qxl_bo_unreserve(bo);
        return 0;
 }
index 53392cb90eecf9ca6ed17984e7ac837f3f419469..1cf5bc759101646a3d2e9f286d839640b84163a1 100644 (file)
@@ -67,6 +67,8 @@ void *qxl_bo_kmap_atomic_page(struct qxl_device *qdev, struct qxl_bo *bo, int pa
 void qxl_bo_kunmap_atomic_page(struct qxl_device *qdev, struct qxl_bo *bo, void *map);
 extern struct qxl_bo *qxl_bo_ref(struct qxl_bo *bo);
 extern void qxl_bo_unref(struct qxl_bo **bo);
+extern int qxl_bo_pin_locked(struct qxl_bo *bo);
+extern void qxl_bo_unpin_locked(struct qxl_bo *bo);
 extern int qxl_bo_pin(struct qxl_bo *bo);
 extern int qxl_bo_unpin(struct qxl_bo *bo);
 extern void qxl_ttm_placement_from_domain(struct qxl_bo *qbo, u32 domain);