On 8/9/21 8:08 AM, Hao Xu wrote: > 在 2021/8/9 下午10:01, Jens Axboe 写道: >> On 8/8/21 7:54 AM, Hao Xu wrote: >>> The former patch to add check between nr_workers and max_workers has a >>> bug, which will cause unconditionally creating io-workers. That's >>> because the result of the check doesn't affect the call of >>> create_io_worker(), fix it by bringing in a boolean value for it. >>> >>> Fixes: 21698274da5b ("io-wq: fix lack of acct->nr_workers < acct->max_workers judgement") >>> Signed-off-by: Hao Xu <haoxu@xxxxxxxxxxxxxxxxx> >>> --- >>> fs/io-wq.c | 19 ++++++++++++++----- >>> 1 file changed, 14 insertions(+), 5 deletions(-) >>> >>> diff --git a/fs/io-wq.c b/fs/io-wq.c >>> index 12fc19353bb0..5536b2a008d1 100644 >>> --- a/fs/io-wq.c >>> +++ b/fs/io-wq.c >>> @@ -252,14 +252,15 @@ static void io_wqe_wake_worker(struct io_wqe *wqe, struct io_wqe_acct *acct) >>> >>> raw_spin_lock_irq(&wqe->lock); >>> if (acct->nr_workers < acct->max_workers) { >>> - atomic_inc(&acct->nr_running); >>> - atomic_inc(&wqe->wq->worker_refs); >>> acct->nr_workers++; >>> do_create = true; >>> } >>> raw_spin_unlock_irq(&wqe->lock); >>> - if (do_create) >>> + if (do_create) { >>> + atomic_inc(&acct->nr_running); >>> + atomic_inc(&wqe->wq->worker_refs); >>> create_io_worker(wqe->wq, wqe, acct->index); >>> + } >>> } >> >> I don't get this hunk - we already know we're creating a worker, what's the >> point in moving the incs? >> > Actually not much difference, I think we don't need to protect > nr_running and worker_refs by wqe->lock, so narrow the range of > raw_spin_lock_irq - raw_spin_unlock_irq Agree, we don't need it, but it's not a fix as such. I'd rather defer that one to a separate cleanup for the next release. -- Jens Axboe