From 1717c0e23f411147490c7a3312b894f0ea9a5fb1 Mon Sep 17 00:00:00 2001
From: Dave Airlie <airlied@redhat.com>
Date: Thu, 27 Oct 2011 18:28:37 +0200
Subject: Revert "drm/ttm: add a way to bo_wait for either the last read or
 last write"
Git-commit: 1717c0e23f411147490c7a3312b894f0ea9a5fb1
Patch-mainline: v3.2-rc1

This reverts commit dfadbbdb57b3f2bb33e14f129a43047c6f0caefa.

Further upstream discussion between Marek and Thomas decided this wasn't
fully baked and needed further work, so revert it before it hits mainline.

Signed-off-by: Dave Airlie <airlied@redhat.com>
Acked-by: Michal Srb <msrb@suse.com>
---
 drivers/gpu/drm/radeon/radeon_cs.c      |    1 -
 drivers/gpu/drm/radeon/radeon_object.c  |    2 +-
 drivers/gpu/drm/ttm/ttm_bo.c            |   97 ++++++++----------------------
 drivers/gpu/drm/ttm/ttm_bo_util.c       |   26 ++-------
 drivers/gpu/drm/ttm/ttm_bo_vm.c         |    2 +-
 drivers/gpu/drm/ttm/ttm_execbuf_util.c  |   19 +------
 drivers/gpu/drm/vmwgfx/vmwgfx_drv.c     |    2 +-
 drivers/gpu/drm/vmwgfx/vmwgfx_execbuf.c |    1 -
 include/drm/ttm/ttm_bo_api.h            |   16 +-----
 include/drm/ttm/ttm_execbuf_util.h      |    6 --
 12 files changed, 40 insertions(+), 140 deletions(-)

