FAILED: patch "[PATCH] io_uring/poll: correctly handle io_poll_add() return value on" failed to apply to 6.12-stable tree
Subsystems (2)
[email protected]
maintainerThe patch below does not apply to the 6.12-stable tree.
If someone wants it applied there, or to any other stable or longterm tree, then please email the backport, including the original git commit id to <[email protected]>.
To reproduce the conflict and resubmit, you may use the following commands:
git fetch https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/ linux-6.12.y
git checkout FETCH_HEAD
git cherry-pick -x 84230ad2d2afbf0c44c32967e525c0ad92e26b4e
# <resolve conflicts, build, test, etc.>
git commit -s
git send-email --to '<[email protected]>' --in-reply-to '2025122911-bonding-sampling-8ca0@gregkh' --subject-prefix 'PATCH 6.12.y' HEAD^..
Possible dependencies:
thanks,
greg k-h
------------------ original commit in Linus's tree ------------------
From 84230ad2d2afbf0c44c32967e525c0ad92e26b4e Mon Sep 17 00:00:00 2001
From: Jens Axboe <[email protected]>
Date: Mon, 1 Dec 2025 13:25:22 -0700
Subject: [PATCH] io_uring/poll: correctly handle io_poll_add() return value on
update
When the core of io_uring was updated to handle completions consistently and with fixed return codes, the POLL_REMOVE opcode with updates got slightly broken. If a POLL_ADD is pending and then POLL_REMOVE is used to update the events of that request, if that update causes the POLL_ADD to now trigger, then that completion is lost and a CQE is never posted.
Additionally, ensure that if an update does cause an existing POLL_ADD to complete, that the completion value isn't always overwritten with -ECANCELED. For that case, whatever io_poll_add() set the value to should just be retained.
io_uring/poll.c +7 -2
@@ -937,12 +937,17 @@ int io_poll_remove(struct io_kiocb *req, unsigned int issue_flags) ret2 =io_poll_add (preq, issue_flags & ~IO_URING_F_UNLOCKED );/* successfully updated, don't complete poll request */ -if (!ret2 || ret2 == -EIOCBQUEUED ) +if (ret2 ==IOU_ISSUE_SKIP_COMPLETE ) goto out; +/* request completed as part of the update, complete it */ +else if (ret2 ==IOU_COMPLETE ) + goto complete; } -req_set_fail (preq);io_req_set_res (preq, -ECANCELED ,0 ); +complete: +if (preq->cqe.res <0 ) +req_set_fail (preq); preq->io_task_work.func = io_req_task_complete;io_req_task_work_add (preq); out:
Quoted 5 lines · On 12/29/25 5:22 AM, [email protected] wrote:
The patch below does not apply to the 6.12-stable tree.
If someone wants it applied there, or to any other stable or longterm tree, then please email the backport, including the original git commit id to <[email protected]>.
Here's one for 6.12-stable.
Signature · 1 line
Jens Axboe
From a40f5a12d62f20ce2f9c3687b880218c09e0cd74 Mon Sep 17 00:00:00 2001
From: Jens Axboe <[email protected]>
Date: Mon, 1 Dec 2025 13:25:22 -0700
Subject: [PATCH] io_uring/poll: correctly handle io_poll_add() return value on
update
Commit 84230ad2d2afbf0c44c32967e525c0ad92e26b4e upstream.
When the core of io_uring was updated to handle completions consistently and with fixed return codes, the POLL_REMOVE opcode with updates got slightly broken. If a POLL_ADD is pending and then POLL_REMOVE is used to update the events of that request, if that update causes the POLL_ADD to now trigger, then that completion is lost and a CQE is never posted.
Additionally, ensure that if an update does cause an existing POLL_ADD to complete, that the completion value isn't always overwritten with -ECANCELED. For that case, whatever io_poll_add() set the value to should just be retained.
--- io_uring/poll.c | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-)
io_uring/poll.c +7 -2
@@ -1038,12 +1038,17 @@ int io_poll_remove(struct io_kiocb *req, unsigned int issue_flags) ret2 =io_poll_add (preq, issue_flags & ~IO_URING_F_UNLOCKED );/* successfully updated, don't complete poll request */ -if (!ret2 || ret2 == -EIOCBQUEUED ) +if (ret2 ==IOU_ISSUE_SKIP_COMPLETE ) goto out; +/* request completed as part of the update, complete it */ +else if (ret2 ==IOU_OK ) + goto complete; } -req_set_fail (preq);io_req_set_res (preq, -ECANCELED ,0 ); +complete: +if (preq->cqe.res <0 ) +req_set_fail (preq); preq->io_task_work.func = io_req_task_complete;io_req_task_work_add (preq); out:
Signature · 1 line
2.51.0