Skip to content

Commit e15cb22

Browse files
committed
io_uring: fix min_wait wakeups for SQPOLL
Using min_wait, two timeouts are given: 1) The min_wait timeout, within which up to 'wait_nr' events are waited for. 2) The overall long timeout, which is entered if no events are generated in the min_wait window. If the min_wait has expired, any event being posted must wake the task. For SQPOLL, that isn't the case, as it won't trigger the io_has_work() condition, as it will have already processed the task_work that happened when an event was posted. This causes any event to trigger post the min_wait to not always cause the waiting application to wakeup, and instead it will wait until the overall timeout has expired. This can be shown in a test case that has a 1 second min_wait, with a 5 second overall wait, even if an event triggers after 1.5 seconds: axboe@m2max-kvm /d/iouring-mre (master)> zig-out/bin/iouring info: MIN_TIMEOUT supported: true, features: 0x3ffff info: Testing: min_wait=1000ms, timeout=5s, wait_nr=4 info: 1 cqes in 5000.2ms where the expected result should be: axboe@m2max-kvm /d/iouring-mre (master)> zig-out/bin/iouring info: MIN_TIMEOUT supported: true, features: 0x3ffff info: Testing: min_wait=1000ms, timeout=5s, wait_nr=4 info: 1 cqes in 1500.3ms When the min_wait timeout triggers, reset the number of completions needed to wake the task. This should ensure that any future events will wake the task, regardless of how many events it originally wanted to wait for. Reported-by: Tip ten Brink <tip@tenbrinkmeijs.com> Cc: stable@vger.kernel.org Fixes: 1100c4a ("io_uring: add support for batch wait timeout") Link: axboe/liburing#1477 Signed-off-by: Jens Axboe <axboe@kernel.dk>
1 parent 55d57b3 commit e15cb22

File tree

1 file changed

+3
-0
lines changed

1 file changed

+3
-0
lines changed

io_uring/io_uring.c

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2536,6 +2536,9 @@ static enum hrtimer_restart io_cqring_min_timer_wakeup(struct hrtimer *timer)
25362536
goto out_wake;
25372537
}
25382538

2539+
/* any generated CQE posted past this time should wake us up */
2540+
iowq->cq_tail = iowq->cq_min_tail;
2541+
25392542
hrtimer_update_function(&iowq->t, io_cqring_timer_wakeup);
25402543
hrtimer_set_expires(timer, iowq->timeout);
25412544
return HRTIMER_RESTART;

0 commit comments

Comments
 (0)