From: Jens Axboe <axboe@kernel.dk>
To: Pavel Begunkov <asml.silence@gmail.com>, io-uring@vger.kernel.org
Subject: Re: [PATCH 3/4] io_uring/net: move send zc fixed buffer import to issue path
Date: Tue, 22 Oct 2024 20:57:25 -0600 [thread overview]
Message-ID: <875e522f-b55e-4c83-ae90-7a203b96596e@kernel.dk> (raw)
In-Reply-To: <834c14c5-4e8b-49c9-a523-825305495c6d@gmail.com>
On 10/22/24 8:51 PM, Pavel Begunkov wrote:
> 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
But that gets repurposed as the group ID for provided buffers, which is
why I wanted to add a separate field for that.
>> 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.
True, I'll lock around it instead.
> FWIW, seems nobody was passing non-zero flags to io_req_set_rsrc_node()
> before this series, we should just kill the parameter.
I did briefly look at that last week, but this got in the way. I'll take
another look.
--
Jens Axboe
next prev parent reply other threads:[~2024-10-23 2:57 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
2024-10-23 2:57 ` Jens Axboe [this message]
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=875e522f-b55e-4c83-ae90-7a203b96596e@kernel.dk \
--to=axboe@kernel.dk \
--cc=asml.silence@gmail.com \
--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