diff options
author | Caleb Sander Mateos <csander@purestorage.com> | 2025-02-12 23:45:46 +0300 |
---|---|---|
committer | Jens Axboe <axboe@kernel.dk> | 2025-02-12 23:58:43 +0300 |
commit | e663da62ba8672aaa66843f1af8b20e3bb1a0515 (patch) | |
tree | 83348c059ec2d59b27ae3f7264a75c3a964419b7 /tools/perf/scripts/python/export-to-sqlite.py | |
parent | 34cae91215c6f65bed2a124fb9283da6ec0b8dd9 (diff) | |
download | linux-e663da62ba8672aaa66843f1af8b20e3bb1a0515.tar.xz |
io_uring/uring_cmd: switch sqe to async_data on EAGAIN
5eff57fa9f3a ("io_uring/uring_cmd: defer SQE copying until it's needed")
moved the unconditional memcpy() of the uring_cmd SQE to async_data
to 2 cases when the request goes async:
- If REQ_F_FORCE_ASYNC is set to force the initial issue to go async
- If ->uring_cmd() returns -EAGAIN in the initial non-blocking issue
Unlike the REQ_F_FORCE_ASYNC case, in the EAGAIN case, io_uring_cmd()
copies the SQE to async_data but neglects to update the io_uring_cmd's
sqe field to point to async_data. As a result, sqe still points to the
slot in the userspace-mapped SQ. At the end of io_submit_sqes(), the
kernel advances the SQ head index, allowing userspace to reuse the slot
for a new SQE. If userspace reuses the slot before the io_uring worker
reissues the original SQE, the io_uring_cmd's SQE will be corrupted.
Introduce a helper io_uring_cmd_cache_sqes() to copy the original SQE to
the io_uring_cmd's async_data and point sqe there. Use it for both the
REQ_F_FORCE_ASYNC and EAGAIN cases. This ensures the uring_cmd doesn't
read from the SQ slot after it has been returned to userspace.
Signed-off-by: Caleb Sander Mateos <csander@purestorage.com>
Fixes: 5eff57fa9f3a ("io_uring/uring_cmd: defer SQE copying until it's needed")
Link: https://lore.kernel.org/r/20250212204546.3751645-3-csander@purestorage.com
Signed-off-by: Jens Axboe <axboe@kernel.dk>
Diffstat (limited to 'tools/perf/scripts/python/export-to-sqlite.py')
0 files changed, 0 insertions, 0 deletions