summary refs log tree commit diff
path: root/io_uring
diff options
context:
space:
mode:
authorJens Axboe <axboe@kernel.dk>2023-07-20 13:16:53 -0600
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>2023-07-27 08:50:23 +0200
commit1b87f546a035bd8b2b4c73cb346344af542d8663 (patch)
treeb1bb2493f11df2f2473d7413ce7e35ace85f8b7f /io_uring
parent5302e81aa2091d7dd59803f0727d1ba35ed2f929 (diff)
downloadlinux-1b87f546a035bd8b2b4c73cb346344af542d8663.tar.gz
io_uring: treat -EAGAIN for REQ_F_NOWAIT as final for io-wq
commit a9be202269580ca611c6cebac90eaf1795497800 upstream.

io-wq assumes that an issue is blocking, but it may not be if the
request type has asked for a non-blocking attempt. If we get
-EAGAIN for that case, then we need to treat it as a final result
and not retry or arm poll for it.

Cc: stable@vger.kernel.org # 5.10+
Link: https://github.com/axboe/liburing/issues/897
Signed-off-by: Jens Axboe <axboe@kernel.dk>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Diffstat (limited to 'io_uring')
-rw-r--r--io_uring/io_uring.c8
1 files changed, 8 insertions, 0 deletions
diff --git a/io_uring/io_uring.c b/io_uring/io_uring.c
index 38bc0073a7d4..bd7b8cf8bc67 100644
--- a/io_uring/io_uring.c
+++ b/io_uring/io_uring.c
@@ -1803,6 +1803,14 @@ fail:
 		ret = io_issue_sqe(req, issue_flags);
 		if (ret != -EAGAIN)
 			break;
+
+		/*
+		 * If REQ_F_NOWAIT is set, then don't wait or retry with
+		 * poll. -EAGAIN is final for that case.
+		 */
+		if (req->flags & REQ_F_NOWAIT)
+			break;
+
 		/*
 		 * We can get EAGAIN for iopolled IO even though we're
 		 * forcing a sync submission from here, since we can't