mirror of
				https://github.com/torvalds/linux.git
				synced 2025-10-31 16:48:26 +02:00 
			
		
		
		
	io_uring: use TWA_SIGNAL for task_work uncondtionally
An earlier commit:
b7db41c9e0 ("io_uring: fix regression with always ignoring signals in io_cqring_wait()")
ensured that we didn't get stuck waiting for eventfd reads when it's
registered with the io_uring ring for event notification, but we still
have cases where the task can be waiting on other events in the kernel and
need a bigger nudge to make forward progress. Or the task could be in the
kernel and running, but on its way to blocking.
This means that TWA_RESUME cannot reliably be used to ensure we make
progress. Use TWA_SIGNAL unconditionally.
Cc: stable@vger.kernel.org # v5.7+
Reported-by: Josef <josef.grieb@gmail.com>
Signed-off-by: Jens Axboe <axboe@kernel.dk>
			
			
This commit is contained in:
		
							parent
							
								
									f74441e631
								
							
						
					
					
						commit
						0ba9c9edcd
					
				
					 1 changed files with 8 additions and 8 deletions
				
			
		|  | @ -1710,22 +1710,22 @@ static int io_req_task_work_add(struct io_kiocb *req, struct callback_head *cb) | |||
| { | ||||
| 	struct task_struct *tsk = req->task; | ||||
| 	struct io_ring_ctx *ctx = req->ctx; | ||||
| 	int ret, notify = TWA_RESUME; | ||||
| 	int ret, notify; | ||||
| 
 | ||||
| 	/*
 | ||||
| 	 * SQPOLL kernel thread doesn't need notification, just a wakeup. | ||||
| 	 * If we're not using an eventfd, then TWA_RESUME is always fine, | ||||
| 	 * as we won't have dependencies between request completions for | ||||
| 	 * other kernel wait conditions. | ||||
| 	 * SQPOLL kernel thread doesn't need notification, just a wakeup. For | ||||
| 	 * all other cases, use TWA_SIGNAL unconditionally to ensure we're | ||||
| 	 * processing task_work. There's no reliable way to tell if TWA_RESUME | ||||
| 	 * will do the job. | ||||
| 	 */ | ||||
| 	if (ctx->flags & IORING_SETUP_SQPOLL) | ||||
| 		notify = 0; | ||||
| 	else if (ctx->cq_ev_fd) | ||||
| 	notify = 0; | ||||
| 	if (!(ctx->flags & IORING_SETUP_SQPOLL)) | ||||
| 		notify = TWA_SIGNAL; | ||||
| 
 | ||||
| 	ret = task_work_add(tsk, cb, notify); | ||||
| 	if (!ret) | ||||
| 		wake_up_process(tsk); | ||||
| 
 | ||||
| 	return ret; | ||||
| } | ||||
| 
 | ||||
|  |  | |||
		Loading…
	
		Reference in a new issue
	
	 Jens Axboe
						Jens Axboe