drm/ttm, drm/vmwgfx: move cpu_writers handling into vmwgfx
authorChristian König <christian.koenig@amd.com>
Tue, 1 Oct 2019 08:02:58 +0000 (10:02 +0200)
committerChristian König <christian.koenig@amd.com>
Fri, 25 Oct 2019 09:40:28 +0000 (11:40 +0200)
This feature is only used by vmwgfx and superfluous for everybody else.

Signed-off-by: Christian König <christian.koenig@amd.com>
Co-developed-by: Thomas Hellstrom <thellstrom@vmware.com>
Signed-off-by: Thomas Hellstrom <thellstrom@vmware.com>
Tested-by: Thomas Hellstrom <thellstrom@vmware.com>
Reviewed-by: Christian König <christian.koenig@amd.com>
Link: https://patchwork.freedesktop.org/patch/333650/
drivers/gpu/drm/ttm/ttm_bo.c
drivers/gpu/drm/ttm/ttm_bo_util.c
drivers/gpu/drm/ttm/ttm_execbuf_util.c
drivers/gpu/drm/vmwgfx/vmwgfx_bo.c
drivers/gpu/drm/vmwgfx/vmwgfx_drv.h
drivers/gpu/drm/vmwgfx/vmwgfx_validation.c
include/drm/ttm/ttm_bo_api.h

index f00b2e7..125798a 100644 (file)
@@ -153,7 +153,6 @@ static void ttm_bo_release_list(struct kref *list_kref)
 
        BUG_ON(kref_read(&bo->list_kref));
        BUG_ON(kref_read(&bo->kref));
-       BUG_ON(atomic_read(&bo->cpu_writers));
        BUG_ON(bo->mem.mm_node != NULL);
        BUG_ON(!list_empty(&bo->lru));
        BUG_ON(!list_empty(&bo->ddestroy));
