aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBen Skeggs <bskeggs@redhat.com>2010-10-11 19:54:54 -0400
committerBen Skeggs <bskeggs@redhat.com>2010-12-03 00:05:26 -0500
commit938c40ed69b2c1eceb72247b5e8975b28afc195f (patch)
tree7e3894ef6edf340880c4bf30aa89b5dcc3c35baf
parent08cd3d4311fb9c5038bc6fb0c83c250cfb218da2 (diff)
drm/nouveau: use interruptible waits during pushbuf validation
Signed-off-by: Ben Skeggs <bskeggs@redhat.com>
-rw-r--r--drivers/gpu/drm/nouveau/nouveau_gem.c31
1 files changed, 19 insertions, 12 deletions
diff --git a/drivers/gpu/drm/nouveau/nouveau_gem.c b/drivers/gpu/drm/nouveau/nouveau_gem.c
index e14d10e38870..23b521ea8e04 100644
--- a/drivers/gpu/drm/nouveau/nouveau_gem.c
+++ b/drivers/gpu/drm/nouveau/nouveau_gem.c
@@ -299,14 +299,15 @@ retry:
299 return -EINVAL; 299 return -EINVAL;
300 } 300 }
301 301
302 ret = ttm_bo_reserve(&nvbo->bo, false, false, true, sequence); 302 ret = ttm_bo_reserve(&nvbo->bo, true, false, true, sequence);
303 if (ret) { 303 if (ret) {
304 validate_fini(op, NULL); 304 validate_fini(op, NULL);
305 if (ret == -EAGAIN) 305 if (unlikely(ret == -EAGAIN))
306 ret = ttm_bo_wait_unreserved(&nvbo->bo, false); 306 ret = ttm_bo_wait_unreserved(&nvbo->bo, true);
307 drm_gem_object_unreference_unlocked(gem); 307 drm_gem_object_unreference_unlocked(gem);
308 if (ret) { 308 if (unlikely(ret)) {
309 NV_ERROR(dev, "fail reserve\n"); 309 if (ret != -ERESTARTSYS)
310 NV_ERROR(dev, "fail reserve\n");
310 return ret; 311 return ret;
311 } 312 }
312 goto retry; 313 goto retry;
@@ -365,10 +366,11 @@ validate_list(struct nouveau_channel *chan, struct list_head *list,
365 366
366 nvbo->channel = (b->read_domains & (1 << 31)) ? NULL : chan; 367 nvbo->channel = (b->read_domains & (1 << 31)) ? NULL : chan;
367 ret = ttm_bo_validate(&nvbo->bo, &nvbo->placement, 368 ret = ttm_bo_validate(&nvbo->bo, &nvbo->placement,
368 false, false, false); 369 true, false, false);
369 nvbo->channel = NULL; 370 nvbo->channel = NULL;
370 if (unlikely(ret)) { 371 if (unlikely(ret)) {
371 NV_ERROR(dev, "fail ttm_validate\n"); 372 if (ret != -ERESTARTSYS)
373 NV_ERROR(dev, "fail ttm_validate\n");
372 return ret; 374 return ret;
373 } 375 }
374 376
@@ -420,13 +422,15 @@ nouveau_gem_pushbuf_validate(struct nouveau_channel *chan,
420 422
421 ret = validate_init(chan, file_priv, pbbo, nr_buffers, op); 423 ret = validate_init(chan, file_priv, pbbo, nr_buffers, op);
422 if (unlikely(ret)) { 424 if (unlikely(ret)) {
423 NV_ERROR(dev, "validate_init\n"); 425 if (ret != -ERESTARTSYS)
426 NV_ERROR(dev, "validate_init\n");
424 return ret; 427 return ret;
425 } 428 }
426 429
427 ret = validate_list(chan, &op->vram_list, pbbo, user_buffers); 430 ret = validate_list(chan, &op->vram_list, pbbo, user_buffers);
428 if (unlikely(ret < 0)) { 431 if (unlikely(ret < 0)) {
429 NV_ERROR(dev, "validate vram_list\n"); 432 if (ret != -ERESTARTSYS)
433 NV_ERROR(dev, "validate vram_list\n");
430 validate_fini(op, NULL); 434 validate_fini(op, NULL);
431 return ret; 435 return ret;
432 } 436 }
@@ -434,7 +438,8 @@ nouveau_gem_pushbuf_validate(struct nouveau_channel *chan,
434 438
435 ret = validate_list(chan, &op->gart_list, pbbo, user_buffers); 439 ret = validate_list(chan, &op->gart_list, pbbo, user_buffers);
436 if (unlikely(ret < 0)) { 440 if (unlikely(ret < 0)) {
437 NV_ERROR(dev, "validate gart_list\n"); 441 if (ret != -ERESTARTSYS)
442 NV_ERROR(dev, "validate gart_list\n");
438 validate_fini(op, NULL); 443 validate_fini(op, NULL);
439 return ret; 444 return ret;
440 } 445 }
@@ -442,7 +447,8 @@ nouveau_gem_pushbuf_validate(struct nouveau_channel *chan,
442 447
443 ret = validate_list(chan, &op->both_list, pbbo, user_buffers); 448 ret = validate_list(chan, &op->both_list, pbbo, user_buffers);
444 if (unlikely(ret < 0)) { 449 if (unlikely(ret < 0)) {
445 NV_ERROR(dev, "validate both_list\n"); 450 if (ret != -ERESTARTSYS)
451 NV_ERROR(dev, "validate both_list\n");
446 validate_fini(op, NULL); 452 validate_fini(op, NULL);
447 return ret; 453 return ret;
448 } 454 }
@@ -628,7 +634,8 @@ nouveau_gem_ioctl_pushbuf(struct drm_device *dev, void *data,
628 ret = nouveau_gem_pushbuf_validate(chan, file_priv, bo, req->buffers, 634 ret = nouveau_gem_pushbuf_validate(chan, file_priv, bo, req->buffers,
629 req->nr_buffers, &op, &do_reloc); 635 req->nr_buffers, &op, &do_reloc);
630 if (ret) { 636 if (ret) {
631 NV_ERROR(dev, "validate: %d\n", ret); 637 if (ret != -ERESTARTSYS)
638 NV_ERROR(dev, "validate: %d\n", ret);
632 goto out; 639 goto out;
633 } 640 }
634 641