Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 98ffc415 authored by Thomas Hellstrom's avatar Thomas Hellstrom Committed by Dave Airlie
Browse files

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: default avatarThomas Hellstrom <thellstrom@vmware.com>
Signed-off-by: default avatarJerome Glisse <jglisse@redhat.com>
Signed-off-by: default avatarDave Airlie <airlied@redhat.com>
parent 312ea8da
Loading
Loading
Loading
Loading
+11 −18
Original line number Diff line number Diff line
@@ -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);
	}
@@ -571,7 +571,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");
@@ -588,7 +588,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);
@@ -598,7 +598,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) {
@@ -795,7 +795,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;

@@ -882,28 +882,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,
	return wait_event_interruptible(bo->event_queue,
					atomic_read(&bo->cpu_writers) == 0);

	if (ret == -ERESTARTSYS)
		ret = -ERESTART;

	return ret;
}

int 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,
			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);
+1 −6
Original line number Diff line number Diff line
@@ -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:
+7 −7
Original line number Diff line number Diff line
@@ -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.
 */

+4 −4
Original line number Diff line number Diff line
@@ -638,7 +638,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,
@@ -653,7 +653,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);
@@ -757,7 +757,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,
@@ -798,7 +798,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,