diff options
author | Ben Skeggs <bskeggs@redhat.com> | 2010-10-11 19:54:54 -0400 |
---|---|---|
committer | Ben Skeggs <bskeggs@redhat.com> | 2010-12-03 00:05:26 -0500 |
commit | 938c40ed69b2c1eceb72247b5e8975b28afc195f (patch) | |
tree | 7e3894ef6edf340880c4bf30aa89b5dcc3c35baf | |
parent | 08cd3d4311fb9c5038bc6fb0c83c250cfb218da2 (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.c | 31 |
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 | ||