public inbox for [email protected]
 help / color / mirror / Atom feed
From: JeffleXu <[email protected]>
To: [email protected], [email protected], [email protected]
Cc: [email protected], [email protected],
	[email protected]
Subject: Re: [PATCH v4 0/2] block, iomap: disable iopoll for split bio
Date: Wed, 18 Nov 2020 17:50:42 +0800	[thread overview]
Message-ID: <[email protected]> (raw)
In-Reply-To: <[email protected]>


On 11/17/20 8:51 PM, JeffleXu wrote:
>
> On 11/17/20 3:56 PM, Jeffle Xu wrote:
>> This patchset is to fix the potential hang occurred in sync polling.
>>
>> Please refer the following link for background info and the v1 patch:
>> https://patchwork.kernel.org/project/linux-block/patch/[email protected]/ 
>>
>>
>> The first patch disables iopoll for split bio in block layer, which is
>> suggested by Ming Lei.
>>
>>
>> The second patch disables iopoll when one dio need to be split into
>> multiple bios. As for this patch, Ming Lei had ever asked what's the
>> expected behaviour of upper layers when simply clear IOCB_HIPRI in
>> the direct routine of blkdev fs, iomap-based fs. Currently there are
>> two parts concerning IOCB_HIPRI (or io polling). One is the sync
>> polling logic embedded in the direct IO routine. In this case, sync
>> polling won't be executed any more since IOCB_HIPRI flag has been
>> cleared from iocb->ki_flags. Consider the following code snippet:
>>
>> fs/block_dev.c: __blkdev_direct_IO
>>     for (;;) {
>>         ...
>>         if (!(iocb->ki_flags & IOCB_HIPRI) ||
>>             !blk_poll(bdev_get_queue(bdev), qc, true))
>>             blk_io_schedule();
>>     }
>>
>> fs/iomap/direct-io.c: __iomap_dio_rw
>>     for (;;) {
>>         ...
>>         if (!(iocb->ki_flags & IOCB_HIPRI) ||
>>             !dio->submit.last_queue ||
>>             !blk_poll(dio->submit.last_queue,
>>                  dio->submit.cookie, true))
>>             blk_io_schedule();
>>     }
>>
>>
>> The other part is io_uring.
>>
>> fs/io_uring.c:
>> io_iopoll_getevents
>>    io_do_iopoll
>>      list_for_each_entry_safe(...) {
>>        ret = kiocb->ki_filp->f_op->iopoll(kiocb, spin);
>>      }
>>
>> In this case, though the split bios have been enqueued into DEFAULT
>> hw queues, io_uring will still poll POLL hw queues. When polling on
>> the cookie returned by split bio, blk_poll() will return 0 immediately
>> since the hw queue type check added in patch 1. If there's no other
>> bio in the POLL hw queues, io_do_iopoll() will loop indefinitely
>> until the split bio is completed by interrupt of DEFAULT queue. Indeed
>> there may be a pulse of high CPU sys in this time window here, but it
>> is no worse than before. After all io_do_iopoll() will still get stuck
>> in this loop when there's only one bio (that we are polling on) in POLL
>> hw queue, before this patch applied.
>>
>> The situation described above may be less impossible. As long as there
>> are other bios in POLL hw queue, work of io_do_iopoll() is still
>> meaningful as it *helps* reap these other bios in POLL hw queue, while
>> the split bios are still completed by interrupt of DEFAULT hw queue.
>
> ops, this design could still be problematic. Once the cookie of split 
> bio is iterated in io_do_iopoll(),
>
> io_do_iopoll() will get stuck in indefinite loop doing nothing until 
> the split bio is completed by the interrupt of
>
> DEFAULT hw queue, even when there may be other bios in POLL hw queue 
> waiting to be reaped.

This shouldn't be a problem. After this patch applied, blk_poll() will 
return 0 immediately

since the hw queue type check added in patch 1, and thus io_do_iopoll() 
will iterate next

kiocb in @iopoll_list. There will be no indefinite loop. Sorry for the 
noise...

-- 
Thanks,
Jeffle


      reply	other threads:[~2020-11-18  9:50 UTC|newest]

Thread overview: 14+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2020-11-17  7:56 [PATCH v4 0/2] block, iomap: disable iopoll for split bio Jeffle Xu
2020-11-17  7:56 ` [PATCH v4 1/2] block: " Jeffle Xu
2020-11-19  3:06   ` JeffleXu
2020-11-19 17:52   ` Christoph Hellwig
2020-11-20  9:22     ` JeffleXu
2020-11-17  7:56 ` [PATCH v4 2/2] block,iomap: disable iopoll when split needed Jeffle Xu
2020-11-17 17:37   ` Darrick J. Wong
2020-11-18  1:56     ` JeffleXu
2020-11-19 17:55   ` Christoph Hellwig
2020-11-20 10:06     ` JeffleXu
2020-11-24 11:25       ` Christoph Hellwig
2020-11-25  7:03         ` JeffleXu
2020-11-17 12:51 ` [PATCH v4 0/2] block, iomap: disable iopoll for split bio JeffleXu
2020-11-18  9:50   ` JeffleXu [this message]

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=b0e86685-6809-e48d-f583-9b3af4ff79b1@linux.alibaba.com \
    [email protected] \
    [email protected] \
    [email protected] \
    [email protected] \
    [email protected] \
    [email protected] \
    [email protected] \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox