• Hao Xu's avatar
    io_uring: fix async buffered reads when readahead is disabled · c8d317aa
    Hao Xu authored
    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: 1a0a7853 ("mm: support async buffered reads in generic_file_buffered_read()")
    Fixes: 3b2a4439 ("io_uring: get rid of kiocb_wait_page_queue_init()")
    Signed-off-by: default avatarHao Xu <haoxu@linux.alibaba.com>
    Signed-off-by: default avatarJens Axboe <axboe@kernel.dk>
    c8d317aa
io_uring.c 214 KB