io_uring: fix async buffered reads when readahead is disabled
The async buffered reads feature is not working when readahead is turned off. There are two things to concern: - when doing retry in io_read, not only the IOCB_WAITQ flag but also the IOCB_NOWAIT flag is still set, which makes it goes to would_block phase in generic_file_buffered_read() and then return -EAGAIN. After that, the io-wq thread work is queued, and later doing the async reads in the old way. - even if we remove IOCB_NOWAIT when doing retry, the feature is still not running properly, since in generic_file_buffered_read() it goes to lock_page_killable() after calling mapping->a_ops->readpage() to do IO, and thus causing process to sleep. Fixes:1a0a7853b9
("mm: support async buffered reads in generic_file_buffered_read()") Fixes:3b2a4439e0
("io_uring: get rid of kiocb_wait_page_queue_init()") Signed-off-by: Hao Xu <haoxu@linux.alibaba.com> Signed-off-by: Jens Axboe <axboe@kernel.dk>
This commit is contained in:
Родитель
fad8e0de44
Коммит
c8d317aa18
|
@ -3049,6 +3049,7 @@ static int io_async_buf_func(struct wait_queue_entry *wait, unsigned mode,
|
|||
if (!wake_page_match(wpq, key))
|
||||
return 0;
|
||||
|
||||
req->rw.kiocb.ki_flags &= ~IOCB_WAITQ;
|
||||
list_del_init(&wait->entry);
|
||||
|
||||
init_task_work(&req->task_work, io_req_task_submit);
|
||||
|
@ -3106,6 +3107,7 @@ static bool io_rw_should_retry(struct io_kiocb *req)
|
|||
wait->wait.flags = 0;
|
||||
INIT_LIST_HEAD(&wait->wait.entry);
|
||||
kiocb->ki_flags |= IOCB_WAITQ;
|
||||
kiocb->ki_flags &= ~IOCB_NOWAIT;
|
||||
kiocb->ki_waitq = wait;
|
||||
|
||||
io_get_req_task(req);
|
||||
|
|
|
@ -2267,7 +2267,11 @@ readpage:
|
|||
}
|
||||
|
||||
if (!PageUptodate(page)) {
|
||||
error = lock_page_killable(page);
|
||||
if (iocb->ki_flags & IOCB_WAITQ)
|
||||
error = lock_page_async(page, iocb->ki_waitq);
|
||||
else
|
||||
error = lock_page_killable(page);
|
||||
|
||||
if (unlikely(error))
|
||||
goto readpage_error;
|
||||
if (!PageUptodate(page)) {
|
||||
|
|
Загрузка…
Ссылка в новой задаче