diff options
author | Jens Axboe <axboe@kernel.dk> | 2021-03-21 07:06:56 -0600 |
---|---|---|
committer | Jens Axboe <axboe@kernel.dk> | 2021-03-21 09:41:14 -0600 |
commit | 00ddff431a458bbf143ea7c4c42d022676da1b17 (patch) | |
tree | a2c094c16df92bbe8c2040d7346541d019b1b2be /fs | |
parent | 4db4b1a0d1779dc159f7b87feb97030ec0b12597 (diff) | |
download | linux-00ddff431a458bbf143ea7c4c42d022676da1b17.tar.bz2 |
io-wq: ensure task is running before processing task_work
Mark the current task as running if we need to run task_work from the
io-wq threads as part of work handling. If that is the case, then return
as such so that the caller can appropriately loop back and reset if it
was part of a going-to-sleep flush.
Fixes: 3bfe6106693b ("io-wq: fork worker threads from original task")
Signed-off-by: Jens Axboe <axboe@kernel.dk>
Diffstat (limited to 'fs')
-rw-r--r-- | fs/io-wq.c | 8 |
1 files changed, 6 insertions, 2 deletions
diff --git a/fs/io-wq.c b/fs/io-wq.c index e05f996d088f..3dc10bfd8c3b 100644 --- a/fs/io-wq.c +++ b/fs/io-wq.c @@ -386,13 +386,16 @@ static struct io_wq_work *io_get_next_work(struct io_wqe *wqe) return NULL; } -static void io_flush_signals(void) +static bool io_flush_signals(void) { if (unlikely(test_tsk_thread_flag(current, TIF_NOTIFY_SIGNAL))) { + __set_current_state(TASK_RUNNING); if (current->task_works) task_work_run(); clear_tsk_thread_flag(current, TIF_NOTIFY_SIGNAL); + return true; } + return false; } static void io_assign_current_work(struct io_worker *worker, @@ -499,7 +502,8 @@ loop: } __io_worker_idle(wqe, worker); raw_spin_unlock_irq(&wqe->lock); - io_flush_signals(); + if (io_flush_signals()) + continue; ret = schedule_timeout(WORKER_IDLE_TIMEOUT); if (try_to_freeze() || ret) continue; |