Commit e9ffa5c2 authored by Jackie Liu's avatar Jackie Liu Committed by Jens Axboe
Browse files

io_uring: set -EINTR directly when a signal wakes up in io_cqring_wait



We didn't use -ERESTARTSYS to tell the application layer to restart the
system call, but instead return -EINTR. we can set -EINTR directly when
wakeup by the signal, which can help us save an assignment operation and
comparison operation.

Reviewed-by: default avatarBob Liu <bob.liu@oracle.com>
Signed-off-by: default avatarJackie Liu <liuyun01@kylinos.cn>
Signed-off-by: default avatarJens Axboe <axboe@kernel.dk>
parent 62755e35
Loading
Loading
Loading
Loading
+3 −6
Original line number Diff line number Diff line
@@ -2976,7 +2976,7 @@ static int io_cqring_wait(struct io_ring_ctx *ctx, int min_events,
		.to_wait	= min_events,
	};
	struct io_rings *rings = ctx->rings;
	int ret;
	int ret = 0;

	if (io_cqring_events(rings) >= min_events)
		return 0;
@@ -2994,7 +2994,6 @@ static int io_cqring_wait(struct io_ring_ctx *ctx, int min_events,
			return ret;
	}

	ret = 0;
	iowq.nr_timeouts = atomic_read(&ctx->cq_timeouts);
	trace_io_uring_cqring_wait(ctx, min_events);
	do {
@@ -3004,15 +3003,13 @@ static int io_cqring_wait(struct io_ring_ctx *ctx, int min_events,
			break;
		schedule();
		if (signal_pending(current)) {
			ret = -ERESTARTSYS;
			ret = -EINTR;
			break;
		}
	} while (1);
	finish_wait(&ctx->wait, &iowq.wq);

	restore_saved_sigmask_unless(ret == -ERESTARTSYS);
	if (ret == -ERESTARTSYS)
		ret = -EINTR;
	restore_saved_sigmask_unless(ret == -EINTR);

	return READ_ONCE(rings->cq.head) == READ_ONCE(rings->cq.tail) ? ret : 0;
}