Skip to content

Commit e2ea5a7

Browse files
committed
io_uring/net: move connect to always using async data
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>
1 parent d6f911a commit e2ea5a7

File tree

3 files changed

+12
-37
lines changed

3 files changed

+12
-37
lines changed

io_uring/net.c

Lines changed: 11 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -1428,50 +1428,37 @@ int io_socket(struct io_kiocb *req, unsigned int issue_flags)
14281428
return IOU_OK;
14291429
}
14301430

1431-
int io_connect_prep_async(struct io_kiocb *req)
1432-
{
1433-
struct io_async_connect *io = req->async_data;
1434-
struct io_connect *conn = io_kiocb_to_cmd(req, struct io_connect);
1435-
1436-
return move_addr_to_kernel(conn->addr, conn->addr_len, &io->address);
1437-
}
1438-
14391431
int io_connect_prep(struct io_kiocb *req, const struct io_uring_sqe *sqe)
14401432
{
14411433
struct io_connect *conn = io_kiocb_to_cmd(req, struct io_connect);
1434+
struct io_async_msghdr *io;
14421435

14431436
if (sqe->len || sqe->buf_index || sqe->rw_flags || sqe->splice_fd_in)
14441437
return -EINVAL;
14451438

14461439
conn->addr = u64_to_user_ptr(READ_ONCE(sqe->addr));
14471440
conn->addr_len = READ_ONCE(sqe->addr2);
14481441
conn->in_progress = conn->seen_econnaborted = false;
1449-
return 0;
1442+
1443+
io = io_msg_alloc_async(req);
1444+
if (unlikely(!io))
1445+
return -ENOMEM;
1446+
1447+
return move_addr_to_kernel(conn->addr, conn->addr_len, &io->addr);
14501448
}
14511449

14521450
int io_connect(struct io_kiocb *req, unsigned int issue_flags)
14531451
{
14541452
struct io_connect *connect = io_kiocb_to_cmd(req, struct io_connect);
1455-
struct io_async_connect __io, *io;
1453+
struct io_async_msghdr *io = req->async_data;
14561454
unsigned file_flags;
14571455
int ret;
14581456
bool force_nonblock = issue_flags & IO_URING_F_NONBLOCK;
14591457

1460-
if (req_has_async_data(req)) {
1461-
io = req->async_data;
1462-
} else {
1463-
ret = move_addr_to_kernel(connect->addr,
1464-
connect->addr_len,
1465-
&__io.address);
1466-
if (ret)
1467-
goto out;
1468-
io = &__io;
1469-
}
1470-
14711458
file_flags = force_nonblock ? O_NONBLOCK : 0;
14721459

1473-
ret = __sys_connect_file(req->file, &io->address,
1474-
connect->addr_len, file_flags);
1460+
ret = __sys_connect_file(req->file, &io->addr, connect->addr_len,
1461+
file_flags);
14751462
if ((ret == -EAGAIN || ret == -EINPROGRESS || ret == -ECONNABORTED)
14761463
&& force_nonblock) {
14771464
if (ret == -EINPROGRESS) {
@@ -1481,13 +1468,6 @@ int io_connect(struct io_kiocb *req, unsigned int issue_flags)
14811468
goto out;
14821469
connect->seen_econnaborted = true;
14831470
}
1484-
if (req_has_async_data(req))
1485-
return -EAGAIN;
1486-
if (io_alloc_async_data(req)) {
1487-
ret = -ENOMEM;
1488-
goto out;
1489-
}
1490-
memcpy(req->async_data, &__io, sizeof(__io));
14911471
return -EAGAIN;
14921472
}
14931473
if (connect->in_progress) {
@@ -1505,6 +1485,7 @@ int io_connect(struct io_kiocb *req, unsigned int issue_flags)
15051485
out:
15061486
if (ret < 0)
15071487
req_set_fail(req);
1488+
io_req_msg_cleanup(req, issue_flags);
15081489
io_req_set_res(req, ret, 0);
15091490
return IOU_OK;
15101491
}

io_uring/net.h

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -28,10 +28,6 @@ struct io_async_msghdr {
2828

2929
#if defined(CONFIG_NET)
3030

31-
struct io_async_connect {
32-
struct sockaddr_storage address;
33-
};
34-
3531
int io_shutdown_prep(struct io_kiocb *req, const struct io_uring_sqe *sqe);
3632
int io_shutdown(struct io_kiocb *req, unsigned int issue_flags);
3733

@@ -53,7 +49,6 @@ int io_accept(struct io_kiocb *req, unsigned int issue_flags);
5349
int io_socket_prep(struct io_kiocb *req, const struct io_uring_sqe *sqe);
5450
int io_socket(struct io_kiocb *req, unsigned int issue_flags);
5551

56-
int io_connect_prep_async(struct io_kiocb *req);
5752
int io_connect_prep(struct io_kiocb *req, const struct io_uring_sqe *sqe);
5853
int io_connect(struct io_kiocb *req, unsigned int issue_flags);
5954

io_uring/opdef.c

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -557,8 +557,7 @@ const struct io_cold_def io_cold_defs[] = {
557557
[IORING_OP_CONNECT] = {
558558
.name = "CONNECT",
559559
#if defined(CONFIG_NET)
560-
.async_size = sizeof(struct io_async_connect),
561-
.prep_async = io_connect_prep_async,
560+
.async_size = sizeof(struct io_async_msghdr),
562561
#endif
563562
},
564563
[IORING_OP_FALLOCATE] = {

0 commit comments

Comments
 (0)