@@ -1315,7 +1314,6 @@ int ttm_bo_init_reserved(struct ttm_bo_device *bdev,
 
        kref_init(&bo->kref);
        kref_init(&bo->list_kref);
-       atomic_set(&bo->cpu_writers, 0);
        INIT_LIST_HEAD(&bo->lru);
        INIT_LIST_HEAD(&bo->ddestroy);
        INIT_LIST_HEAD(&bo->swap);
@@ -1827,31 +1825,6 @@ int ttm_bo_wait(struct ttm_buffer_object *bo,
 }
 EXPORT_SYMBOL(ttm_bo_wait);
 
-int ttm_bo_synccpu_write_grab(struct ttm_buffer_object *bo, bool no_wait)
-{
-       int ret = 0;
-
-       /*
-        * Using ttm_bo_reserve makes sure the lru lists are updated.
-        */
-
-       ret = ttm_bo_reserve(bo, true, no_wait, NULL);
-       if (unlikely(ret != 0))
-               return ret;
-       ret = ttm_bo_wait(bo, true, no_wait);
-       if (likely(ret == 0))
-               atomic_inc(&bo->cpu_writers);
-       ttm_bo_unreserve(bo);
-       return ret;
-}
-EXPORT_SYMBOL(ttm_bo_synccpu_write_grab);
-
-void ttm_bo_synccpu_write_release(struct ttm_buffer_object *bo)
-{
-       atomic_dec(&bo->cpu_writers);
-}
-EXPORT_SYMBOL(ttm_bo_synccpu_write_release);
-
 /**
  * A buffer object shrink method that tries to swap out the first
  * buffer object on the bo_global::swap_lru list.
index fe81c56..b00039d 100644 (file)
@@ -511,7 +511,6 @@ static int ttm_buffer_object_transfer(struct ttm_buffer_object *bo,
        mutex_init(&fbo->base.wu_mutex);
        fbo->base.moving = NULL;
        drm_vma_node_reset(&fbo->base.base.vma_node);
-       atomic_set(&fbo->base.cpu_writers, 0);
 
        kref_init(&fbo->base.list_kref);
        kref_init(&fbo->base.kref);
index 131dae8..0519e1b 100644 (file)
@@ -113,12 +113,7 @@ int ttm_eu_reserve_buffers(struct ww_acquire_ctx *ticket,
                struct ttm_buffer_object *bo = entry->bo;
 
                ret = __ttm_bo_reserve(bo, intr, (ticket == NULL), ticket);
-               if (!ret && unlikely(atomic_read(&bo->cpu_writers) > 0)) {
-                       dma_resv_unlock(bo->base.resv);
-
-                       ret = -EBUSY;
-
-               } else if (ret == -EALREADY && dups) {
+               if (ret == -EALREADY && dups) {
                        struct ttm_validate_buffer *safe = entry;
                        entry = list_prev_entry(entry, head);
                        list_del(&safe->head);
index aad8d81..74016a0 100644 (file)
@@ -566,7 +566,7 @@ static void vmw_user_bo_ref_obj_release(struct ttm_base_object *base,
 
        switch (ref_type) {
        case TTM_REF_SYNCCPU_WRITE:
-               ttm_bo_synccpu_write_release(&user_bo->vbo.base);
+               atomic_dec(&user_bo->vbo.cpu_writers);
                break;
        default:
                WARN_ONCE(true, "Undefined buffer object reference release.\n");
@@ -682,12 +682,12 @@ static int vmw_user_bo_synccpu_grab(struct vmw_user_buffer_object *user_bo,
                                    struct ttm_object_file *tfile,
                                    uint32_t flags)
 {
+       bool nonblock = !!(flags & drm_vmw_synccpu_dontblock);
        struct ttm_buffer_object *bo = &user_bo->vbo.base;
        bool existed;
        int ret;
 
        if (flags & drm_vmw_synccpu_allow_cs) {
-               bool nonblock = !!(flags & drm_vmw_synccpu_dontblock);
                long lret;
 
                lret = dma_resv_wait_timeout_rcu
@@ -700,15 +700,22 @@ static int vmw_user_bo_synccpu_grab(struct vmw_user_buffer_object *user_bo,
                return 0;
        }
 
-       ret = ttm_bo_synccpu_write_grab
-               (bo, !!(flags & drm_vmw_synccpu_dontblock));
+       ret = ttm_bo_reserve(bo, true, nonblock, NULL);
+       if (unlikely(ret != 0))
+               return ret;
+
+       ret = ttm_bo_wait(bo, true, nonblock);
+       if (likely(ret == 0))
+               atomic_inc(&user_bo->vbo.cpu_writers);
+
+       ttm_bo_unreserve(bo);
        if (unlikely(ret != 0))
                return ret;
 
        ret = ttm_ref_object_add(tfile, &user_bo->prime.base,
                                 TTM_REF_SYNCCPU_WRITE, &existed, false);
        if (ret != 0 || existed)
-               ttm_bo_synccpu_write_release(&user_bo->vbo.base);
+               atomic_dec(&user_bo->vbo.cpu_writers);
 
        return ret;
 }
index 29f60e0..b18842f 100644 (file)
@@ -102,6 +102,8 @@ struct vmw_fpriv {
  * @base: The TTM buffer object
  * @res_list: List of resources using this buffer object as a backing MOB
  * @pin_count: pin depth
+ * @cpu_writers: Number of synccpu write grabs. Protected by reservation when
+ * increased. May be decreased without reservation.
  * @dx_query_ctx: DX context if this buffer object is used as a DX query MOB
  * @map: Kmap object for semi-persistent mappings
  * @res_prios: Eviction priority counts for attached resources
@@ -110,6 +112,7 @@ struct vmw_buffer_object {
        struct ttm_buffer_object base;
        struct list_head res_list;
        s32 pin_count;
+       atomic_t cpu_writers;
        /* Not ref-counted.  Protected by binding_mutex */
        struct vmw_resource *dx_query_ctx;
        /* Protected by reservation */
index f611b22..7bff362 100644 (file)
@@ -521,6 +521,9 @@ int vmw_validation_bo_validate_single(struct ttm_buffer_object *bo,
        };
        int ret;
 
+       if (atomic_read(&vbo->cpu_writers))
+               return -EBUSY;
+
        if (vbo->pin_count > 0)
                return 0;
 
index d2277e0..9fb1408 100644 (file)
@@ -147,7 +147,6 @@ struct ttm_tt;
  * holds a pointer to a persistent shmem object.
  * @ttm: TTM structure holding system pages.
  * @evicted: Whether the object was evicted without user-space knowing.
- * @cpu_writes: For synchronization. Number of cpu writers.
  * @lru: List head for the lru list.
  * @ddestroy: List head for the delayed destroy list.
  * @swap: List head for swap LRU list.
@@ -199,12 +198,6 @@ struct ttm_buffer_object {
        bool evicted;
 
        /**
-        * Members protected by the bo::reserved lock only when written to.
-        */
-
-       atomic_t cpu_writers;
-
-       /**
         * Members protected by the bdev::lru_lock.
         */
 
@@ -442,31 +435,6 @@ bool ttm_bo_eviction_valuable(struct ttm_buffer_object *bo,
                              const struct ttm_place *place);
 
 /**
- * ttm_bo_synccpu_write_grab
- *
- * @bo: The buffer object:
- * @no_wait: Return immediately if buffer is busy.
- *
- * Synchronizes a buffer object for CPU RW access. This means
- * command submission that affects the buffer will return -EBUSY
- * until ttm_bo_synccpu_write_release is called.
- *
- * Returns
- * -EBUSY if the buffer is busy and no_wait is true.
- * -ERESTARTSYS if interrupted by a signal.
- */
-int ttm_bo_synccpu_write_grab(struct ttm_buffer_object *bo, bool no_wait);
-
-/**
- * ttm_bo_synccpu_write_release:
- *
- * @bo : The buffer object.
- *
- * Releases a synccpu lock.
- */
-void ttm_bo_synccpu_write_release(struct ttm_buffer_object *bo);
-
-/**
  * ttm_bo_acc_size
  *
  * @bdev: Pointer to a ttm_bo_device struct.