• J
    io-wq: make worker creation resilient against signals · 3146cba9
    Jens Axboe 提交于
    If a task is queueing async work and also handling signals, then we can
    run into the case where create_io_thread() is interrupted and returns
    failure because of that. If this happens for creating the first worker
    in a group, then that worker will never get created and we can hang the
    ring.
    
    If we do get a fork failure, retry from task_work. With signals we have
    to be a bit careful as we cannot simply queue as task_work, as we'll
    still have signals pending at that point. Punt over a normal workqueue
    first and then create from task_work after that.
    
    Lastly, ensure that we handle fatal worker creations. Worker creation
    failures are normally not fatal, only if we fail to create one in an empty
    worker group can we not make progress. Right now that is ignored, ensure
    that we handle that and run cancel on the work item.
    
    There are two paths that create new workers - one is the "existing worker
    going to sleep", and the other is "no workers found for this work, create
    one". The former is never fatal, as workers do exist in the group. Only
    the latter needs to be carefully handled.
    Signed-off-by: NJens Axboe <axboe@kernel.dk>
    3146cba9
io-wq.c 30.5 KB