io_uring/net: move connect to always using async data
authorJens Axboe <axboe@kernel.dk>
Tue, 19 Mar 2024 02:37:22 +0000 (20:37 -0600)
committerJens Axboe <axboe@kernel.dk>
Mon, 15 Apr 2024 14:10:25 +0000 (08:10 -0600)
While doing that, get rid of io_async_connect and just use the generic
io_async_msghdr. Both of them have a struct sockaddr_storage in there,
and while io_async_msghdr is bigger, if the same type can be used then
the netmsg_cache can get reused for connect as well.

Signed-off-by: Jens Axboe <axboe@kernel.dk>
io_uring/net.c
io_uring/net.h
io_uring/opdef.c

index 1e1d77321fcec4ed5e768f09e84608e50213a180..3bef562b67de0d1c1f9ccc0bbde17e6eef36df49 100644 (file)
@@ -1428,17 +1428,10 @@ int io_socket(struct io_kiocb *req, unsigned int issue_flags)
        return IOU_OK;
 }
 
-int io_connect_prep_async(struct io_kiocb *req)
-{
-       struct io_async_connect *io = req->async_data;
-       struct io_connect *conn = io_kiocb_to_cmd(req, struct io_connect);
-
-       return move_addr_to_kernel(conn->addr, conn->addr_len, &io->address);
-}
-
 int io_connect_prep(struct io_kiocb *req, const struct io_uring_sqe *sqe)
 {
        struct io_connect *conn = io_kiocb_to_cmd(req, struct io_connect);
+       struct io_async_msghdr *io;
 
        if (sqe->len || sqe->buf_index || sqe->rw_flags || sqe->splice_fd_in)
                return -EINVAL;
@@ -1446,32 +1439,26 @@ int io_connect_prep(struct io_kiocb *req, const struct io_uring_sqe *sqe)
        conn->addr = u64_to_user_ptr(READ_ONCE(sqe->addr));
        conn->addr_len =  READ_ONCE(sqe->addr2);
        conn->in_progress = conn->seen_econnaborted = false;
-       return 0;
+
+       io = io_msg_alloc_async(req);
+       if (unlikely(!io))
+               return -ENOMEM;
+
+       return move_addr_to_kernel(conn->addr, conn->addr_len, &io->addr);
 }
 
 int io_connect(struct io_kiocb *req, unsigned int issue_flags)
 {
        struct io_connect *connect = io_kiocb_to_cmd(req, struct io_connect);
-       struct io_async_connect __io, *io;
+       struct io_async_msghdr *io = req->async_data;
        unsigned file_flags;
        int ret;
        bool force_nonblock = issue_flags & IO_URING_F_NONBLOCK;
 
-       if (req_has_async_data(req)) {
-               io = req->async_data;
-       } else {
-               ret = move_addr_to_kernel(connect->addr,
-                                               connect->addr_len,
-                                               &__io.address);
-               if (ret)
-                       goto out;
-               io = &__io;
-       }
-
        file_flags = force_nonblock ? O_NONBLOCK : 0;
 
-       ret = __sys_connect_file(req->file, &io->address,
-                                       connect->addr_len, file_flags);
+       ret = __sys_connect_file(req->file, &io->addr, connect->addr_len,
+                                file_flags);
        if ((ret == -EAGAIN || ret == -EINPROGRESS || ret == -ECONNABORTED)
            && force_nonblock) {
                if (ret == -EINPROGRESS) {
@@ -1481,13 +1468,6 @@ int io_connect(struct io_kiocb *req, unsigned int issue_flags)
                                goto out;
                        connect->seen_econnaborted = true;
                }
-               if (req_has_async_data(req))
-                       return -EAGAIN;
-               if (io_alloc_async_data(req)) {
-                       ret = -ENOMEM;
-                       goto out;
-               }
-               memcpy(req->async_data, &__io, sizeof(__io));
                return -EAGAIN;
        }
        if (connect->in_progress) {
@@ -1505,6 +1485,7 @@ int io_connect(struct io_kiocb *req, unsigned int issue_flags)
 out:
        if (ret < 0)
                req_set_fail(req);
+       io_req_msg_cleanup(req, issue_flags);
        io_req_set_res(req, ret, 0);
        return IOU_OK;
 }
index 0aef1c992aeedaa1f56c32fff9fe3901152e4677..b47b43ec645974b39d55131f1b2c6837bb1101db 100644 (file)
@@ -28,10 +28,6 @@ struct io_async_msghdr {
 
 #if defined(CONFIG_NET)
 
-struct io_async_connect {
-       struct sockaddr_storage         address;
-};
-
 int io_shutdown_prep(struct io_kiocb *req, const struct io_uring_sqe *sqe);
 int io_shutdown(struct io_kiocb *req, unsigned int issue_flags);
 
@@ -53,7 +49,6 @@ int io_accept(struct io_kiocb *req, unsigned int issue_flags);
 int io_socket_prep(struct io_kiocb *req, const struct io_uring_sqe *sqe);
 int io_socket(struct io_kiocb *req, unsigned int issue_flags);
 
-int io_connect_prep_async(struct io_kiocb *req);
 int io_connect_prep(struct io_kiocb *req, const struct io_uring_sqe *sqe);
 int io_connect(struct io_kiocb *req, unsigned int issue_flags);
 
index fcae75a08f2c6c34baa4e6953392f7043ef42847..1951107210d495e5e13672590d77caee27b637bf 100644 (file)
@@ -557,8 +557,7 @@ const struct io_cold_def io_cold_defs[] = {
        [IORING_OP_CONNECT] = {
                .name                   = "CONNECT",
 #if defined(CONFIG_NET)
-               .async_size             = sizeof(struct io_async_connect),
-               .prep_async             = io_connect_prep_async,
+               .async_size             = sizeof(struct io_async_msghdr),
 #endif
        },
        [IORING_OP_FALLOCATE] = {