io-wq: fix potential race of acct->nr_workers
authorHao Xu <haoxu@linux.alibaba.com>
Sat, 11 Sep 2021 19:40:52 +0000 (03:40 +0800)
committerJens Axboe <axboe@kernel.dk>
Mon, 13 Sep 2021 01:27:47 +0000 (19:27 -0600)
commit767a65e9f31789d80e41edd03a802314905e8fbf
treeefc0d0cf64e9e0b225c0c9435004b951381ea384
parent7a842fb589e3cdbe205bc16dc37c30cf13383159
io-wq: fix potential race of acct->nr_workers

Given max_worker is 1, and we currently have 1 running and it is
exiting. There may be race like:
 io_wqe_enqueue                   worker1
                               no work there and timeout
                               unlock(wqe->lock)
 ->insert work
                               -->io_worker_exit
 lock(wqe->lock)
 ->if(!nr_workers) //it's still 1
 unlock(wqe->lock)
    goto run_cancel
                                  lock(wqe->lock)
                                  nr_workers--
                                  ->dec_running
                                    ->worker creation fails
                                  unlock(wqe->lock)

We enqueued one work but there is no workers, causes hung.

Signed-off-by: Hao Xu <haoxu@linux.alibaba.com>
Signed-off-by: Jens Axboe <axboe@kernel.dk>
fs/io-wq.c