diff options
author | Pavel Begunkov <asml.silence@gmail.com> | 2022-09-08 13:20:30 +0100 |
---|---|---|
committer | Jens Axboe <axboe@kernel.dk> | 2022-09-21 10:30:43 -0600 |
commit | 858c293e5d3b7fd3037883fcc0379594517c926c (patch) | |
tree | 830fc493a217362f0ce578591c50c1c3fdf9e7a7 /io_uring | |
parent | 95eafc74be5e11f9dd6a11504c27321c515ce00f (diff) | |
download | linux-858c293e5d3b7fd3037883fcc0379594517c926c.tar.gz linux-858c293e5d3b7fd3037883fcc0379594517c926c.tar.bz2 linux-858c293e5d3b7fd3037883fcc0379594517c926c.zip |
io_uring/net: use async caches for async prep
send/recv have async_data caches but there are only used from within
issue handlers. Extend their use also to ->prep_async, should be handy
with links and IOSQE_ASYNC.
Signed-off-by: Pavel Begunkov <asml.silence@gmail.com>
Link: https://lore.kernel.org/r/b9a2264b807582a97ed606c5bfcdc2399384e8a5.1662639236.git.asml.silence@gmail.com
Signed-off-by: Jens Axboe <axboe@kernel.dk>
Diffstat (limited to 'io_uring')
-rw-r--r-- | io_uring/net.c | 16 | ||||
-rw-r--r-- | io_uring/opdef.c | 2 |
2 files changed, 15 insertions, 3 deletions
diff --git a/io_uring/net.c b/io_uring/net.c index d5b80b66feab..12412acc6c5e 100644 --- a/io_uring/net.c +++ b/io_uring/net.c @@ -126,8 +126,8 @@ static void io_netmsg_recycle(struct io_kiocb *req, unsigned int issue_flags) } } -static struct io_async_msghdr *io_recvmsg_alloc_async(struct io_kiocb *req, - unsigned int issue_flags) +static struct io_async_msghdr *io_msg_alloc_async(struct io_kiocb *req, + unsigned int issue_flags) { struct io_ring_ctx *ctx = req->ctx; struct io_cache_entry *entry; @@ -148,6 +148,12 @@ static struct io_async_msghdr *io_recvmsg_alloc_async(struct io_kiocb *req, return NULL; } +static inline struct io_async_msghdr *io_msg_alloc_async_prep(struct io_kiocb *req) +{ + /* ->prep_async is always called from the submission context */ + return io_msg_alloc_async(req, 0); +} + static int io_setup_async_msg(struct io_kiocb *req, struct io_async_msghdr *kmsg, unsigned int issue_flags) @@ -156,7 +162,7 @@ static int io_setup_async_msg(struct io_kiocb *req, if (req_has_async_data(req)) return -EAGAIN; - async_msg = io_recvmsg_alloc_async(req, issue_flags); + async_msg = io_msg_alloc_async(req, issue_flags); if (!async_msg) { kfree(kmsg->free_iov); return -ENOMEM; @@ -217,6 +223,8 @@ int io_sendmsg_prep_async(struct io_kiocb *req) { int ret; + if (!io_msg_alloc_async_prep(req)) + return -ENOMEM; ret = io_sendmsg_copy_hdr(req, req->async_data); if (!ret) req->flags |= REQ_F_NEED_CLEANUP; @@ -504,6 +512,8 @@ int io_recvmsg_prep_async(struct io_kiocb *req) { int ret; + if (!io_msg_alloc_async_prep(req)) + return -ENOMEM; ret = io_recvmsg_copy_hdr(req, req->async_data); if (!ret) req->flags |= REQ_F_NEED_CLEANUP; diff --git a/io_uring/opdef.c b/io_uring/opdef.c index 008320c5e958..c99db6f71244 100644 --- a/io_uring/opdef.c +++ b/io_uring/opdef.c @@ -146,6 +146,7 @@ const struct io_op_def io_op_defs[] = { .unbound_nonreg_file = 1, .pollout = 1, .ioprio = 1, + .manual_alloc = 1, .name = "SENDMSG", #if defined(CONFIG_NET) .async_size = sizeof(struct io_async_msghdr), @@ -163,6 +164,7 @@ const struct io_op_def io_op_defs[] = { .pollin = 1, .buffer_select = 1, .ioprio = 1, + .manual_alloc = 1, .name = "RECVMSG", #if defined(CONFIG_NET) .async_size = sizeof(struct io_async_msghdr), |