Merge tag 'net-next-6.5' of git://git.kernel.org/pub/scm/linux/kernel/git/netdev...
[linux-2.6-microblaze.git] / io_uring / net.c
index 4b8e847..d7e6efe 100644 (file)
@@ -625,9 +625,15 @@ static inline void io_recv_prep_retry(struct io_kiocb *req)
  * again (for multishot).
  */
 static inline bool io_recv_finish(struct io_kiocb *req, int *ret,
-                                 unsigned int cflags, bool mshot_finished,
+                                 struct msghdr *msg, bool mshot_finished,
                                  unsigned issue_flags)
 {
+       unsigned int cflags;
+
+       cflags = io_put_kbuf(req, issue_flags);
+       if (msg->msg_inq && msg->msg_inq != -1U)
+               cflags |= IORING_CQE_F_SOCK_NONEMPTY;
+
        if (!(req->flags & REQ_F_APOLL_MULTISHOT)) {
                io_req_set_res(req, *ret, cflags);
                *ret = IOU_OK;
@@ -635,10 +641,18 @@ static inline bool io_recv_finish(struct io_kiocb *req, int *ret,
        }
 
        if (!mshot_finished) {
-               if (io_aux_cqe(req->ctx, issue_flags & IO_URING_F_COMPLETE_DEFER,
-                              req->cqe.user_data, *ret, cflags | IORING_CQE_F_MORE, true)) {
+               if (io_aux_cqe(req, issue_flags & IO_URING_F_COMPLETE_DEFER,
+                              *ret, cflags | IORING_CQE_F_MORE, true)) {
                        io_recv_prep_retry(req);
-                       return false;
+                       /* Known not-empty or unknown state, retry */
+                       if (cflags & IORING_CQE_F_SOCK_NONEMPTY ||
+                           msg->msg_inq == -1U)
+                               return false;
+                       if (issue_flags & IO_URING_F_MULTISHOT)
+                               *ret = IOU_ISSUE_SKIP_COMPLETE;
+                       else
+                               *ret = -EAGAIN;
+                       return true;
                }
                /* Otherwise stop multishot but use the current result. */
        }
@@ -741,7 +755,6 @@ int io_recvmsg(struct io_kiocb *req, unsigned int issue_flags)
        struct io_sr_msg *sr = io_kiocb_to_cmd(req, struct io_sr_msg);
        struct io_async_msghdr iomsg, *kmsg;
        struct socket *sock;
-       unsigned int cflags;
        unsigned flags;
        int ret, min_ret = 0;
        bool force_nonblock = issue_flags & IO_URING_F_NONBLOCK;
@@ -792,6 +805,7 @@ retry_multishot:
                flags |= MSG_DONTWAIT;
 
        kmsg->msg.msg_get_inq = 1;
+       kmsg->msg.msg_inq = -1U;
        if (req->flags & REQ_F_APOLL_MULTISHOT) {
                ret = io_recvmsg_multishot(sock, sr, kmsg, flags,
                                           &mshot_finished);
@@ -832,11 +846,7 @@ retry_multishot:
        else
                io_kbuf_recycle(req, issue_flags);
 
-       cflags = io_put_kbuf(req, issue_flags);
-       if (kmsg->msg.msg_inq)
-               cflags |= IORING_CQE_F_SOCK_NONEMPTY;
-
-       if (!io_recv_finish(req, &ret, cflags, mshot_finished, issue_flags))
+       if (!io_recv_finish(req, &ret, &kmsg->msg, mshot_finished, issue_flags))
                goto retry_multishot;
 
        if (mshot_finished) {
@@ -855,7 +865,6 @@ int io_recv(struct io_kiocb *req, unsigned int issue_flags)
        struct io_sr_msg *sr = io_kiocb_to_cmd(req, struct io_sr_msg);
        struct msghdr msg;
        struct socket *sock;
-       unsigned int cflags;
        unsigned flags;
        int ret, min_ret = 0;
        bool force_nonblock = issue_flags & IO_URING_F_NONBLOCK;
@@ -872,6 +881,14 @@ int io_recv(struct io_kiocb *req, unsigned int issue_flags)
        if (unlikely(!sock))
                return -ENOTSOCK;
 
+       msg.msg_name = NULL;
+       msg.msg_namelen = 0;
+       msg.msg_control = NULL;
+       msg.msg_get_inq = 1;
+       msg.msg_controllen = 0;
+       msg.msg_iocb = NULL;
+       msg.msg_ubuf = NULL;
+
 retry_multishot:
        if (io_do_buffer_select(req)) {
                void __user *buf;
@@ -886,14 +903,8 @@ retry_multishot:
        if (unlikely(ret))
                goto out_free;
 
-       msg.msg_name = NULL;
-       msg.msg_namelen = 0;
-       msg.msg_control = NULL;
-       msg.msg_get_inq = 1;
+       msg.msg_inq = -1U;
        msg.msg_flags = 0;
-       msg.msg_controllen = 0;
-       msg.msg_iocb = NULL;
-       msg.msg_ubuf = NULL;
 
        flags = sr->msg_flags;
        if (force_nonblock)
@@ -933,11 +944,7 @@ out_free:
        else
                io_kbuf_recycle(req, issue_flags);
 
-       cflags = io_put_kbuf(req, issue_flags);
-       if (msg.msg_inq)
-               cflags |= IORING_CQE_F_SOCK_NONEMPTY;
-
-       if (!io_recv_finish(req, &ret, cflags, ret <= 0, issue_flags))
+       if (!io_recv_finish(req, &ret, &msg, ret <= 0, issue_flags))
                goto retry_multishot;
 
        return ret;
@@ -1310,7 +1317,6 @@ int io_accept_prep(struct io_kiocb *req, const struct io_uring_sqe *sqe)
 
 int io_accept(struct io_kiocb *req, unsigned int issue_flags)
 {
-       struct io_ring_ctx *ctx = req->ctx;
        struct io_accept *accept = io_kiocb_to_cmd(req, struct io_accept);
        bool force_nonblock = issue_flags & IO_URING_F_NONBLOCK;
        unsigned int file_flags = force_nonblock ? O_NONBLOCK : 0;
@@ -1360,8 +1366,8 @@ retry:
 
        if (ret < 0)
                return ret;
-       if (io_aux_cqe(ctx, issue_flags & IO_URING_F_COMPLETE_DEFER,
-                      req->cqe.user_data, ret, IORING_CQE_F_MORE, true))
+       if (io_aux_cqe(req, issue_flags & IO_URING_F_COMPLETE_DEFER, ret,
+                      IORING_CQE_F_MORE, true))
                goto retry;
 
        return -ECANCELED;