aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorThomas Hellstrom <thellstrom@vmware.com>2009-12-07 12:36:18 -0500
committerDave Airlie <airlied@redhat.com>2009-12-10 00:09:03 -0500
commit98ffc4158e12008102cb6ae242a7fc46f9243f0d (patch)
treefa8b231281fac87afe88ab9a0539c6ab5cdc2100
parent312ea8da049a1830aa50c6e00002e50e30df476e (diff)
drm/ttm: Have the TTM code return -ERESTARTSYS instead of -ERESTART.
Return -ERESTARTSYS instead of -ERESTART when interrupted by a signal. The -ERESTARTSYS is converted to an -EINTR by the kernel signal layer before returned to user-space. Signed-off-by: Thomas Hellstrom <thellstrom@vmware.com> Signed-off-by: Jerome Glisse <jglisse@redhat.com> Signed-off-by: Dave Airlie <airlied@redhat.com>
-rw-r--r--drivers/gpu/drm/ttm/ttm_bo.c29
-rw-r--r--drivers/gpu/drm/ttm/ttm_bo_vm.c7
-rw-r--r--include/drm/ttm/ttm_bo_api.h14
-rw-r--r--include/drm/ttm/ttm_bo_driver.h8
4 files changed, 23 insertions, 35 deletions
diff --git a/drivers/gpu/drm/ttm/ttm_bo.c b/drivers/gpu/drm/ttm/ttm_bo.c
index 60d8179a8bcd..640fb265dd5a 100644
--- a/drivers/gpu/drm/ttm/ttm_bo.c
+++ b/drivers/gpu/drm/ttm/ttm_bo.c
@@ -125,7 +125,7 @@ int ttm_bo_wait_unreserved(struct ttm_buffer_object *bo, bool interruptible)
125 ret = wait_event_interruptible(bo->event_queue, 125 ret = wait_event_interruptible(bo->event_queue,
126 atomic_read(&bo->reserved) == 0); 126 atomic_read(&bo->reserved) == 0);
127 if (unlikely(ret != 0)) 127 if (unlikely(ret != 0))
128 return -ERESTART; 128 return ret;
129 } else { 129 } else {
130 wait_event(bo->event_queue, atomic_read(&bo->reserved) == 0); 130 wait_event(bo->event_queue, atomic_read(&bo->reserved) == 0);
131 } 131 }
@@ -571,7 +571,7 @@ static int ttm_bo_evict(struct ttm_buffer_object *bo, bool interruptible,
571 spin_unlock(&bo->lock); 571 spin_unlock(&bo->lock);
572 572
573 if (unlikely(ret != 0)) { 573 if (unlikely(ret != 0)) {
574 if (ret != -ERESTART) { 574 if (ret != -ERESTARTSYS) {
575 printk(KERN_ERR TTM_PFX 575 printk(KERN_ERR TTM_PFX
576 "Failed to expire sync object before " 576 "Failed to expire sync object before "
577 "buffer eviction.\n"); 577 "buffer eviction.\n");
@@ -588,7 +588,7 @@ static int ttm_bo_evict(struct ttm_buffer_object *bo, bool interruptible,
588 ret = ttm_bo_mem_space(bo, &placement, &evict_mem, interruptible, 588 ret = ttm_bo_mem_space(bo, &placement, &evict_mem, interruptible,
589 no_wait); 589 no_wait);
590 if (ret) { 590 if (ret) {
591 if (ret != -ERESTART) 591 if (ret != -ERESTARTSYS)
592 printk(KERN_ERR TTM_PFX 592 printk(KERN_ERR TTM_PFX
593 "Failed to find memory space for " 593 "Failed to find memory space for "
594 "buffer 0x%p eviction.\n", bo); 594 "buffer 0x%p eviction.\n", bo);
@@ -598,7 +598,7 @@ static int ttm_bo_evict(struct ttm_buffer_object *bo, bool interruptible,
598 ret = ttm_bo_handle_move_mem(bo, &evict_mem, true, interruptible, 598 ret = ttm_bo_handle_move_mem(bo, &evict_mem, true, interruptible,
599 no_wait); 599 no_wait);
600 if (ret) { 600 if (ret) {
601 if (ret != -ERESTART) 601 if (ret != -ERESTARTSYS)
602 printk(KERN_ERR TTM_PFX "Buffer eviction failed\n"); 602 printk(KERN_ERR TTM_PFX "Buffer eviction failed\n");
603 spin_lock(&glob->lru_lock); 603 spin_lock(&glob->lru_lock);
604 if (evict_mem.mm_node) { 604 if (evict_mem.mm_node) {
@@ -795,7 +795,7 @@ int ttm_bo_mem_space(struct ttm_buffer_object *bo,
795 uint32_t cur_flags = 0; 795 uint32_t cur_flags = 0;
796 bool type_found = false; 796 bool type_found = false;
797 bool type_ok = false; 797 bool type_ok = false;
798 bool has_eagain = false; 798 bool has_erestartsys = false;
799 struct drm_mm_node *node = NULL; 799 struct drm_mm_node *node = NULL;
800 int i, ret; 800 int i, ret;
801 801
@@ -882,28 +882,21 @@ int ttm_bo_mem_space(struct ttm_buffer_object *bo,
882 mem->mm_node->private = bo; 882 mem->mm_node->private = bo;
883 return 0; 883 return 0;
884 } 884 }
885 if (ret == -ERESTART) 885 if (ret == -ERESTARTSYS)
886 has_eagain = true; 886 has_erestartsys = true;
887 } 887 }
888 ret = (has_eagain) ? -ERESTART : -ENOMEM; 888 ret = (has_erestartsys) ? -ERESTARTSYS : -ENOMEM;
889 return ret; 889 return ret;
890} 890}
891EXPORT_SYMBOL(ttm_bo_mem_space); 891EXPORT_SYMBOL(ttm_bo_mem_space);
892 892
893int ttm_bo_wait_cpu(struct ttm_buffer_object *bo, bool no_wait) 893int ttm_bo_wait_cpu(struct ttm_buffer_object *bo, bool no_wait)
894{ 894{
895 int ret = 0;
896
897 if ((atomic_read(&bo->cpu_writers) > 0) && no_wait) 895 if ((atomic_read(&bo->cpu_writers) > 0) && no_wait)
898 return -EBUSY; 896 return -EBUSY;
899 897
900 ret = wait_event_interruptible(bo->event_queue, 898 return wait_event_interruptible(bo->event_queue,
901 atomic_read(&bo->cpu_writers) == 0); 899 atomic_read(&bo->cpu_writers) == 0);
902
903 if (ret == -ERESTARTSYS)
904 ret = -ERESTART;
905
906 return ret;
907} 900}
908 901
909int ttm_bo_move_buffer(struct ttm_buffer_object *bo, 902int ttm_bo_move_buffer(struct ttm_buffer_object *bo,
@@ -1673,7 +1666,7 @@ int ttm_bo_block_reservation(struct ttm_buffer_object *bo, bool interruptible,
1673 ret = wait_event_interruptible 1666 ret = wait_event_interruptible
1674 (bo->event_queue, atomic_read(&bo->reserved) == 0); 1667 (bo->event_queue, atomic_read(&bo->reserved) == 0);
1675 if (unlikely(ret != 0)) 1668 if (unlikely(ret != 0))
1676 return -ERESTART; 1669 return ret;
1677 } else { 1670 } else {
1678 wait_event(bo->event_queue, 1671 wait_event(bo->event_queue,
1679 atomic_read(&bo->reserved) == 0); 1672 atomic_read(&bo->reserved) == 0);
diff --git a/drivers/gpu/drm/ttm/ttm_bo_vm.c b/drivers/gpu/drm/ttm/ttm_bo_vm.c
index 1c040d040338..609a85a4d855 100644
--- a/drivers/gpu/drm/ttm/ttm_bo_vm.c
+++ b/drivers/gpu/drm/ttm/ttm_bo_vm.c
@@ -114,7 +114,7 @@ static int ttm_bo_vm_fault(struct vm_area_struct *vma, struct vm_fault *vmf)
114 ret = ttm_bo_wait(bo, false, true, false); 114 ret = ttm_bo_wait(bo, false, true, false);
115 spin_unlock(&bo->lock); 115 spin_unlock(&bo->lock);
116 if (unlikely(ret != 0)) { 116 if (unlikely(ret != 0)) {
117 retval = (ret != -ERESTART) ? 117 retval = (ret != -ERESTARTSYS) ?
118 VM_FAULT_SIGBUS : VM_FAULT_NOPAGE; 118 VM_FAULT_SIGBUS : VM_FAULT_NOPAGE;
119 goto out_unlock; 119 goto out_unlock;
120 } 120 }
@@ -349,9 +349,6 @@ ssize_t ttm_bo_io(struct ttm_bo_device *bdev, struct file *filp,
349 switch (ret) { 349 switch (ret) {
350 case 0: 350 case 0:
351 break; 351 break;
352 case -ERESTART:
353 ret = -EINTR;
354 goto out_unref;
355 case -EBUSY: 352 case -EBUSY:
356 ret = -EAGAIN; 353 ret = -EAGAIN;
357 goto out_unref; 354 goto out_unref;
@@ -421,8 +418,6 @@ ssize_t ttm_bo_fbdev_io(struct ttm_buffer_object *bo, const char __user *wbuf,
421 switch (ret) { 418 switch (ret) {
422 case 0: 419 case 0:
423 break; 420 break;
424 case -ERESTART:
425 return -EINTR;
426 case -EBUSY: 421 case -EBUSY:
427 return -EAGAIN; 422 return -EAGAIN;
428 default: 423 default:
diff --git a/include/drm/ttm/ttm_bo_api.h b/include/drm/ttm/ttm_bo_api.h
index 2f7f56da2147..4fd498523ce3 100644
--- a/include/drm/ttm/ttm_bo_api.h
+++ b/include/drm/ttm/ttm_bo_api.h
@@ -303,7 +303,7 @@ ttm_bo_reference(struct ttm_buffer_object *bo)
303 * Note: It might be necessary to block validations before the 303 * Note: It might be necessary to block validations before the
304 * wait by reserving the buffer. 304 * wait by reserving the buffer.
305 * Returns -EBUSY if no_wait is true and the buffer is busy. 305 * Returns -EBUSY if no_wait is true and the buffer is busy.
306 * Returns -ERESTART if interrupted by a signal. 306 * Returns -ERESTARTSYS if interrupted by a signal.
307 */ 307 */
308extern int ttm_bo_wait(struct ttm_buffer_object *bo, bool lazy, 308extern int ttm_bo_wait(struct ttm_buffer_object *bo, bool lazy,
309 bool interruptible, bool no_wait); 309 bool interruptible, bool no_wait);
@@ -321,7 +321,7 @@ extern int ttm_bo_wait(struct ttm_buffer_object *bo, bool lazy,
321 * -EINVAL on invalid proposed placement. 321 * -EINVAL on invalid proposed placement.
322 * -ENOMEM on out-of-memory condition. 322 * -ENOMEM on out-of-memory condition.
323 * -EBUSY if no_wait is true and buffer busy. 323 * -EBUSY if no_wait is true and buffer busy.
324 * -ERESTART if interrupted by a signal. 324 * -ERESTARTSYS if interrupted by a signal.
325 */ 325 */
326extern int ttm_buffer_object_validate(struct ttm_buffer_object *bo, 326extern int ttm_buffer_object_validate(struct ttm_buffer_object *bo,
327 struct ttm_placement *placement, 327 struct ttm_placement *placement,
@@ -347,7 +347,7 @@ extern void ttm_bo_unref(struct ttm_buffer_object **bo);
347 * waiting for buffer idle. This lock is recursive. 347 * waiting for buffer idle. This lock is recursive.
348 * Returns 348 * Returns
349 * -EBUSY if the buffer is busy and no_wait is true. 349 * -EBUSY if the buffer is busy and no_wait is true.
350 * -ERESTART if interrupted by a signal. 350 * -ERESTARTSYS if interrupted by a signal.
351 */ 351 */
352 352
353extern int 353extern int
@@ -390,7 +390,7 @@ extern void ttm_bo_synccpu_write_release(struct ttm_buffer_object *bo);
390 * Returns 390 * Returns
391 * -ENOMEM: Out of memory. 391 * -ENOMEM: Out of memory.
392 * -EINVAL: Invalid placement flags. 392 * -EINVAL: Invalid placement flags.
393 * -ERESTART: Interrupted by signal while sleeping waiting for resources. 393 * -ERESTARTSYS: Interrupted by signal while sleeping waiting for resources.
394 */ 394 */
395 395
396extern int ttm_buffer_object_init(struct ttm_bo_device *bdev, 396extern int ttm_buffer_object_init(struct ttm_bo_device *bdev,
@@ -430,7 +430,7 @@ extern int ttm_buffer_object_init(struct ttm_bo_device *bdev,
430 * Returns 430 * Returns
431 * -ENOMEM: Out of memory. 431 * -ENOMEM: Out of memory.
432 * -EINVAL: Invalid placement flags. 432 * -EINVAL: Invalid placement flags.
433 * -ERESTART: Interrupted by signal while waiting for resources. 433 * -ERESTARTSYS: Interrupted by signal while waiting for resources.
434 */ 434 */
435 435
436extern int ttm_buffer_object_create(struct ttm_bo_device *bdev, 436extern int ttm_buffer_object_create(struct ttm_bo_device *bdev,
@@ -521,7 +521,7 @@ extern int ttm_bo_clean_mm(struct ttm_bo_device *bdev, unsigned mem_type);
521 * 521 *
522 * Returns: 522 * Returns:
523 * -EINVAL: Invalid or uninitialized memory type. 523 * -EINVAL: Invalid or uninitialized memory type.
524 * -ERESTART: The call was interrupted by a signal while waiting to 524 * -ERESTARTSYS: The call was interrupted by a signal while waiting to
525 * evict a buffer. 525 * evict a buffer.
526 */ 526 */
527 527
@@ -624,7 +624,7 @@ extern int ttm_bo_mmap(struct file *filp, struct vm_area_struct *vma,
624 * be called from the fops::read and fops::write method. 624 * be called from the fops::read and fops::write method.
625 * Returns: 625 * Returns:
626 * See man (2) write, man(2) read. In particular, 626 * See man (2) write, man(2) read. In particular,
627 * the function may return -EINTR if 627 * the function may return -ERESTARTSYS if
628 * interrupted by a signal. 628 * interrupted by a signal.
629 */ 629 */
630 630
diff --git a/include/drm/ttm/ttm_bo_driver.h b/include/drm/ttm/ttm_bo_driver.h
index fa5c9e51ee7e..ff7664e0c3cd 100644
--- a/include/drm/ttm/ttm_bo_driver.h
+++ b/include/drm/ttm/ttm_bo_driver.h
@@ -638,7 +638,7 @@ extern bool ttm_mem_reg_is_pci(struct ttm_bo_device *bdev,
638 * -EBUSY: No space available (only if no_wait == 1). 638 * -EBUSY: No space available (only if no_wait == 1).
639 * -ENOMEM: Could not allocate memory for the buffer object, either due to 639 * -ENOMEM: Could not allocate memory for the buffer object, either due to
640 * fragmentation or concurrent allocators. 640 * fragmentation or concurrent allocators.
641 * -ERESTART: An interruptible sleep was interrupted by a signal. 641 * -ERESTARTSYS: An interruptible sleep was interrupted by a signal.
642 */ 642 */
643extern int ttm_bo_mem_space(struct ttm_buffer_object *bo, 643extern int ttm_bo_mem_space(struct ttm_buffer_object *bo,
644 struct ttm_placement *placement, 644 struct ttm_placement *placement,
@@ -653,7 +653,7 @@ extern int ttm_bo_mem_space(struct ttm_buffer_object *bo,
653 * Wait until a buffer object is no longer sync'ed for CPU access. 653 * Wait until a buffer object is no longer sync'ed for CPU access.
654 * Returns: 654 * Returns:
655 * -EBUSY: Buffer object was sync'ed for CPU access. (only if no_wait == 1). 655 * -EBUSY: Buffer object was sync'ed for CPU access. (only if no_wait == 1).
656 * -ERESTART: An interruptible sleep was interrupted by a signal. 656 * -ERESTARTSYS: An interruptible sleep was interrupted by a signal.
657 */ 657 */
658 658
659extern int ttm_bo_wait_cpu(struct ttm_buffer_object *bo, bool no_wait); 659extern int ttm_bo_wait_cpu(struct ttm_buffer_object *bo, bool no_wait);
@@ -757,7 +757,7 @@ extern void ttm_bo_unmap_virtual(struct ttm_buffer_object *bo);
757 * -EAGAIN: The reservation may cause a deadlock. 757 * -EAGAIN: The reservation may cause a deadlock.
758 * Release all buffer reservations, wait for @bo to become unreserved and 758 * Release all buffer reservations, wait for @bo to become unreserved and
759 * try again. (only if use_sequence == 1). 759 * try again. (only if use_sequence == 1).
760 * -ERESTART: A wait for the buffer to become unreserved was interrupted by 760 * -ERESTARTSYS: A wait for the buffer to become unreserved was interrupted by
761 * a signal. Release all buffer reservations and return to user-space. 761 * a signal. Release all buffer reservations and return to user-space.
762 */ 762 */
763extern int ttm_bo_reserve(struct ttm_buffer_object *bo, 763extern int ttm_bo_reserve(struct ttm_buffer_object *bo,
@@ -798,7 +798,7 @@ extern int ttm_bo_wait_unreserved(struct ttm_buffer_object *bo,
798 * 798 *
799 * Returns: 799 * Returns:
800 * -EBUSY: If no_wait == 1 and the buffer is already reserved. 800 * -EBUSY: If no_wait == 1 and the buffer is already reserved.
801 * -ERESTART: If interruptible == 1 and the process received a signal 801 * -ERESTARTSYS: If interruptible == 1 and the process received a signal
802 * while sleeping. 802 * while sleeping.
803 */ 803 */
804extern int ttm_bo_block_reservation(struct ttm_buffer_object *bo, 804extern int ttm_bo_block_reservation(struct ttm_buffer_object *bo,