coalescing in polling mode in 4.9

Alex Nln alex.nlnnfn at gmail.com
Mon Feb 5 21:39:45 PST 2018


Hi Nitesh,

On Mon, 05 Feb 2018 21:12:12 +0530
Nitesh <nj.shetty at samsung.com> wrote:

> Hi Alex,
> I got into similar problem not long ago. With coalescing enabled, some 
> I/Os took very long. Every time need_reshed() returns true, 
> io_schedule() makes task go to sleep as its state is previous set as 
> non-interruptible.I handled this by setting task state as running, and 
> release the cpu. Diff is attached below, you may give it a try.
> 

I tested this patch on kernel 4.9 and it solves the problem.
Thanks a lot


> 
> diff --git a/fs/block_dev.c b/fs/block_dev.c
> index 4a181fc..d2eeedf 100644
> --- a/fs/block_dev.c
> +++ b/fs/block_dev.c
> @@ -236,9 +236,13 @@ __blkdev_direct_IO_simple(struct kiocb *iocb, 
> struct iov_iter *iter,
>                  set_current_state(TASK_UNINTERRUPTIBLE);
>                  if (!READ_ONCE(bio.bi_private))
>                          break;
> -               if (!(iocb->ki_flags & IOCB_HIPRI) ||
> -                   !blk_poll(bdev_get_queue(bdev), qc))
> +               if (!(iocb->ki_flags & IOCB_HIPRI))
>                          io_schedule();
> +               else if (!blk_poll(bdev_get_queue(bdev), qc)) {
> +                       if(need_resched())
> +                               set_current_state(TASK_RUNNING);
> +                       io_schedule();
> +               }
>          }
>          __set_current_state(TASK_RUNNING);
> 
> 



More information about the Linux-nvme mailing list