• Jens Axboe's avatar
    io_uring: fix regression with always ignoring signals in io_cqring_wait() · b7db41c9
    Jens Axboe authored
    When switching to TWA_SIGNAL for task_work notifications, we also made
    any signal based condition in io_cqring_wait() return -ERESTARTSYS.
    This breaks applications that rely on using signals to abort someone
    waiting for events.
    
    Check if we have a signal pending because of queued task_work, and
    repeat the signal check once we've run the task_work. This provides a
    reliable way of telling the two apart.
    
    Additionally, only use TWA_SIGNAL if we are using an eventfd. If not,
    we don't have the dependency situation described in the original commit,
    and we can get by with just using TWA_RESUME like we previously did.
    
    Fixes: ce593a6c ("io_uring: use signal based task_work running")
    Cc: stable@vger.kernel.org # v5.7
    Reported-by: default avatarAndres Freund <andres@anarazel.de>
    Tested-by: default avatarAndres Freund <andres@anarazel.de>
    Signed-off-by: default avatarJens Axboe <axboe@kernel.dk>
    b7db41c9
io_uring.c 195 KB