Skip to content

Commit ad438d0

Browse files
isilenceaxboe
authored andcommitted
io_uring/net: don't store send address ptr
For non "msg" requests we copy the address at the prep stage and there is no need to store the address user pointer long term. Pass the SQE into io_send_setup(), let it parse it, and remove struct io_sr_msg addr addr_len fields. It saves some space and also less confusing. Signed-off-by: Pavel Begunkov <[email protected]> Link: https://lore.kernel.org/r/db3dce544e17ca9d4b17d2506fbbac1da8a87824.1729607201.git.asml.silence@gmail.com Signed-off-by: Jens Axboe <[email protected]>
1 parent 93db98f commit ad438d0

File tree

1 file changed

+16
-20
lines changed

1 file changed

+16
-20
lines changed

io_uring/net.c

Lines changed: 16 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -74,10 +74,8 @@ struct io_sr_msg {
7474
unsigned nr_multishot_loops;
7575
u16 flags;
7676
/* initialised and used only by !msg send variants */
77-
u16 addr_len;
7877
u16 buf_group;
7978
u16 buf_index;
80-
void __user *addr;
8179
void __user *msg_control;
8280
/* used only for send zerocopy */
8381
struct io_kiocb *notif;
@@ -357,24 +355,31 @@ void io_sendmsg_recvmsg_cleanup(struct io_kiocb *req)
357355
io_netmsg_iovec_free(io);
358356
}
359357

360-
static int io_send_setup(struct io_kiocb *req)
358+
static int io_send_setup(struct io_kiocb *req, const struct io_uring_sqe *sqe)
361359
{
362360
struct io_sr_msg *sr = io_kiocb_to_cmd(req, struct io_sr_msg);
363361
struct io_async_msghdr *kmsg = req->async_data;
362+
void __user *addr;
363+
u16 addr_len;
364364
int ret;
365365

366+
if (READ_ONCE(sqe->__pad3[0]))
367+
return -EINVAL;
368+
366369
kmsg->msg.msg_name = NULL;
367370
kmsg->msg.msg_namelen = 0;
368371
kmsg->msg.msg_control = NULL;
369372
kmsg->msg.msg_controllen = 0;
370373
kmsg->msg.msg_ubuf = NULL;
371374

372-
if (sr->addr) {
373-
ret = move_addr_to_kernel(sr->addr, sr->addr_len, &kmsg->addr);
375+
addr = u64_to_user_ptr(READ_ONCE(sqe->addr2));
376+
addr_len = READ_ONCE(sqe->addr_len);
377+
if (addr) {
378+
ret = move_addr_to_kernel(addr, addr_len, &kmsg->addr);
374379
if (unlikely(ret < 0))
375380
return ret;
376381
kmsg->msg.msg_name = &kmsg->addr;
377-
kmsg->msg.msg_namelen = sr->addr_len;
382+
kmsg->msg.msg_namelen = addr_len;
378383
}
379384
if (!io_do_buffer_select(req)) {
380385
ret = import_ubuf(ITER_SOURCE, sr->buf, sr->len,
@@ -404,13 +409,9 @@ int io_sendmsg_prep(struct io_kiocb *req, const struct io_uring_sqe *sqe)
404409

405410
sr->done_io = 0;
406411

407-
if (req->opcode == IORING_OP_SEND) {
408-
if (READ_ONCE(sqe->__pad3[0]))
412+
if (req->opcode != IORING_OP_SEND) {
413+
if (sqe->addr2 || sqe->file_index)
409414
return -EINVAL;
410-
sr->addr = u64_to_user_ptr(READ_ONCE(sqe->addr2));
411-
sr->addr_len = READ_ONCE(sqe->addr_len);
412-
} else if (sqe->addr2 || sqe->file_index) {
413-
return -EINVAL;
414415
}
415416

416417
sr->umsg = u64_to_user_ptr(READ_ONCE(sqe->addr));
@@ -438,7 +439,7 @@ int io_sendmsg_prep(struct io_kiocb *req, const struct io_uring_sqe *sqe)
438439
if (unlikely(!io_msg_alloc_async(req)))
439440
return -ENOMEM;
440441
if (req->opcode != IORING_OP_SENDMSG)
441-
return io_send_setup(req);
442+
return io_send_setup(req, sqe);
442443
return io_sendmsg_setup(req);
443444
}
444445

@@ -1254,12 +1255,7 @@ int io_send_zc_prep(struct io_kiocb *req, const struct io_uring_sqe *sqe)
12541255
}
12551256
}
12561257

1257-
if (req->opcode == IORING_OP_SEND_ZC) {
1258-
if (READ_ONCE(sqe->__pad3[0]))
1259-
return -EINVAL;
1260-
zc->addr = u64_to_user_ptr(READ_ONCE(sqe->addr2));
1261-
zc->addr_len = READ_ONCE(sqe->addr_len);
1262-
} else {
1258+
if (req->opcode != IORING_OP_SEND_ZC) {
12631259
if (unlikely(sqe->addr2 || sqe->file_index))
12641260
return -EINVAL;
12651261
if (unlikely(zc->flags & IORING_RECVSEND_FIXED_BUF))
@@ -1280,7 +1276,7 @@ int io_send_zc_prep(struct io_kiocb *req, const struct io_uring_sqe *sqe)
12801276
if (unlikely(!io_msg_alloc_async(req)))
12811277
return -ENOMEM;
12821278
if (req->opcode != IORING_OP_SENDMSG_ZC)
1283-
return io_send_setup(req);
1279+
return io_send_setup(req, sqe);
12841280
return io_sendmsg_setup(req);
12851281
}
12861282

0 commit comments

Comments
 (0)