Revert "drm/ttm: add a way to bo_wait for either the last read or last write"
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>
diff --git a/drivers/gpu/drm/nouveau/nouveau_bo.c b/drivers/gpu/drm/nouveau/nouveau_bo.c
index 424dff5..7226f41 100644
--- a/drivers/gpu/drm/nouveau/nouveau_bo.c
+++ b/drivers/gpu/drm/nouveau/nouveau_bo.c
@@ -1104,8 +1104,7 @@
if (vma->node) {
if (nvbo->bo.mem.mem_type != TTM_PL_SYSTEM) {
spin_lock(&nvbo->bo.bdev->fence_lock);
- ttm_bo_wait(&nvbo->bo, false, false, false,
- TTM_USAGE_READWRITE);
+ ttm_bo_wait(&nvbo->bo, false, false, false);
spin_unlock(&nvbo->bo.bdev->fence_lock);
nouveau_vm_unmap(vma);
}
diff --git a/drivers/gpu/drm/nouveau/nouveau_gem.c b/drivers/gpu/drm/nouveau/nouveau_gem.c
index 322bf62..5f0bc57 100644
--- a/drivers/gpu/drm/nouveau/nouveau_gem.c
+++ b/drivers/gpu/drm/nouveau/nouveau_gem.c
@@ -589,8 +589,7 @@
}
spin_lock(&nvbo->bo.bdev->fence_lock);
- ret = ttm_bo_wait(&nvbo->bo, false, false, false,
- TTM_USAGE_READWRITE);
+ ret = ttm_bo_wait(&nvbo->bo, false, false, false);
spin_unlock(&nvbo->bo.bdev->fence_lock);
if (ret) {
NV_ERROR(dev, "reloc wait_idle failed: %d\n", ret);
@@ -826,7 +825,7 @@
nvbo = nouveau_gem_object(gem);
spin_lock(&nvbo->bo.bdev->fence_lock);
- ret = ttm_bo_wait(&nvbo->bo, true, true, no_wait, TTM_USAGE_READWRITE);
+ ret = ttm_bo_wait(&nvbo->bo, true, true, no_wait);
spin_unlock(&nvbo->bo.bdev->fence_lock);
drm_gem_object_unreference_unlocked(gem);
return ret;
diff --git a/drivers/gpu/drm/radeon/radeon_cs.c b/drivers/gpu/drm/radeon/radeon_cs.c
index 14e8531..fae00c0 100644
--- a/drivers/gpu/drm/radeon/radeon_cs.c
+++ b/drivers/gpu/drm/radeon/radeon_cs.c
@@ -80,7 +80,6 @@
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,
diff --git a/drivers/gpu/drm/radeon/radeon_object.c b/drivers/gpu/drm/radeon/radeon_object.c
index b8f75f5..1c85152 100644
--- a/drivers/gpu/drm/radeon/radeon_object.c
+++ b/drivers/gpu/drm/radeon/radeon_object.c
@@ -527,7 +527,7 @@
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;
diff --git a/drivers/gpu/drm/ttm/ttm_bo.c b/drivers/gpu/drm/ttm/ttm_bo.c
index 50fc8e4..617b646 100644
--- a/drivers/gpu/drm/ttm/ttm_bo.c
+++ b/drivers/gpu/drm/ttm/ttm_bo.c
@@ -499,7 +499,7 @@
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 @@
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 @@
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 @@
* 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 @@
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 @@
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 @@
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);
@@ -1884,7 +1839,7 @@
*/
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))
diff --git a/drivers/gpu/drm/ttm/ttm_bo_util.c b/drivers/gpu/drm/ttm/ttm_bo_util.c
index 6135f58..ae3c6f5 100644
--- a/drivers/gpu/drm/ttm/ttm_bo_util.c
+++ b/drivers/gpu/drm/ttm/ttm_bo_util.c
@@ -436,8 +436,6 @@
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 @@
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 @@
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)
diff --git a/drivers/gpu/drm/ttm/ttm_bo_vm.c b/drivers/gpu/drm/ttm/ttm_bo_vm.c
index ff1e26f..221b924 100644
--- a/drivers/gpu/drm/ttm/ttm_bo_vm.c
+++ b/drivers/gpu/drm/ttm/ttm_bo_vm.c
@@ -122,7 +122,7 @@
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) ?
diff --git a/drivers/gpu/drm/ttm/ttm_execbuf_util.c b/drivers/gpu/drm/ttm/ttm_execbuf_util.c
index 36d111a..3832fe1 100644
--- a/drivers/gpu/drm/ttm/ttm_execbuf_util.c
+++ b/drivers/gpu/drm/ttm/ttm_execbuf_util.c
@@ -221,18 +221,8 @@
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 @@
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);
diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_drv.c b/drivers/gpu/drm/vmwgfx/vmwgfx_drv.c
index b8eb8cdc..13afddc 100644
--- a/drivers/gpu/drm/vmwgfx/vmwgfx_drv.c
+++ b/drivers/gpu/drm/vmwgfx/vmwgfx_drv.c
@@ -244,7 +244,7 @@
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,
diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_execbuf.c b/drivers/gpu/drm/vmwgfx/vmwgfx_execbuf.c
index 28e1c35..40932fb 100644
--- a/drivers/gpu/drm/vmwgfx/vmwgfx_execbuf.c
+++ b/drivers/gpu/drm/vmwgfx/vmwgfx_execbuf.c
@@ -89,7 +89,6 @@
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;
}
diff --git a/include/drm/ttm/ttm_bo_api.h b/include/drm/ttm/ttm_bo_api.h
index da957bf..42e3469 100644
--- a/include/drm/ttm/ttm_bo_api.h
+++ b/include/drm/ttm/ttm_bo_api.h
@@ -44,11 +44,6 @@
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 @@
* 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 @@
void *sync_obj_arg;
void *sync_obj;
- void *sync_obj_read;
- void *sync_obj_write;
unsigned long priv_flags;
/**
@@ -335,7 +325,6 @@
* @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 @@
* 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
*
diff --git a/include/drm/ttm/ttm_execbuf_util.h b/include/drm/ttm/ttm_execbuf_util.h
index 375f299..26cc7f9 100644
--- a/include/drm/ttm/ttm_execbuf_util.h
+++ b/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;
};
/**