io_uring/net: reshuffle error handling
authorPavel Begunkov <asml.silence@gmail.com>
Thu, 8 Sep 2022 12:20:29 +0000 (13:20 +0100)
committerJens Axboe <axboe@kernel.dk>
Wed, 21 Sep 2022 16:30:43 +0000 (10:30 -0600)
We should prioritise send/recv retry cases over failures, they're more
important. Shuffle -ERESTARTSYS after we handled retries.

Signed-off-by: Pavel Begunkov <asml.silence@gmail.com>
Link: https://lore.kernel.org/r/d9059691b30d0963b7269fa4a0c81ee7720555e6.1662639236.git.asml.silence@gmail.com
Signed-off-by: Jens Axboe <axboe@kernel.dk>
io_uring/net.c

index 60e392f7f2dcdc91c5390be2386a604a741af355..d5b80b66feab423908a76cc97b7522a8f542e8da 100644 (file)
@@ -291,13 +291,13 @@ int io_sendmsg(struct io_kiocb *req, unsigned int issue_flags)
        if (ret < min_ret) {
                if (ret == -EAGAIN && (issue_flags & IO_URING_F_NONBLOCK))
                        return io_setup_async_msg(req, kmsg, issue_flags);
-               if (ret == -ERESTARTSYS)
-                       ret = -EINTR;
                if (ret > 0 && io_net_retry(sock, flags)) {
                        sr->done_io += ret;
                        req->flags |= REQ_F_PARTIAL_IO;
                        return io_setup_async_msg(req, kmsg, issue_flags);
                }
+               if (ret == -ERESTARTSYS)
+                       ret = -EINTR;
                req_set_fail(req);
        }
        /* fast path, check for non-NULL to avoid function call */
@@ -352,8 +352,6 @@ int io_send(struct io_kiocb *req, unsigned int issue_flags)
        if (ret < min_ret) {
                if (ret == -EAGAIN && (issue_flags & IO_URING_F_NONBLOCK))
                        return -EAGAIN;
-               if (ret == -ERESTARTSYS)
-                       ret = -EINTR;
                if (ret > 0 && io_net_retry(sock, flags)) {
                        sr->len -= ret;
                        sr->buf += ret;
@@ -361,6 +359,8 @@ int io_send(struct io_kiocb *req, unsigned int issue_flags)
                        req->flags |= REQ_F_PARTIAL_IO;
                        return -EAGAIN;
                }
+               if (ret == -ERESTARTSYS)
+                       ret = -EINTR;
                req_set_fail(req);
        }
        if (ret >= 0)
@@ -751,13 +751,13 @@ retry_multishot:
                        }
                        return ret;
                }
-               if (ret == -ERESTARTSYS)
-                       ret = -EINTR;
                if (ret > 0 && io_net_retry(sock, flags)) {
                        sr->done_io += ret;
                        req->flags |= REQ_F_PARTIAL_IO;
                        return io_setup_async_msg(req, kmsg, issue_flags);
                }
+               if (ret == -ERESTARTSYS)
+                       ret = -EINTR;
                req_set_fail(req);
        } else if ((flags & MSG_WAITALL) && (kmsg->msg.msg_flags & (MSG_TRUNC | MSG_CTRUNC))) {
                req_set_fail(req);
@@ -847,8 +847,6 @@ retry_multishot:
 
                        return -EAGAIN;
                }
-               if (ret == -ERESTARTSYS)
-                       ret = -EINTR;
                if (ret > 0 && io_net_retry(sock, flags)) {
                        sr->len -= ret;
                        sr->buf += ret;
@@ -856,6 +854,8 @@ retry_multishot:
                        req->flags |= REQ_F_PARTIAL_IO;
                        return -EAGAIN;
                }
+               if (ret == -ERESTARTSYS)
+                       ret = -EINTR;
                req_set_fail(req);
        } else if ((flags & MSG_WAITALL) && (msg.msg_flags & (MSG_TRUNC | MSG_CTRUNC))) {
 out_free: