io-wq: fix races around manager/worker creation and task exit
authorJens Axboe <axboe@kernel.dk>
Tue, 23 Feb 2021 22:34:06 +0000 (15:34 -0700)
committerJens Axboe <axboe@kernel.dk>
Wed, 24 Feb 2021 03:33:38 +0000 (20:33 -0700)
commit8b3e78b5955abb98863832453f5c74eca8f53c3a
tree0aca27e4048e91517008e385bd40d85135df751e
parent8a378fb096a7f02943c72a428bbfd0029260efb6
io-wq: fix races around manager/worker creation and task exit

These races have always been there, they are just more apparent now that
we do early cancel of io-wq when the task exits.

Ensure that the io-wq manager sets task state correctly to not miss
wakeups for task creation. This is important if we get a wakeup after
having marked ourselves as TASK_INTERRUPTIBLE. If we do end up creating
workers, then we flip the state back to running, making the subsequent
schedule() a no-op. Also increment the wq ref count before forking the
thread, to avoid a use-after-free.

Signed-off-by: Jens Axboe <axboe@kernel.dk>
fs/io-wq.c