On Fri, 2018-11-30 at 09:56 -0700, Jens Axboe wrote:
> We can't wait for polled events to complete, as they may require active
> polling from whoever submitted it. If that is the same task that is
> submitting new IO, we could deadlock waiting for IO to complete that
> this task is supposed to be completing itself.
> 
> Signed-off-by: Jens Axboe <[email protected]>
> ---
>  fs/block_dev.c | 10 +++++++++-
>  1 file changed, 9 insertions(+), 1 deletion(-)
> 
> diff --git a/fs/block_dev.c b/fs/block_dev.c
> index 6de8d35f6e41..ebc3d5a0f424 100644
> --- a/fs/block_dev.c
> +++ b/fs/block_dev.c
> @@ -402,8 +402,16 @@ __blkdev_direct_IO(struct kiocb *iocb, struct iov_iter 
> *iter, int nr_pages)
>  
>               nr_pages = iov_iter_npages(iter, BIO_MAX_PAGES);
>               if (!nr_pages) {
> -                     if (iocb->ki_flags & IOCB_HIPRI)
> +                     if (iocb->ki_flags & IOCB_HIPRI) {
>                               bio->bi_opf |= REQ_HIPRI;
> +                             /*
> +                              * For async polled IO, we can't wait for
> +                              * requests to complete, as they may also be
> +                              * polled and require active reaping.
> +                              */
> +                             if (!is_sync)
> +                                     bio->bi_opf |= REQ_NOWAIT;
> +                     }
>  
>                       qc = submit_bio(bio);
>                       WRITE_ONCE(iocb->ki_cookie, qc);

Setting REQ_NOWAIT from inside the block layer will make the code that
submits requests harder to review. Have you considered to make this code
fail I/O if REQ_NOWAIT has not been set and to require that the context
that submits I/O sets REQ_NOWAIT?

Thanks,

Bart.

Reply via email to