From: Pavel Begunkov <asml.silence@gmail.com>
To: Jens Axboe <axboe@kernel.dk>, io-uring@vger.kernel.org
Subject: Re: [PATCH 3/4] io_uring/net: move send zc fixed buffer import to issue path
Date: Wed, 23 Oct 2024 03:51:41 +0100 [thread overview]
Message-ID: <834c14c5-4e8b-49c9-a523-825305495c6d@gmail.com> (raw)
In-Reply-To: <20241022133441.855081-4-axboe@kernel.dk>
On 10/22/24 14:32, Jens Axboe wrote:
> Let's keep it close with the actual import, there's no reason to do this
> on the prep side. With that, we can drop one of the branches checking
> for whether or not IORING_RECVSEND_FIXED_BUF is set.
>
> As a side-effect, get rid of req->imu usage.
>
> Signed-off-by: Jens Axboe <axboe@kernel.dk>
> ---
> io_uring/net.c | 29 ++++++++++++++++-------------
> 1 file changed, 16 insertions(+), 13 deletions(-)
>
> diff --git a/io_uring/net.c b/io_uring/net.c
> index 18507658a921..a5b875a40bbf 100644
> --- a/io_uring/net.c
> +++ b/io_uring/net.c
> @@ -76,6 +76,7 @@ struct io_sr_msg {
> /* initialised and used only by !msg send variants */
> u16 addr_len;
> u16 buf_group;
> + u16 buf_index;
There is req->buf_index we can use
> void __user *addr;
> void __user *msg_control;
> /* used only for send zerocopy */
> @@ -1254,16 +1255,6 @@ int io_send_zc_prep(struct io_kiocb *req, const struct io_uring_sqe *sqe)
> }
> }
>
> - if (zc->flags & IORING_RECVSEND_FIXED_BUF) {
> - unsigned idx = READ_ONCE(sqe->buf_index);
> -
> - if (unlikely(idx >= ctx->nr_user_bufs))
> - return -EFAULT;
> - idx = array_index_nospec(idx, ctx->nr_user_bufs);
> - req->imu = READ_ONCE(ctx->user_bufs[idx]);
> - io_req_set_rsrc_node(notif, ctx, 0);
> - }
> -
> if (req->opcode == IORING_OP_SEND_ZC) {
> if (READ_ONCE(sqe->__pad3[0]))
> return -EINVAL;
> @@ -1279,6 +1270,7 @@ int io_send_zc_prep(struct io_kiocb *req, const struct io_uring_sqe *sqe)
> zc->buf = u64_to_user_ptr(READ_ONCE(sqe->addr));
> zc->len = READ_ONCE(sqe->len);
> zc->msg_flags = READ_ONCE(sqe->msg_flags) | MSG_NOSIGNAL | MSG_ZEROCOPY;
> + zc->buf_index = READ_ONCE(sqe->buf_index);
> if (zc->msg_flags & MSG_DONTWAIT)
> req->flags |= REQ_F_NOWAIT;
>
> @@ -1339,13 +1331,24 @@ static int io_sg_from_iter(struct sk_buff *skb,
> return ret;
> }
>
> -static int io_send_zc_import(struct io_kiocb *req, struct io_async_msghdr *kmsg)
> +static int io_send_zc_import(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 *kmsg = req->async_data;
> int ret;
>
> if (sr->flags & IORING_RECVSEND_FIXED_BUF) {
> - ret = io_import_fixed(ITER_SOURCE, &kmsg->msg.msg_iter, req->imu,
> + struct io_ring_ctx *ctx = req->ctx;
> + struct io_mapped_ubuf *imu;
> + int idx;
> +
> + if (unlikely(sr->buf_index >= ctx->nr_user_bufs))
> + return -EFAULT;
> + idx = array_index_nospec(sr->buf_index, ctx->nr_user_bufs);
> + imu = READ_ONCE(ctx->user_bufs[idx]);
> + io_req_set_rsrc_node(sr->notif, ctx, issue_flags);
This entire section should be under uring_lock. First, we're looking
at a imu that can be freed at any moment because io_req_set_rsrc_node()
is done after. And even if change the order nothing guarantees that the
CPU sees the imu content right.
FWIW, seems nobody was passing non-zero flags to io_req_set_rsrc_node()
before this series, we should just kill the parameter.
> +
> + ret = io_import_fixed(ITER_SOURCE, &kmsg->msg.msg_iter, imu,
> (u64)(uintptr_t)sr->buf, sr->len);
> if (unlikely(ret))
> return ret;
> @@ -1382,7 +1385,7 @@ int io_send_zc(struct io_kiocb *req, unsigned int issue_flags)
> return -EAGAIN;
>
> if (!zc->done_io) {
> - ret = io_send_zc_import(req, kmsg);
> + ret = io_send_zc_import(req, issue_flags);
> if (unlikely(ret))
> return ret;
> }
--
Pavel Begunkov
next prev parent reply other threads:[~2024-10-23 2:51 UTC|newest]
Thread overview: 9+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-10-22 13:32 [PATCHSET v3 for-next 0/4] Get rid of io_kiocb->imu Jens Axboe
2024-10-22 13:32 ` [PATCH 1/4] io_uring/uring_cmd: get rid of using req->imu Jens Axboe
2024-10-22 13:32 ` [PATCH 2/4] io_uring/rw: " Jens Axboe
2024-10-22 13:32 ` [PATCH 3/4] io_uring/net: move send zc fixed buffer import to issue path Jens Axboe
2024-10-23 2:51 ` Pavel Begunkov [this message]
2024-10-23 2:57 ` Jens Axboe
2024-10-22 13:32 ` [PATCH 4/4] io_uring: kill 'imu' from struct io_kiocb Jens Axboe
-- strict thread matches above, loose matches on Subject: below --
2024-10-22 2:03 [PATCHSET v2 for-next 0/4] Get rid of io_kiocb->imu Jens Axboe
2024-10-22 2:03 ` [PATCH 3/4] io_uring/net: move send zc fixed buffer import to issue path Jens Axboe
2024-10-18 18:38 [PATCHSET for-next 0/4] Get rid of io_kiocb->imu Jens Axboe
2024-10-18 18:38 ` [PATCH 3/4] io_uring/net: move send zc fixed buffer import to issue path Jens Axboe
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=834c14c5-4e8b-49c9-a523-825305495c6d@gmail.com \
--to=asml.silence@gmail.com \
--cc=axboe@kernel.dk \
--cc=io-uring@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox