@@ -26,6 +26,7 @@ enum {
IO_WORKER_F_RUNNING = 2, /* account as running */
IO_WORKER_F_FREE = 4, /* worker on free list */
IO_WORKER_F_BOUND = 8, /* is doing bounded work */
+ IO_WORKER_F_EXIT = 32, /* worker is exiting */
};
enum {
@@ -639,8 +640,12 @@ static int io_wqe_worker(void *data)
while (!test_bit(IO_WQ_BIT_EXIT, &wq->state)) {
long ret;
+ if (worker->flags & IO_WORKER_F_EXIT)
+ break;
+
set_current_state(TASK_INTERRUPTIBLE);
- while (io_acct_run_queue(acct))
+ while (!(worker->flags & IO_WORKER_F_EXIT) &&
+ io_acct_run_queue(acct))
io_worker_handle_work(worker);
raw_spin_lock(&wqe->lock);
@@ -656,6 +661,10 @@ static int io_wqe_worker(void *data)
raw_spin_unlock(&wqe->lock);
if (io_flush_signals())
continue;
+ if (worker->flags & IO_WORKER_F_EXIT) {
+ __set_current_state(TASK_RUNNING);
+ break;
+ }
ret = schedule_timeout(WORKER_IDLE_TIMEOUT);
if (signal_pending(current)) {
struct ksignal ksig;