• Jens Axboe's avatar
    io_uring/poll: attempt request issue after racy poll wakeup · 6e5aedb9
    Jens Axboe authored
    If we have multiple requests waiting on the same target poll waitqueue,
    then it's quite possible to get a request triggered and get disappointed
    in not being able to make any progress with it. If we race in doing so,
    we'll potentially leave the poll request on the internal tables, but
    removed from the waitqueue. That means that any subsequent trigger of
    the poll waitqueue will not kick that request into action, causing an
    application to potentially wait for completion of a request that will
    never happen.
    
    Fix this by adding a new poll return state, IOU_POLL_REISSUE. Rather
    than have complicated logic for how to re-arm a given type of request,
    just punt it for a reissue.
    
    While in there, move the 'ret' variable to the only section where it
    gets used. This avoids confusion the scope of it.
    
    Cc: stable@vger.kernel.org
    Fixes: eb0089d6 ("io_uring: single shot poll removal optimisation")
    Signed-off-by: default avatarJens Axboe <axboe@kernel.dk>
    6e5aedb9
poll.c 27.6 KB