From: Thomas Hellstrom <thellst...@vmware.com>

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 <thellst...@vmware.com>
Signed-off-by: Jerome Glisse <jgli...@redhat.com>
---
 drivers/gpu/drm/ttm/ttm_bo.c    |   29 +++++++++++------------------
 drivers/gpu/drm/ttm/ttm_bo_vm.c |    7 +------
 include/drm/ttm/ttm_bo_api.h    |   14 +++++++-------
 include/drm/ttm/ttm_bo_driver.h |    8 ++++----
 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 5ffb44f..b8dea3a 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)
                ret = wait_event_interruptible(bo->event_queue,
                                               atomic_read(&bo->reserved) == 0);
                if (unlikely(ret != 0))
-                       return -ERESTART;
+                       return ret;
        } else {
                wait_event(bo->event_queue, atomic_read(&bo->reserved) == 0);
        }
@@ -570,7 +570,7 @@ static int ttm_bo_evict(struct ttm_buffer_object *bo, bool 
interruptible,
        spin_unlock(&bo->lock);
 
        if (unlikely(ret != 0)) {
-               if (ret != -ERESTART) {
+               if (ret != -ERESTARTSYS) {
                        printk(KERN_ERR TTM_PFX
                               "Failed to expire sync object before "
                               "buffer eviction.\n");
@@ -587,7 +587,7 @@ static int ttm_bo_evict(struct ttm_buffer_object *bo, bool 
interruptible,
        ret = ttm_bo_mem_space(bo, &placement, &evict_mem, interruptible,
                                no_wait);
        if (ret) {
-               if (ret != -ERESTART)
+               if (ret != -ERESTARTSYS)
                        printk(KERN_ERR TTM_PFX
                               "Failed to find memory space for "
                               "buffer 0x%p eviction.\n", bo);
@@ -597,7 +597,7 @@ static int ttm_bo_evict(struct ttm_buffer_object *bo, bool 
interruptible,
        ret = ttm_bo_handle_move_mem(bo, &evict_mem, true, interruptible,
                                     no_wait);
        if (ret) {
-               if (ret != -ERESTART)
+               if (ret != -ERESTARTSYS)
                        printk(KERN_ERR TTM_PFX "Buffer eviction failed\n");
                spin_lock(&glob->lru_lock);
                if (evict_mem.mm_node) {
@@ -794,7 +794,7 @@ int ttm_bo_mem_space(struct ttm_buffer_object *bo,
        uint32_t cur_flags = 0;
        bool type_found = false;
        bool type_ok = false;
-       bool has_eagain = false;
+       bool has_erestartsys = false;
        struct drm_mm_node *node = NULL;
        int i, ret;
 
@@ -869,28 +869,21 @@ int ttm_bo_mem_space(struct ttm_buffer_object *bo,
                        mem->mm_node->private = bo;
                        return 0;
                }
-               if (ret == -ERESTART)
-                       has_eagain = true;
+               if (ret == -ERESTARTSYS)
+                       has_erestartsys = true;
        }
-       ret = (has_eagain) ? -ERESTART : -ENOMEM;
+       ret = (has_erestartsys) ? -ERESTARTSYS : -ENOMEM;
        return ret;
 }
 EXPORT_SYMBOL(ttm_bo_mem_space);
 
 int ttm_bo_wait_cpu(struct ttm_buffer_object *bo, bool no_wait)
 {
-       int ret = 0;
-
        if ((atomic_read(&bo->cpu_writers) > 0) && no_wait)
                return -EBUSY;
 
-       ret = wait_event_interruptible(bo->event_queue,
-                                      atomic_read(&bo->cpu_writers) == 0);
-
-       if (ret == -ERESTARTSYS)
-               ret = -ERESTART;
-
-       return ret;
+       return wait_event_interruptible(bo->event_queue,
+                                       atomic_read(&bo->cpu_writers) == 0);
 }
 
 int ttm_bo_move_buffer(struct ttm_buffer_object *bo,
@@ -1652,7 +1645,7 @@ int ttm_bo_block_reservation(struct ttm_buffer_object 
*bo, bool interruptible,
                        ret = wait_event_interruptible
                            (bo->event_queue, atomic_read(&bo->reserved) == 0);
                        if (unlikely(ret != 0))
-                               return -ERESTART;
+                               return ret;
                } else {
                        wait_event(bo->event_queue,
                                   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 1c040d0..609a85a 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)
                ret = ttm_bo_wait(bo, false, true, false);
                spin_unlock(&bo->lock);
                if (unlikely(ret != 0)) {
-                       retval = (ret != -ERESTART) ?
+                       retval = (ret != -ERESTARTSYS) ?
                            VM_FAULT_SIGBUS : VM_FAULT_NOPAGE;
                        goto out_unlock;
                }
@@ -349,9 +349,6 @@ ssize_t ttm_bo_io(struct ttm_bo_device *bdev, struct file 
*filp,
        switch (ret) {
        case 0:
                break;
-       case -ERESTART:
-               ret = -EINTR;
-               goto out_unref;
        case -EBUSY:
                ret = -EAGAIN;
                goto out_unref;
@@ -421,8 +418,6 @@ ssize_t ttm_bo_fbdev_io(struct ttm_buffer_object *bo, const 
char __user *wbuf,
        switch (ret) {
        case 0:
                break;
-       case -ERESTART:
-               return -EINTR;
        case -EBUSY:
                return -EAGAIN;
        default:
diff --git a/include/drm/ttm/ttm_bo_api.h b/include/drm/ttm/ttm_bo_api.h
index 2f7f56d..4fd4985 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)
  * Note: It might be necessary to block validations before the
  * wait by reserving the buffer.
  * Returns -EBUSY if no_wait is true and the buffer is busy.
- * Returns -ERESTART if interrupted by a signal.
+ * Returns -ERESTARTSYS if interrupted by a signal.
  */
 extern int ttm_bo_wait(struct ttm_buffer_object *bo, bool lazy,
                       bool interruptible, bool no_wait);
@@ -321,7 +321,7 @@ extern int ttm_bo_wait(struct ttm_buffer_object *bo, bool 
lazy,
  * -EINVAL on invalid proposed placement.
  * -ENOMEM on out-of-memory condition.
  * -EBUSY if no_wait is true and buffer busy.
- * -ERESTART if interrupted by a signal.
+ * -ERESTARTSYS if interrupted by a signal.
  */
 extern int ttm_buffer_object_validate(struct ttm_buffer_object *bo,
                                        struct ttm_placement *placement,
@@ -347,7 +347,7 @@ extern void ttm_bo_unref(struct ttm_buffer_object **bo);
  * waiting for buffer idle. This lock is recursive.
  * Returns
  * -EBUSY if the buffer is busy and no_wait is true.
- * -ERESTART if interrupted by a signal.
+ * -ERESTARTSYS if interrupted by a signal.
  */
 
 extern int
@@ -390,7 +390,7 @@ extern void ttm_bo_synccpu_write_release(struct 
ttm_buffer_object *bo);
  * Returns
  * -ENOMEM: Out of memory.
  * -EINVAL: Invalid placement flags.
- * -ERESTART: Interrupted by signal while sleeping waiting for resources.
+ * -ERESTARTSYS: Interrupted by signal while sleeping waiting for resources.
  */
 
 extern 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,
  * Returns
  * -ENOMEM: Out of memory.
  * -EINVAL: Invalid placement flags.
- * -ERESTART: Interrupted by signal while waiting for resources.
+ * -ERESTARTSYS: Interrupted by signal while waiting for resources.
  */
 
 extern 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);
  *
  * Returns:
  * -EINVAL: Invalid or uninitialized memory type.
- * -ERESTART: The call was interrupted by a signal while waiting to
+ * -ERESTARTSYS: The call was interrupted by a signal while waiting to
  * evict a buffer.
  */
 
@@ -624,7 +624,7 @@ extern int ttm_bo_mmap(struct file *filp, struct 
vm_area_struct *vma,
  * be called from the fops::read and fops::write method.
  * Returns:
  * See man (2) write, man(2) read. In particular,
- * the function may return -EINTR if
+ * the function may return -ERESTARTSYS if
  * interrupted by a signal.
  */
 
diff --git a/include/drm/ttm/ttm_bo_driver.h b/include/drm/ttm/ttm_bo_driver.h
index 1dd1dbc..d5af19a 100644
--- a/include/drm/ttm/ttm_bo_driver.h
+++ b/include/drm/ttm/ttm_bo_driver.h
@@ -629,7 +629,7 @@ extern bool ttm_mem_reg_is_pci(struct ttm_bo_device *bdev,
  * -EBUSY: No space available (only if no_wait == 1).
  * -ENOMEM: Could not allocate memory for the buffer object, either due to
  * fragmentation or concurrent allocators.
- * -ERESTART: An interruptible sleep was interrupted by a signal.
+ * -ERESTARTSYS: An interruptible sleep was interrupted by a signal.
  */
 extern int ttm_bo_mem_space(struct ttm_buffer_object *bo,
                                struct ttm_placement *placement,
@@ -644,7 +644,7 @@ extern int ttm_bo_mem_space(struct ttm_buffer_object *bo,
  * Wait until a buffer object is no longer sync'ed for CPU access.
  * Returns:
  * -EBUSY: Buffer object was sync'ed for CPU access. (only if no_wait == 1).
- * -ERESTART: An interruptible sleep was interrupted by a signal.
+ * -ERESTARTSYS: An interruptible sleep was interrupted by a signal.
  */
 
 extern int ttm_bo_wait_cpu(struct ttm_buffer_object *bo, bool no_wait);
@@ -748,7 +748,7 @@ extern void ttm_bo_unmap_virtual(struct ttm_buffer_object 
*bo);
  * -EAGAIN: The reservation may cause a deadlock.
  * Release all buffer reservations, wait for @bo to become unreserved and
  * try again. (only if use_sequence == 1).
- * -ERESTART: A wait for the buffer to become unreserved was interrupted by
+ * -ERESTARTSYS: A wait for the buffer to become unreserved was interrupted by
  * a signal. Release all buffer reservations and return to user-space.
  */
 extern int ttm_bo_reserve(struct ttm_buffer_object *bo,
@@ -789,7 +789,7 @@ extern int ttm_bo_wait_unreserved(struct ttm_buffer_object 
*bo,
  *
  * Returns:
  * -EBUSY: If no_wait == 1 and the buffer is already reserved.
- * -ERESTART: If interruptible == 1 and the process received a signal
+ * -ERESTARTSYS: If interruptible == 1 and the process received a signal
  * while sleeping.
  */
 extern int ttm_bo_block_reservation(struct ttm_buffer_object *bo,
-- 
1.6.5.2


------------------------------------------------------------------------------
Join us December 9, 2009 for the Red Hat Virtual Experience,
a free event focused on virtualization and cloud computing. 
Attend in-depth sessions from your desk. Your couch. Anywhere.
http://p.sf.net/sfu/redhat-sfdev2dev
--
_______________________________________________
Dri-devel mailing list
Dri-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/dri-devel

Reply via email to