Index: linux-3.0-SLE11-SP3/drivers/gpu/drm/radeon/radeon_cs.c
===================================================================
--- linux-3.0-SLE11-SP3.orig/drivers/gpu/drm/radeon/radeon_cs.c
+++ linux-3.0-SLE11-SP3/drivers/gpu/drm/radeon/radeon_cs.c
@@ -80,7 +80,6 @@ int radeon_cs_parser_relocs(struct radeo
 			p->relocs[i].lobj.wdomain = r->write_domain;
 			p->relocs[i].lobj.rdomain = r->read_domains;
 			p->relocs[i].lobj.tv.bo = &p->relocs[i].robj->tbo;
-			p->relocs[i].lobj.tv.usage = TTM_USAGE_READWRITE;
 			p->relocs[i].handle = r->handle;
 			p->relocs[i].flags = r->flags;
 			radeon_bo_list_add_object(&p->relocs[i].lobj,
Index: linux-3.0-SLE11-SP3/drivers/gpu/drm/radeon/radeon_object.c
===================================================================
--- linux-3.0-SLE11-SP3.orig/drivers/gpu/drm/radeon/radeon_object.c
+++ linux-3.0-SLE11-SP3/drivers/gpu/drm/radeon/radeon_object.c
@@ -543,7 +543,7 @@ int radeon_bo_wait(struct radeon_bo *bo,
 	if (mem_type)
 		*mem_type = bo->tbo.mem.mem_type;
 	if (bo->tbo.sync_obj)
-		r = ttm_bo_wait(&bo->tbo, true, true, no_wait, false);
+		r = ttm_bo_wait(&bo->tbo, true, true, no_wait);
 	spin_unlock(&bo->tbo.bdev->fence_lock);
 	ttm_bo_unreserve(&bo->tbo);
 	return r;
Index: linux-3.0-SLE11-SP3/drivers/gpu/drm/ttm/ttm_bo.c
===================================================================
--- linux-3.0-SLE11-SP3.orig/drivers/gpu/drm/ttm/ttm_bo.c
+++ linux-3.0-SLE11-SP3/drivers/gpu/drm/ttm/ttm_bo.c
@@ -499,7 +499,7 @@ static void ttm_bo_cleanup_refs_or_queue
 	int ret;
 
 	spin_lock(&bdev->fence_lock);
-	(void) ttm_bo_wait(bo, false, false, true, TTM_USAGE_READWRITE);
+	(void) ttm_bo_wait(bo, false, false, true);
 	if (!bo->sync_obj) {
 
 		spin_lock(&glob->lru_lock);
@@ -567,8 +567,7 @@ static int ttm_bo_cleanup_refs(struct tt
 
 retry:
 	spin_lock(&bdev->fence_lock);
-	ret = ttm_bo_wait(bo, false, interruptible, no_wait_gpu,
-			  TTM_USAGE_READWRITE);
+	ret = ttm_bo_wait(bo, false, interruptible, no_wait_gpu);
 	spin_unlock(&bdev->fence_lock);
 
 	if (unlikely(ret != 0))
@@ -727,8 +726,7 @@ static int ttm_bo_evict(struct ttm_buffe
 	int ret = 0;
 
 	spin_lock(&bdev->fence_lock);
-	ret = ttm_bo_wait(bo, false, interruptible, no_wait_gpu,
-			  TTM_USAGE_READWRITE);
+	ret = ttm_bo_wait(bo, false, interruptible, no_wait_gpu);
 	spin_unlock(&bdev->fence_lock);
 
 	if (unlikely(ret != 0)) {
@@ -1075,8 +1073,7 @@ int ttm_bo_move_buffer(struct ttm_buffer
 	 * instead of doing it here.
 	 */
 	spin_lock(&bdev->fence_lock);
-	ret = ttm_bo_wait(bo, false, interruptible, no_wait_gpu,
-			  TTM_USAGE_READWRITE);
+	ret = ttm_bo_wait(bo, false, interruptible, no_wait_gpu);
 	spin_unlock(&bdev->fence_lock);
 	if (ret)
 		return ret;
@@ -1697,83 +1694,34 @@ out_unlock:
 	return ret;
 }
 
-static void ttm_bo_unref_sync_obj_locked(struct ttm_buffer_object *bo,
-					 void *sync_obj,
-					 void **extra_sync_obj)
-{
-	struct ttm_bo_device *bdev = bo->bdev;
-	struct ttm_bo_driver *driver = bdev->driver;
-	void *tmp_obj = NULL, *tmp_obj_read = NULL, *tmp_obj_write = NULL;
-
-	/* We must unref the sync obj wherever it's ref'd.
-	 * Note that if we unref bo->sync_obj, we can unref both the read
-	 * and write sync objs too, because they can't be newer than
-	 * bo->sync_obj, so they are no longer relevant. */
-	if (sync_obj == bo->sync_obj ||
-	    sync_obj == bo->sync_obj_read) {
-		tmp_obj_read = bo->sync_obj_read;
-		bo->sync_obj_read = NULL;
-	}
-	if (sync_obj == bo->sync_obj ||
-	    sync_obj == bo->sync_obj_write) {
-		tmp_obj_write = bo->sync_obj_write;
-		bo->sync_obj_write = NULL;
-	}
-	if (sync_obj == bo->sync_obj) {
-		tmp_obj = bo->sync_obj;
-		bo->sync_obj = NULL;
-	}
-
-	clear_bit(TTM_BO_PRIV_FLAG_MOVING, &bo->priv_flags);
-	spin_unlock(&bdev->fence_lock);
-	if (tmp_obj)
-		driver->sync_obj_unref(&tmp_obj);
-	if (tmp_obj_read)
-		driver->sync_obj_unref(&tmp_obj_read);
-	if (tmp_obj_write)
-		driver->sync_obj_unref(&tmp_obj_write);
-	if (extra_sync_obj)
-		driver->sync_obj_unref(extra_sync_obj);
-	spin_lock(&bdev->fence_lock);
-}
-
 int ttm_bo_wait(struct ttm_buffer_object *bo,
-		bool lazy, bool interruptible, bool no_wait,
-		enum ttm_buffer_usage usage)
+		bool lazy, bool interruptible, bool no_wait)
 {
 	struct ttm_bo_driver *driver = bo->bdev->driver;
 	struct ttm_bo_device *bdev = bo->bdev;
 	void *sync_obj;
 	void *sync_obj_arg;
 	int ret = 0;
-	void **bo_sync_obj;
 
-	switch (usage) {
-	case TTM_USAGE_READ:
-		bo_sync_obj = &bo->sync_obj_read;
-		break;
-	case TTM_USAGE_WRITE:
-		bo_sync_obj = &bo->sync_obj_write;
-		break;
-	case TTM_USAGE_READWRITE:
-	default:
-		bo_sync_obj = &bo->sync_obj;
-	}
-
-	if (likely(*bo_sync_obj == NULL))
+	if (likely(bo->sync_obj == NULL))
 		return 0;
 
-	while (*bo_sync_obj) {
+	while (bo->sync_obj) {
 
-		if (driver->sync_obj_signaled(*bo_sync_obj, bo->sync_obj_arg)) {
-			ttm_bo_unref_sync_obj_locked(bo, *bo_sync_obj, NULL);
+		if (driver->sync_obj_signaled(bo->sync_obj, bo->sync_obj_arg)) {
+			void *tmp_obj = bo->sync_obj;
+			bo->sync_obj = NULL;
+			clear_bit(TTM_BO_PRIV_FLAG_MOVING, &bo->priv_flags);
+			spin_unlock(&bdev->fence_lock);
+			driver->sync_obj_unref(&tmp_obj);
+			spin_lock(&bdev->fence_lock);
 			continue;
 		}
 
 		if (no_wait)
 			return -EBUSY;
 
-		sync_obj = driver->sync_obj_ref(*bo_sync_obj);
+		sync_obj = driver->sync_obj_ref(bo->sync_obj);
 		sync_obj_arg = bo->sync_obj_arg;
 		spin_unlock(&bdev->fence_lock);
 		ret = driver->sync_obj_wait(sync_obj, sync_obj_arg,
@@ -1784,9 +1732,16 @@ int ttm_bo_wait(struct ttm_buffer_object
 			return ret;
 		}
 		spin_lock(&bdev->fence_lock);
-		if (likely(*bo_sync_obj == sync_obj &&
+		if (likely(bo->sync_obj == sync_obj &&
 			   bo->sync_obj_arg == sync_obj_arg)) {
-			ttm_bo_unref_sync_obj_locked(bo, *bo_sync_obj, &sync_obj);
+			void *tmp_obj = bo->sync_obj;
+			bo->sync_obj = NULL;
+			clear_bit(TTM_BO_PRIV_FLAG_MOVING,
+				  &bo->priv_flags);
+			spin_unlock(&bdev->fence_lock);
+			driver->sync_obj_unref(&sync_obj);
+			driver->sync_obj_unref(&tmp_obj);
+			spin_lock(&bdev->fence_lock);
 		} else {
 			spin_unlock(&bdev->fence_lock);
 			driver->sync_obj_unref(&sync_obj);
@@ -1810,7 +1765,7 @@ int ttm_bo_synccpu_write_grab(struct ttm
 	if (unlikely(ret != 0))
 		return ret;
 	spin_lock(&bdev->fence_lock);
-	ret = ttm_bo_wait(bo, false, true, no_wait, TTM_USAGE_READWRITE);
+	ret = ttm_bo_wait(bo, false, true, no_wait);
 	spin_unlock(&bdev->fence_lock);
 	if (likely(ret == 0))
 		atomic_inc(&bo->cpu_writers);
@@ -1885,7 +1840,7 @@ static int ttm_bo_swapout(struct ttm_mem
 	 */
 
 	spin_lock(&bo->bdev->fence_lock);
-	ret = ttm_bo_wait(bo, false, false, false, TTM_USAGE_READWRITE);
+	ret = ttm_bo_wait(bo, false, false, false);
 	spin_unlock(&bo->bdev->fence_lock);
 
 	if (unlikely(ret != 0))
Index: linux-3.0-SLE11-SP3/drivers/gpu/drm/ttm/ttm_bo_util.c
===================================================================
--- linux-3.0-SLE11-SP3.orig/drivers/gpu/drm/ttm/ttm_bo_util.c
+++ linux-3.0-SLE11-SP3/drivers/gpu/drm/ttm/ttm_bo_util.c
@@ -436,8 +436,6 @@ static int ttm_buffer_object_transfer(st
 	atomic_set(&fbo->cpu_writers, 0);
 
 	fbo->sync_obj = driver->sync_obj_ref(bo->sync_obj);
-	fbo->sync_obj_read = driver->sync_obj_ref(bo->sync_obj_read);
-	fbo->sync_obj_write = driver->sync_obj_ref(bo->sync_obj_write);
 	kref_init(&fbo->list_kref);
 	kref_init(&fbo->kref);
 	fbo->destroy = &ttm_transfered_destroy;
@@ -620,30 +618,20 @@ int ttm_bo_move_accel_cleanup(struct ttm
 	struct ttm_mem_reg *old_mem = &bo->mem;
 	int ret;
 	struct ttm_buffer_object *ghost_obj;
-	void *tmp_obj = NULL, *tmp_obj_read = NULL, *tmp_obj_write = NULL;
+	void *tmp_obj = NULL;
 
 	spin_lock(&bdev->fence_lock);
-	if (bo->sync_obj)
+	if (bo->sync_obj) {
 		tmp_obj = bo->sync_obj;
-	if (bo->sync_obj_read)
-		tmp_obj_read = bo->sync_obj_read;
-	if (bo->sync_obj_write)
-		tmp_obj_write = bo->sync_obj_write;
-
+		bo->sync_obj = NULL;
+	}
 	bo->sync_obj = driver->sync_obj_ref(sync_obj);
-	bo->sync_obj_read = driver->sync_obj_ref(sync_obj);
-	bo->sync_obj_write = driver->sync_obj_ref(sync_obj);
 	bo->sync_obj_arg = sync_obj_arg;
 	if (evict) {
-		ret = ttm_bo_wait(bo, false, false, false,
-				  TTM_USAGE_READWRITE);
+		ret = ttm_bo_wait(bo, false, false, false);
 		spin_unlock(&bdev->fence_lock);
 		if (tmp_obj)
 			driver->sync_obj_unref(&tmp_obj);
-		if (tmp_obj_read)
-			driver->sync_obj_unref(&tmp_obj_read);
-		if (tmp_obj_write)
-			driver->sync_obj_unref(&tmp_obj_write);
 		if (ret)
 			return ret;
 
@@ -667,10 +655,6 @@ int ttm_bo_move_accel_cleanup(struct ttm
 		spin_unlock(&bdev->fence_lock);
 		if (tmp_obj)
 			driver->sync_obj_unref(&tmp_obj);
-		if (tmp_obj_read)
-			driver->sync_obj_unref(&tmp_obj_read);
-		if (tmp_obj_write)
-			driver->sync_obj_unref(&tmp_obj_write);
 
 		ret = ttm_buffer_object_transfer(bo, &ghost_obj);
 		if (ret)
Index: linux-3.0-SLE11-SP3/drivers/gpu/drm/ttm/ttm_bo_vm.c
===================================================================
--- linux-3.0-SLE11-SP3.orig/drivers/gpu/drm/ttm/ttm_bo_vm.c
+++ linux-3.0-SLE11-SP3/drivers/gpu/drm/ttm/ttm_bo_vm.c
@@ -122,7 +122,7 @@ static int ttm_bo_vm_fault(struct vm_are
 
 	spin_lock(&bdev->fence_lock);
 	if (test_bit(TTM_BO_PRIV_FLAG_MOVING, &bo->priv_flags)) {
-		ret = ttm_bo_wait(bo, false, true, false, TTM_USAGE_READWRITE);
+		ret = ttm_bo_wait(bo, false, true, false);
 		spin_unlock(&bdev->fence_lock);
 		if (unlikely(ret != 0)) {
 			retval = (ret != -ERESTARTSYS) ?
Index: linux-3.0-SLE11-SP3/drivers/gpu/drm/ttm/ttm_execbuf_util.c
===================================================================
--- linux-3.0-SLE11-SP3.orig/drivers/gpu/drm/ttm/ttm_execbuf_util.c
+++ linux-3.0-SLE11-SP3/drivers/gpu/drm/ttm/ttm_execbuf_util.c
@@ -221,18 +221,8 @@ void ttm_eu_fence_buffer_objects(struct
 
 	list_for_each_entry(entry, list, head) {
 		bo = entry->bo;
-		entry->old_sync_obj_read = NULL;
-		entry->old_sync_obj_write = NULL;
 		entry->old_sync_obj = bo->sync_obj;
 		bo->sync_obj = driver->sync_obj_ref(sync_obj);
-		if (entry->usage & TTM_USAGE_READ) {
-			entry->old_sync_obj_read = bo->sync_obj_read;
-			bo->sync_obj_read = driver->sync_obj_ref(sync_obj);
-		}
-		if (entry->usage & TTM_USAGE_WRITE) {
-			entry->old_sync_obj_write = bo->sync_obj_write;
-			bo->sync_obj_write = driver->sync_obj_ref(sync_obj);
-		}
 		bo->sync_obj_arg = entry->new_sync_obj_arg;
 		ttm_bo_unreserve_locked(bo);
 		entry->reserved = false;
@@ -241,15 +231,8 @@ void ttm_eu_fence_buffer_objects(struct
 	spin_unlock(&bdev->fence_lock);
 
 	list_for_each_entry(entry, list, head) {
-		if (entry->old_sync_obj) {
+		if (entry->old_sync_obj)
 			driver->sync_obj_unref(&entry->old_sync_obj);
-		}
-		if (entry->old_sync_obj_read) {
-			driver->sync_obj_unref(&entry->old_sync_obj_read);
-		}
-		if (entry->old_sync_obj_write) {
-			driver->sync_obj_unref(&entry->old_sync_obj_write);
-		}
 	}
 }
 EXPORT_SYMBOL(ttm_eu_fence_buffer_objects);
Index: linux-3.0-SLE11-SP3/drivers/gpu/drm/vmwgfx/vmwgfx_drv.c
===================================================================
--- linux-3.0-SLE11-SP3.orig/drivers/gpu/drm/vmwgfx/vmwgfx_drv.c
+++ linux-3.0-SLE11-SP3/drivers/gpu/drm/vmwgfx/vmwgfx_drv.c
@@ -245,7 +245,7 @@ static void vmw_dummy_query_bo_prepare(s
 
 	ttm_bo_reserve(bo, false, false, false, 0);
 	spin_lock(&bdev->fence_lock);
-	ret = ttm_bo_wait(bo, false, false, false, TTM_USAGE_READWRITE);
+	ret = ttm_bo_wait(bo, false, false, false);
 	spin_unlock(&bdev->fence_lock);
 	if (unlikely(ret != 0))
 		(void) vmw_fallback_wait(dev_priv, false, true, 0, false,
Index: linux-3.0-SLE11-SP3/drivers/gpu/drm/vmwgfx/vmwgfx_execbuf.c
===================================================================
--- linux-3.0-SLE11-SP3.orig/drivers/gpu/drm/vmwgfx/vmwgfx_execbuf.c
+++ linux-3.0-SLE11-SP3/drivers/gpu/drm/vmwgfx/vmwgfx_execbuf.c
@@ -89,7 +89,6 @@ static int vmw_bo_to_validate_list(struc
 	if (unlikely(val_node == sw_context->cur_val_buf)) {
 		val_buf->new_sync_obj_arg = NULL;
 		val_buf->bo = ttm_bo_reference(bo);
-		val_buf->usage = TTM_USAGE_READWRITE;
 		list_add_tail(&val_buf->head, &sw_context->validate_nodes);
 		++sw_context->cur_val_buf;
 	}
Index: linux-3.0-SLE11-SP3/include/drm/ttm/ttm_bo_api.h
===================================================================
--- linux-3.0-SLE11-SP3.orig/include/drm/ttm/ttm_bo_api.h
+++ linux-3.0-SLE11-SP3/include/drm/ttm/ttm_bo_api.h
@@ -44,11 +44,6 @@ struct ttm_bo_device;
 
 struct drm_mm_node;
 
-enum ttm_buffer_usage {
-    TTM_USAGE_READ = 1,
-    TTM_USAGE_WRITE = 2,
-    TTM_USAGE_READWRITE = TTM_USAGE_READ | TTM_USAGE_WRITE
-};
 
 /**
  * struct ttm_placement
@@ -179,10 +174,7 @@ struct ttm_tt;
  * the bo_device::lru_lock.
  * @reserved: Deadlock-free lock used for synchronization state transitions.
  * @sync_obj_arg: Opaque argument to synchronization object function.
- * @sync_obj: Pointer to a synchronization object of a last read or write,
- * whichever is later.
- * @sync_obj_read: Pointer to a synchronization object of a last read.
- * @sync_obj_write: Pointer to a synchronization object of a last write.
+ * @sync_obj: Pointer to a synchronization object.
  * @priv_flags: Flags describing buffer object internal state.
  * @vm_rb: Rb node for the vm rb tree.
  * @vm_node: Address space manager node.
@@ -266,8 +258,6 @@ struct ttm_buffer_object {
 
 	void *sync_obj_arg;
 	void *sync_obj;
-	void *sync_obj_read;
-	void *sync_obj_write;
 	unsigned long priv_flags;
 
 	/**
@@ -335,7 +325,6 @@ ttm_bo_reference(struct ttm_buffer_objec
  * @bo:  The buffer object.
  * @interruptible:  Use interruptible wait.
  * @no_wait:  Return immediately if buffer is busy.
- * @usage:  Whether to wait for the last read and/or the last write.
  *
  * This function must be called with the bo::mutex held, and makes
  * sure any previous rendering to the buffer is completed.
@@ -345,8 +334,7 @@ ttm_bo_reference(struct ttm_buffer_objec
  * Returns -ERESTARTSYS if interrupted by a signal.
  */
 extern int ttm_bo_wait(struct ttm_buffer_object *bo, bool lazy,
-		       bool interruptible, bool no_wait,
-		       enum ttm_buffer_usage usage);
+		       bool interruptible, bool no_wait);
 /**
  * ttm_bo_validate
  *
Index: linux-3.0-SLE11-SP3/include/drm/ttm/ttm_execbuf_util.h
===================================================================
--- linux-3.0-SLE11-SP3.orig/include/drm/ttm/ttm_execbuf_util.h
+++ linux-3.0-SLE11-SP3/include/drm/ttm/ttm_execbuf_util.h
@@ -41,26 +41,20 @@
  * @bo:             refcounted buffer object pointer.
  * @new_sync_obj_arg: New sync_obj_arg for @bo, to be used once
  * adding a new sync object.
- * @usage           Indicates how @bo is used by the device.
  * @reserved:       Indicates whether @bo has been reserved for validation.
  * @removed:        Indicates whether @bo has been removed from lru lists.
  * @put_count:      Number of outstanding references on bo::list_kref.
  * @old_sync_obj:   Pointer to a sync object about to be unreferenced
- * @old_sync_obj_read: Pointer to a read sync object about to be unreferenced.
- * @old_sync_obj_write: Pointer to a write sync object about to be unreferenced.
  */
 
 struct ttm_validate_buffer {
 	struct list_head head;
 	struct ttm_buffer_object *bo;
 	void *new_sync_obj_arg;
-	enum ttm_buffer_usage usage;
 	bool reserved;
 	bool removed;
 	int put_count;
 	void *old_sync_obj;
-	void *old_sync_obj_read;
-	void *old_sync_obj_write;
 };
 
 /**
