drm/ttm: remove TTM_BO_PRIV_FLAG_MOVING
authorChristian König <christian.koenig@amd.com>
Wed, 15 Jun 2016 11:44:01 +0000 (13:44 +0200)
committerAlex Deucher <alexander.deucher@amd.com>
Thu, 7 Jul 2016 18:54:40 +0000 (14:54 -0400)
Instead of using the flag just remember the fence of the last move operation.

This avoids waiting for command submissions pipelined after the move, but
before accessing the BO with the CPU again.

Reviewed-by: Alex Deucher <alexander.deucher@amd.com>
Signed-off-by: Christian König <christian.koenig@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
drivers/gpu/drm/ttm/ttm_bo.c
drivers/gpu/drm/ttm/ttm_bo_util.c
drivers/gpu/drm/ttm/ttm_bo_vm.c
include/drm/ttm/ttm_bo_api.h
include/drm/ttm/ttm_bo_driver.h

index c3c615c525a4a21d901d01e33760bd2b3cbe040e..caa657d31ce348df9f142ecad5cda34253211ae2 100644 (file)
@@ -149,6 +149,7 @@ static void ttm_bo_release_list(struct kref *list_kref)
 
        ttm_tt_destroy(bo->ttm);
        atomic_dec(&bo->glob->bo_count);
+       fence_put(bo->moving);
        if (bo->resv == &bo->ttm_resv)
                reservation_object_fini(&bo->ttm_resv);
        mutex_destroy(&bo->wu_mutex);
@@ -1138,7 +1139,7 @@ int ttm_bo_init(struct ttm_bo_device *bdev,
        bo->mem.page_alignment = page_alignment;
        bo->mem.bus.io_reserved_vm = false;
        bo->mem.bus.io_reserved_count = 0;
-       bo->priv_flags = 0;
+       bo->moving = NULL;
        bo->mem.placement = (TTM_PL_FLAG_SYSTEM | TTM_PL_FLAG_CACHED);
        bo->persistent_swap_storage = persistent_swap_storage;
        bo->acc_size = acc_size;
@@ -1585,7 +1586,6 @@ int ttm_bo_wait(struct ttm_buffer_object *bo,
                return -EBUSY;
 
        reservation_object_add_excl_fence(resv, NULL);
-       clear_bit(TTM_BO_PRIV_FLAG_MOVING, &bo->priv_flags);
        return 0;
 }
 EXPORT_SYMBOL(ttm_bo_wait);
index c8fe554ee1c72bb00baa4fe2a536ea07453ebead..9ea8d02f4ea59dada2ed9ae37cd5ac207f5b33c7 100644 (file)
@@ -465,6 +465,7 @@ static int ttm_buffer_object_transfer(struct ttm_buffer_object *bo,
        INIT_LIST_HEAD(&fbo->lru);
        INIT_LIST_HEAD(&fbo->swap);
        INIT_LIST_HEAD(&fbo->io_reserve_lru);
+       fbo->moving = NULL;
        drm_vma_node_reset(&fbo->vma_node);
        atomic_set(&fbo->cpu_writers, 0);
 
@@ -665,7 +666,8 @@ int ttm_bo_move_accel_cleanup(struct ttm_buffer_object *bo,
                 * operation has completed.
                 */
 
-               set_bit(TTM_BO_PRIV_FLAG_MOVING, &bo->priv_flags);
+               fence_put(bo->moving);
+               bo->moving = fence_get(fence);
 
                ret = ttm_buffer_object_transfer(bo, &ghost_obj);
                if (ret)
index 3216878bced3d3debd16cca931589706de897795..a6ed9d5e5167fc935f0fceb8bc314db843959c19 100644 (file)
@@ -48,15 +48,14 @@ static int ttm_bo_vm_fault_idle(struct ttm_buffer_object *bo,
 {
        int ret = 0;
 
-       if (likely(!test_bit(TTM_BO_PRIV_FLAG_MOVING, &bo->priv_flags)))
+       if (likely(!bo->moving))
                goto out_unlock;
 
        /*
         * Quick non-stalling check for idle.
         */
-       ret = ttm_bo_wait(bo, false, true);
-       if (likely(ret == 0))
-               goto out_unlock;
+       if (fence_is_signaled(bo->moving))
+               goto out_clear;
 
        /*
         * If possible, avoid waiting for GPU with mmap_sem
@@ -68,17 +67,23 @@ static int ttm_bo_vm_fault_idle(struct ttm_buffer_object *bo,
                        goto out_unlock;
 
                up_read(&vma->vm_mm->mmap_sem);
-               (void) ttm_bo_wait(bo, true, false);
+               (void) fence_wait(bo->moving, true);
                goto out_unlock;
        }
 
        /*
         * Ordinary wait.
         */
-       ret = ttm_bo_wait(bo, true, false);
-       if (unlikely(ret != 0))
+       ret = fence_wait(bo->moving, true);
+       if (unlikely(ret != 0)) {
                ret = (ret != -ERESTARTSYS) ? VM_FAULT_SIGBUS :
                        VM_FAULT_NOPAGE;
+               goto out_unlock;
+       }
+
+out_clear:
+       fence_put(bo->moving);
+       bo->moving = NULL;
 
 out_unlock:
        return ret;
index c801d9028e37388bc30a8254be8c4ae7df6acb22..97aaf5c3d45b8406acb46e175e442aa80e6a9b1f 100644 (file)
@@ -173,7 +173,7 @@ struct ttm_tt;
  * @lru: List head for the lru list.
  * @ddestroy: List head for the delayed destroy list.
  * @swap: List head for swap LRU list.
- * @priv_flags: Flags describing buffer object internal state.
+ * @moving: Fence set when BO is moving
  * @vma_node: Address space manager node.
  * @offset: The current GPU offset, which can have different meanings
  * depending on the memory type. For SYSTEM type memory, it should be 0.
@@ -239,7 +239,7 @@ struct ttm_buffer_object {
         * Members protected by a bo reservation.
         */
 
-       unsigned long priv_flags;
+       struct fence *moving;
 
        struct drm_vma_offset_node vma_node;
 
index 697e5f919135e71a3c716432eba9d8d8aeac38e2..44dea22d594ea318ef4824c4d3851c70832b9cb0 100644 (file)
@@ -503,9 +503,6 @@ struct ttm_bo_global {
 
 #define TTM_NUM_MEM_TYPES 8
 
-#define TTM_BO_PRIV_FLAG_MOVING  0     /* Buffer object is moving and needs
-                                          idling before CPU mapping */
-#define TTM_BO_PRIV_FLAG_MAX 1
 /**
  * struct ttm_bo_device - Buffer object driver device-specific data.
  *