Re: [PATCH] io_uring/uring_cmd: skip io_uring_cmd_issue_blocking() task work
From: Caleb Sander Mateos
Date: Thu Jul 30 2026 - 14:12:12 EST
Hi Jens,
I think you had mentioned planning to queue this patch up for 7.3:
https://lore.kernel.org/io-uring/ce98e216-98bf-42cf-b1a0-89a2ea62f897@xxxxxxxxx/
I didn't see it in for-7.3/io_uring, so just checking if that's still your plan.
Thanks,
Caleb
On Thu, Jul 2, 2026 at 11:48 AM Caleb Sander Mateos
<csander@xxxxxxxxxxxxxxx> wrote:
>
> io_uring_cmd_issue_blocking() is only called from blk_cmd_complete(),
> which is already a task work callback. However, it queues another task
> work item, to call io_queue_iowq(). Just call io_queue_iowq() directly
> to skip the CPU cost and latency of the redundant task work proxying.
>
> Signed-off-by: Caleb Sander Mateos <csander@xxxxxxxxxxxxxxx>
> ---
> io_uring/io_uring.c | 13 +------------
> io_uring/io_uring.h | 2 +-
> io_uring/uring_cmd.c | 2 +-
> 3 files changed, 3 insertions(+), 14 deletions(-)
>
> diff --git a/io_uring/io_uring.c b/io_uring/io_uring.c
> index 1279e27c2c6d..4c83a94b4bdc 100644
> --- a/io_uring/io_uring.c
> +++ b/io_uring/io_uring.c
> @@ -405,11 +405,11 @@ static void io_prep_async_link(struct io_kiocb *req)
> io_for_each_link(cur, req)
> io_prep_async_work(cur);
> }
> }
>
> -static void io_queue_iowq(struct io_kiocb *req)
> +void io_queue_iowq(struct io_kiocb *req)
> {
> struct io_uring_task *tctx = req->tctx;
>
> BUG_ON(!tctx);
>
> @@ -433,21 +433,10 @@ static void io_queue_iowq(struct io_kiocb *req)
>
> trace_io_uring_queue_async_work(req, io_wq_is_hashed(&req->work));
> io_wq_enqueue(tctx->io_wq, &req->work);
> }
>
> -static void io_req_queue_iowq_tw(struct io_tw_req tw_req, io_tw_token_t tw)
> -{
> - io_queue_iowq(tw_req.req);
> -}
> -
> -void io_req_queue_iowq(struct io_kiocb *req)
> -{
> - req->io_task_work.func = io_req_queue_iowq_tw;
> - io_req_task_work_add(req);
> -}
> -
> unsigned io_linked_nr(struct io_kiocb *req)
> {
> struct io_kiocb *tmp;
> unsigned nr = 0;
>
> diff --git a/io_uring/io_uring.h b/io_uring/io_uring.h
> index cb736b815422..dfe26a9c21bf 100644
> --- a/io_uring/io_uring.h
> +++ b/io_uring/io_uring.h
> @@ -193,11 +193,11 @@ void io_req_task_queue_fail(struct io_kiocb *req, int ret);
> void io_req_task_submit(struct io_tw_req tw_req, io_tw_token_t tw);
> __cold void io_uring_drop_tctx_refs(struct task_struct *task);
>
> int io_ring_add_registered_file(struct io_uring_task *tctx, struct file *file,
> int start, int end);
> -void io_req_queue_iowq(struct io_kiocb *req);
> +void io_queue_iowq(struct io_kiocb *req);
>
> int io_poll_issue(struct io_kiocb *req, io_tw_token_t tw);
> int io_submit_sqes(struct io_ring_ctx *ctx, unsigned int nr);
> int io_do_iopoll(struct io_ring_ctx *ctx, bool force_nonspin);
> __cold void io_iopoll_try_reap_events(struct io_ring_ctx *ctx);
> diff --git a/io_uring/uring_cmd.c b/io_uring/uring_cmd.c
> index 7b25dcd9d05f..5525267d2e03 100644
> --- a/io_uring/uring_cmd.c
> +++ b/io_uring/uring_cmd.c
> @@ -324,11 +324,11 @@ EXPORT_SYMBOL_GPL(io_uring_cmd_import_fixed_vec);
>
> void io_uring_cmd_issue_blocking(struct io_uring_cmd *ioucmd)
> {
> struct io_kiocb *req = cmd_to_io_kiocb(ioucmd);
>
> - io_req_queue_iowq(req);
> + io_queue_iowq(req);
> }
>
> int io_cmd_poll_multishot(struct io_uring_cmd *cmd,
> unsigned int issue_flags, __poll_t mask)
> {
> --
> 2.54.0
>