summaryrefslogtreecommitdiff
path: root/drm/nouveau_gem.c
diff options
context:
space:
mode:
authorBen Skeggs <bskeggs@redhat.com>2013-03-04 10:25:43 +1000
committerBen Skeggs <bskeggs@redhat.com>2013-03-04 10:25:43 +1000
commit5a108f440e7f353d2bce43caeedea6c8f8d37c8b (patch)
tree53d8aeccf5564b18bb7d10a5110a62438a5021be /drm/nouveau_gem.c
parent2a19585c451aa95680e5109e27fc4faa47f2d724 (diff)
downloadnouveau-5a108f440e7f353d2bce43caeedea6c8f8d37c8b.tar.gz
v3.9-rc1
Diffstat (limited to 'drm/nouveau_gem.c')
-rw-r--r--drm/nouveau_gem.c22
1 files changed, 16 insertions, 6 deletions
diff --git a/drm/nouveau_gem.c b/drm/nouveau_gem.c
index 6c45ddb9e..b4b4d0c1f 100644
--- a/drm/nouveau_gem.c
+++ b/drm/nouveau_gem.c
@@ -24,8 +24,6 @@
*
*/
-#include <linux/dma-buf.h>
-
#include <subdev/fb.h>
#include "nouveau_drm.h"
@@ -322,6 +320,7 @@ validate_init(struct nouveau_channel *chan, struct drm_file *file_priv,
uint32_t sequence;
int trycnt = 0;
int ret, i;
+ struct nouveau_bo *res_bo = NULL;
sequence = atomic_add_return(1, &drm->ttm.validate_sequence);
retry:
@@ -342,6 +341,11 @@ retry:
return -ENOENT;
}
nvbo = gem->driver_private;
+ if (nvbo == res_bo) {
+ res_bo = NULL;
+ drm_gem_object_unreference_unlocked(gem);
+ continue;
+ }
if (nvbo->reserved_by && nvbo->reserved_by == file_priv) {
NV_ERROR(cli, "multiple instances of buffer %d on "
@@ -354,15 +358,19 @@ retry:
ret = ttm_bo_reserve(&nvbo->bo, true, false, true, sequence);
if (ret) {
validate_fini(op, NULL);
- if (unlikely(ret == -EAGAIN))
- ret = ttm_bo_wait_unreserved(&nvbo->bo, true);
- drm_gem_object_unreference_unlocked(gem);
+ if (unlikely(ret == -EAGAIN)) {
+ sequence = atomic_add_return(1, &drm->ttm.validate_sequence);
+ ret = ttm_bo_reserve_slowpath(&nvbo->bo, true,
+ sequence);
+ if (!ret)
+ res_bo = nvbo;
+ }
if (unlikely(ret)) {
+ drm_gem_object_unreference_unlocked(gem);
if (ret != -ERESTARTSYS)
NV_ERROR(cli, "fail reserve\n");
return ret;
}
- goto retry;
}
b->user_priv = (uint64_t)(unsigned long)nvbo;
@@ -384,6 +392,8 @@ retry:
validate_fini(op, NULL);
return -EINVAL;
}
+ if (nvbo == res_bo)
+ goto retry;
}
return 0;