• Jens Axboe's avatar
    io_uring: punt final io_ring_ctx wait-and-free to workqueue · 85faa7b8
    Jens Axboe authored
    We can't reliably wait in io_ring_ctx_wait_and_kill(), since the
    task_works list isn't ordered (in fact it's LIFO ordered). We could
    either fix this with a separate task_works list for io_uring work, or
    just punt the wait-and-free to async context. This ensures that
    task_work that comes in while we're shutting down is processed
    correctly. If we don't go async, we could have work past the fput()
    work for the ring that depends on work that won't be executed until
    after we're done with the wait-and-free. But as this operation is
    blocking, it'll never get a chance to run.
    
    This was reproduced with hundreds of thousands of sockets running
    memcached, haven't been able to reproduce this synthetically.
    Reported-by: default avatarDan Melnic <dmm@fb.com>
    Signed-off-by: default avatarJens Axboe <axboe@kernel.dk>
    85faa7b8
io_uring.c 190 KB