Patch "io_uring/poll: allow some retries for poll triggering spuriously" has been added to the 5.10-stable tree

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



This is a note to let you know that I've just added the patch titled

    io_uring/poll: allow some retries for poll triggering spuriously

to the 5.10-stable tree which can be found at:
    http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary

The filename of the patch is:
     io_uring-poll-allow-some-retries-for-poll-triggering-spuriously.patch
and it can be found in the queue-5.10 subdirectory.

If you, or anyone else, feels it should not be added to the stable tree,
please let <stable@xxxxxxxxxxxxxxx> know about it.


>From f25af723ed67f5912b7b66353ce8634c612125de Mon Sep 17 00:00:00 2001
From: Jens Axboe <axboe@xxxxxxxxx>
Date: Mon, 6 Mar 2023 13:28:57 -0700
Subject: io_uring/poll: allow some retries for poll triggering spuriously

From: Jens Axboe <axboe@xxxxxxxxx>

commit c16bda37594f83147b167d381d54c010024efecf upstream.

If we get woken spuriously when polling and fail the operation with
-EAGAIN again, then we generally only allow polling again if data
had been transferred at some point. This is indicated with
REQ_F_PARTIAL_IO. However, if the spurious poll triggers when the socket
was originally empty, then we haven't transferred data yet and we will
fail the poll re-arm. This either punts the socket to io-wq if it's
blocking, or it fails the request with -EAGAIN if not. Neither condition
is desirable, as the former will slow things down, while the latter
will make the application confused.

We want to ensure that a repeated poll trigger doesn't lead to infinite
work making no progress, that's what the REQ_F_PARTIAL_IO check was
for. But it doesn't protect against a loop post the first receive, and
it's unnecessarily strict if we started out with an empty socket.

Add a somewhat random retry count, just to put an upper limit on the
potential number of retries that will be done. This should be high enough
that we won't really hit it in practice, unless something needs to be
aborted anyway.

Cc: stable@xxxxxxxxxxxxxxx # v5.10+
Link: https://github.com/axboe/liburing/issues/364
Signed-off-by: Jens Axboe <axboe@xxxxxxxxx>
Signed-off-by: Greg Kroah-Hartman <gregkh@xxxxxxxxxxxxxxxxxxx>
---
 io_uring/io_uring.c |   16 ++++++++++++++--
 1 file changed, 14 insertions(+), 2 deletions(-)

--- a/io_uring/io_uring.c
+++ b/io_uring/io_uring.c
@@ -486,6 +486,7 @@ struct io_poll_iocb {
 	struct file			*file;
 	struct wait_queue_head		*head;
 	__poll_t			events;
+	int				retries;
 	struct wait_queue_entry		wait;
 };
 
@@ -5749,6 +5750,14 @@ enum {
 	IO_APOLL_READY
 };
 
+/*
+ * We can't reliably detect loops in repeated poll triggers and issue
+ * subsequently failing. But rather than fail these immediately, allow a
+ * certain amount of retries before we give up. Given that this condition
+ * should _rarely_ trigger even once, we should be fine with a larger value.
+ */
+#define APOLL_MAX_RETRY		128
+
 static int io_arm_poll_handler(struct io_kiocb *req)
 {
 	const struct io_op_def *def = &io_op_defs[req->opcode];
@@ -5760,8 +5769,6 @@ static int io_arm_poll_handler(struct io
 
 	if (!req->file || !file_can_poll(req->file))
 		return IO_APOLL_ABORTED;
-	if ((req->flags & (REQ_F_POLLED|REQ_F_PARTIAL_IO)) == REQ_F_POLLED)
-		return IO_APOLL_ABORTED;
 	if (!def->pollin && !def->pollout)
 		return IO_APOLL_ABORTED;
 
@@ -5779,8 +5786,13 @@ static int io_arm_poll_handler(struct io
 	if (req->flags & REQ_F_POLLED) {
 		apoll = req->apoll;
 		kfree(apoll->double_poll);
+		if (unlikely(!--apoll->poll.retries)) {
+			apoll->double_poll = NULL;
+			return IO_APOLL_ABORTED;
+		}
 	} else {
 		apoll = kmalloc(sizeof(*apoll), GFP_ATOMIC);
+		apoll->poll.retries = APOLL_MAX_RETRY;
 	}
 	if (unlikely(!apoll))
 		return IO_APOLL_ABORTED;


Patches currently in stable-queue which might be from axboe@xxxxxxxxx are

queue-5.10/s390-dasd-prepare-for-additional-path-event-handling.patch
queue-5.10/io_uring-handle-tif_notify_resume-when-checking-for-task_work.patch
queue-5.10/brd-return-0-error-from-brd_insert_page.patch
queue-5.10/fs-hfsplus-fix-uaf-issue-in-hfsplus_put_super.patch
queue-5.10/blk-mq-avoid-sleep-in-blk_mq_alloc_request_hctx.patch
queue-5.10/io_uring-remove-msg_nosignal-from-recvmsg.patch
queue-5.10/io_uring-mark-task-task_running-before-handling-resume-task-work.patch
queue-5.10/io_uring-rsrc-disallow-multi-source-reg-buffers.patch
queue-5.10/io_uring-poll-allow-some-retries-for-poll-triggering-spuriously.patch
queue-5.10/blk-mq-remove-stale-comment-for-blk_mq_sched_mark_re.patch
queue-5.10/blk-iocost-fix-divide-by-0-error-in-calc_lcoefs.patch
queue-5.10/s390-dasd-fix-potential-memleak-in-dasd_eckd_init.patch
queue-5.10/blk-mq-correct-stale-comment-of-.get_budget.patch
queue-5.10/io_uring-add-a-conditional-reschedule-to-the-iopoll-cancelation-loop.patch
queue-5.10/block-bio-integrity-copy-flags-when-bio_integrity_pa.patch



[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Index of Archives]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux