queue: keep fallback timeout data alive until submission - #1624
Open
soul-sol wants to merge 1 commit into
Open
Conversation
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
On kernels without IORING_FEAT_EXT_ARG, the timeout fallback places the caller-owned timespec pointer in an IORING_OP_TIMEOUT SQE. _io_uring_get_cqe() could return an already available CQE before SQPOLL consumed that SQE, or before a short non-SQPOLL submission reached it. The caller could then release stack storage while the ring still held the pointer.
Track the SQ tail containing the fallback timeout and keep submitting/waiting until the kernel SQ head reaches it. If a synchronous submission fails first, retract the last timeout SQE so a later submit cannot use the pointer. Other get-CQE paths retain their existing behavior and return values.
The regression test idles an SQPOLL thread, fills a 32K SQ without publishing it, forces the pre-EXT_ARG fallback, and verifies the call cannot return with unconsumed SQEs. It fails on current master with 32768 SQEs still ready and passes with this change.
Validation:
Fixes #1164