We don't need to set task state to TASK_INTERRUPTIBLE at the beginning of while() in io_wqe_worker(), which causes state resetting to TASK_RUNNING in other place. Move it to above schedule_timeout() and remove redundant task state settings. Signed-off-by: Hao Xu <haoxu@xxxxxxxxxxxxxxxxx> --- fs/io-wq.c | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/fs/io-wq.c b/fs/io-wq.c index 50dc93ffc153..cd4fd4d6268f 100644 --- a/fs/io-wq.c +++ b/fs/io-wq.c @@ -380,7 +380,6 @@ static void io_wait_on_hash(struct io_wqe *wqe, unsigned int hash) if (list_empty(&wqe->wait.entry)) { __add_wait_queue(&wq->hash->wait, &wqe->wait); if (!test_bit(hash, &wq->hash->map)) { - __set_current_state(TASK_RUNNING); list_del_init(&wqe->wait.entry); } } @@ -433,7 +432,6 @@ static struct io_wq_work *io_get_next_work(struct io_wqe *wqe) static bool io_flush_signals(void) { if (unlikely(test_thread_flag(TIF_NOTIFY_SIGNAL))) { - __set_current_state(TASK_RUNNING); tracehook_notify_signal(); return true; } @@ -482,7 +480,6 @@ static void io_worker_handle_work(struct io_worker *worker) if (!work) break; io_assign_current_work(worker, work); - __set_current_state(TASK_RUNNING); /* handle a whole dependent link */ do { @@ -538,7 +535,6 @@ static int io_wqe_worker(void *data) while (!test_bit(IO_WQ_BIT_EXIT, &wq->state)) { long ret; - set_current_state(TASK_INTERRUPTIBLE); loop: raw_spin_lock_irq(&wqe->lock); if (io_wqe_run_queue(wqe)) { @@ -549,6 +545,7 @@ static int io_wqe_worker(void *data) raw_spin_unlock_irq(&wqe->lock); if (io_flush_signals()) continue; + set_current_state(TASK_INTERRUPTIBLE); ret = schedule_timeout(WORKER_IDLE_TIMEOUT); if (signal_pending(current)) { struct ksignal ksig; -- 2.24.4