| .. | .. | 
|---|
| 176 | 176 | complete(&wq->worker_done); | 
|---|
| 177 | 177 | } | 
|---|
| 178 | 178 |  | 
|---|
|  | 179 | +bool io_wq_worker_stopped(void) | 
|---|
|  | 180 | +{ | 
|---|
|  | 181 | +	struct io_worker *worker = current->pf_io_worker; | 
|---|
|  | 182 | + | 
|---|
|  | 183 | +	if (WARN_ON_ONCE(!io_wq_current_is_worker())) | 
|---|
|  | 184 | +		return true; | 
|---|
|  | 185 | + | 
|---|
|  | 186 | +	return test_bit(IO_WQ_BIT_EXIT, &worker->wqe->wq->state); | 
|---|
|  | 187 | +} | 
|---|
|  | 188 | + | 
|---|
| 179 | 189 | static void io_worker_cancel_cb(struct io_worker *worker) | 
|---|
| 180 | 190 | { | 
|---|
| 181 | 191 | struct io_wqe_acct *acct = io_wqe_get_acct(worker); | 
|---|
| .. | .. | 
|---|
| 513 | 523 |  | 
|---|
| 514 | 524 | static bool io_flush_signals(void) | 
|---|
| 515 | 525 | { | 
|---|
| 516 |  | -	if (unlikely(test_thread_flag(TIF_NOTIFY_SIGNAL))) { | 
|---|
|  | 526 | +	if (test_thread_flag(TIF_NOTIFY_SIGNAL) || current->task_works) { | 
|---|
| 517 | 527 | __set_current_state(TASK_RUNNING); | 
|---|
| 518 | 528 | tracehook_notify_signal(); | 
|---|
| 519 | 529 | return true; | 
|---|
| .. | .. | 
|---|
| 1217 | 1227 |  | 
|---|
| 1218 | 1228 | worker = container_of(cb, struct io_worker, create_work); | 
|---|
| 1219 | 1229 | io_worker_cancel_cb(worker); | 
|---|
|  | 1230 | +		/* | 
|---|
|  | 1231 | +		 * Only the worker continuation helper has worker allocated and | 
|---|
|  | 1232 | +		 * hence needs freeing. | 
|---|
|  | 1233 | +		 */ | 
|---|
|  | 1234 | +		if (cb->func == create_worker_cont) | 
|---|
|  | 1235 | +			kfree(worker); | 
|---|
| 1220 | 1236 | } | 
|---|
| 1221 | 1237 | } | 
|---|
| 1222 | 1238 |  | 
|---|