From: lizetao <[email protected]>
To: Jens Axboe <[email protected]>
Cc: io-uring <[email protected]>
Subject: RE: [PATCH v2] io_uring/uring_cmd: unconditionally copy SQEs at prep time
Date: Thu, 13 Feb 2025 16:52:18 +0000 [thread overview]
Message-ID: <[email protected]> (raw)
In-Reply-To: <[email protected]>
Hi,
> -----Original Message-----
> From: Jens Axboe <[email protected]>
> Sent: Friday, February 14, 2025 12:31 AM
> To: io-uring <[email protected]>
> Cc: Caleb Sander Mateos <[email protected]>
> Subject: [PATCH v2] io_uring/uring_cmd: unconditionally copy SQEs at prep
> time
>
> This isn't generally necessary, but conditions have been observed where SQE
> data is accessed from the original SQE after prep has been done and outside of
> the initial issue. Opcode prep handlers must ensure that any SQE related data is
> stable beyond the prep phase, but uring_cmd is a bit special in how it handles
> the SQE which makes it susceptible to reading stale data. If the application has
> reused the SQE before the original completes, then that can lead to data
> corruption.
>
> Down the line we can relax this again once uring_cmd has been sanitized a bit,
> and avoid unnecessarily copying the SQE.
>
> Reported-by: Caleb Sander Mateos <[email protected]>
> Reviewed-by: Caleb Sander Mateos <[email protected]>
> Signed-off-by: Jens Axboe <[email protected]>
>
> ---
>
> V2:
> - Pass in SQE for copy, and drop helper for copy
>
> diff --git a/io_uring/uring_cmd.c b/io_uring/uring_cmd.c index
> 8af7780407b7..e6701b7aa147 100644
> --- a/io_uring/uring_cmd.c
> +++ b/io_uring/uring_cmd.c
> @@ -165,15 +165,6 @@ void io_uring_cmd_done(struct io_uring_cmd
> *ioucmd, ssize_t ret, u64 res2, } EXPORT_SYMBOL_GPL(io_uring_cmd_done);
>
> -static void io_uring_cmd_cache_sqes(struct io_kiocb *req) -{
> - struct io_uring_cmd *ioucmd = io_kiocb_to_cmd(req, struct
> io_uring_cmd);
> - struct io_uring_cmd_data *cache = req->async_data;
> -
> - memcpy(cache->sqes, ioucmd->sqe, uring_sqe_size(req->ctx));
> - ioucmd->sqe = cache->sqes;
> -}
> -
> static int io_uring_cmd_prep_setup(struct io_kiocb *req,
> const struct io_uring_sqe *sqe)
> {
> @@ -185,10 +176,15 @@ static int io_uring_cmd_prep_setup(struct io_kiocb
> *req,
> return -ENOMEM;
> cache->op_data = NULL;
>
> - ioucmd->sqe = sqe;
> - /* defer memcpy until we need it */
> - if (unlikely(req->flags & REQ_F_FORCE_ASYNC))
> - io_uring_cmd_cache_sqes(req);
> + /*
> + * Unconditionally cache the SQE for now - this is only needed for
> + * requests that go async, but prep handlers must ensure that any
> + * sqe data is stable beyond prep. Since uring_cmd is special in
> + * that it doesn't read in per-op data, play it safe and ensure that
> + * any SQE data is stable beyond prep. This can later get relaxed.
> + */
> + memcpy(cache->sqes, sqe, uring_sqe_size(req->ctx));
> + ioucmd->sqe = cache->sqes;
> return 0;
> }
>
> @@ -251,16 +247,8 @@ int io_uring_cmd(struct io_kiocb *req, unsigned int
> issue_flags)
> }
>
> ret = file->f_op->uring_cmd(ioucmd, issue_flags);
> - if (ret == -EAGAIN) {
> - struct io_uring_cmd_data *cache = req->async_data;
> -
> - if (ioucmd->sqe != cache->sqes)
> - io_uring_cmd_cache_sqes(req);
> - return -EAGAIN;
> - } else if (ret == -EIOCBQUEUED) {
> - return -EIOCBQUEUED;
> - }
> -
> + if (ret == -EAGAIN || ret == -EIOCBQUEUED)
> + return ret;
> if (ret < 0)
> req_set_fail(req);
> io_req_uring_cleanup(req, issue_flags);
>
> --
> Jens Axboe
>
>
Reviewed-by: Li Zetao <[email protected]>
---
Li Zetao
prev parent reply other threads:[~2025-02-13 16:52 UTC|newest]
Thread overview: 4+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-02-13 16:30 [PATCH v2] io_uring/uring_cmd: unconditionally copy SQEs at prep time Jens Axboe
2025-02-13 16:39 ` Caleb Sander Mateos
2025-02-13 17:25 ` Jens Axboe
2025-02-13 16:52 ` lizetao [this message]
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 \
[email protected] \
[email protected] \
[email protected] \
[email protected] \
/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