All the mail mirrored from lore.kernel.org
 help / color / mirror / Atom feed
From: Ming Lei <ming.lei@redhat.com>
To: JeffleXu <jefflexu@linux.alibaba.com>
Cc: Christoph Hellwig <hch@infradead.org>,
	Jens Axboe <axboe@kernel.dk>,
	linux-block@vger.kernel.org, Mike Snitzer <snitzer@redhat.com>,
	dm-devel@redhat.com, Hannes Reinecke <hare@suse.de>
Subject: Re: [PATCH V5 11/12] block: add poll_capable method to support bio-based IO polling
Date: Thu, 15 Apr 2021 15:43:22 +0800	[thread overview]
Message-ID: <YHfumsTKHuvPGp47@T590> (raw)
In-Reply-To: <5f30059d-6650-8268-b681-d8567ac1c509@linux.alibaba.com>

On Thu, Apr 15, 2021 at 09:34:36AM +0800, JeffleXu wrote:
> 
> 
> On 4/14/21 7:24 PM, Ming Lei wrote:
> > On Wed, Apr 14, 2021 at 04:38:25PM +0800, JeffleXu wrote:
> >>
> >>
> >> On 4/12/21 5:38 PM, Christoph Hellwig wrote:
> >>> On Thu, Apr 01, 2021 at 10:19:26AM +0800, Ming Lei wrote:
> >>>> From: Jeffle Xu <jefflexu@linux.alibaba.com>
> >>>>
> >>>> This method can be used to check if bio-based device supports IO polling
> >>>> or not. For mq devices, checking for hw queue in polling mode is
> >>>> adequate, while the sanity check shall be implementation specific for
> >>>> bio-based devices. For example, dm device needs to check if all
> >>>> underlying devices are capable of IO polling.
> >>>>
> >>>> Though bio-based device may have done the sanity check during the
> >>>> device initialization phase, cacheing the result of this sanity check
> >>>> (such as by cacheing in the queue_flags) may not work. Because for dm
> >>>> devices, users could change the state of the underlying devices through
> >>>> '/sys/block/<dev>/io_poll', bypassing the dm device above. In this case,
> >>>> the cached result of the very beginning sanity check could be
> >>>> out-of-date. Thus the sanity check needs to be done every time 'io_poll'
> >>>> is to be modified.
> >>>
> >>> I really don't think thi should be a method, and I really do dislike
> >>> how we have all this "if (is_mq)" junk.  Why can't we have a flag on
> >>> the gendisk that signals if the device can support polling that
> >>> is autoamtically set for blk-mq and as-needed by bio based drivers?
> >>
> >> That would consume one more bit of queue->queue_flags.
> >>
> >> Besides, DM/MD is somehow special here that when one of the underlying
> >> devices is disabled polling through '/sys/block/<dev>/io_poll',
> >> currently there's no mechanism notifying the above MD/DM to clear the
> >> previously set queue_flags. Thus the outdated queue_flags still
> >> indicates this DM/MD is capable of polling, while in fact one of the
> >> underlying device has been disabled for polling.
> > 
> > Right, just like there isn't queue limit progagation.
> > 
> > Another blocker could be that bio based queue doesn't support queue
> > freezing.
> 
> Do you mean the queue freezing is called in the following code snippet?
> 
> ```
> static ssize_t queue_poll_store(struct request_queue *q, const char
> *page, size_t count)
> {
> 	...
> 	if (poll_on) {
> 		blk_queue_flag_set(QUEUE_FLAG_POLL, q);
> 	} else {
> 		blk_mq_freeze_queue(q);
> 		blk_queue_flag_clear(QUEUE_FLAG_POLL, q);
> 		blk_mq_unfreeze_queue(q);
> 	}
> ```

Yes, if it is a bio based queue. Or bio queued queue(DM, MD or others) may
use freeze_queue to do similar thing.

> 
> And I can't understand how bio-based queue doesn't support queue freezing.
> 
> ```
> submit_bio_noacct
> 	__submit_bio_noacct
> 		bio_queue_enter
> ```
> 
> Every time submitting a bio, bio_queue_enter() will be called, and once
> the queue has been frozen, bio_queue_enter() will wait there until the
> queue is unfrozen.

Not like blk-mq, the refcount is just grabbed during submission for bio based
queue. I will research a bit and see if we can extend freeze queue for
covering bio based queue. One trouble is that bio is ended before
freeing request.

> 
> > 
> >>
> >> Mike had ever suggested that we can trust the queue_flag, and clear the
> >> outdated queue_flags when later the IO submission or polling routine
> >> finally finds that the device is not capable of polling. Currently
> >> submit_bio_checks() will silently clear the REQ_HIPRI flag and still
> >> submit the bio when the device is actually not capable of polling. To
> >> fix the issue, could we break the submission and return an error code in
> >> submit_bio_checks() if the device is not capable of polling when
> >> submitting HIPRI bio?
> > 
> > I think we may just leave it alone, if underlying queue becomes not pollable,
> > the bio still can be submitted & completed via IRQ, just not efficient enough.
> 
> Yes it still works. I agree if there's no better solution...
> 
> And what about the issue Christoph originally concerned? Do we use one
> more flag bit indicating if the queue capable of polling, or the
> poll_capable() method way?

Just wondering why we can't use QUEUE_FLAG_POLL simply? If user wants to
enable it, let's do it for them. And bio driver can start with default poll
state by checking underlying queues.


Thanks,
Ming


WARNING: multiple messages have this Message-ID (diff)
From: Ming Lei <ming.lei@redhat.com>
To: JeffleXu <jefflexu@linux.alibaba.com>
Cc: Jens Axboe <axboe@kernel.dk>,
	linux-block@vger.kernel.org, Mike Snitzer <snitzer@redhat.com>,
	Christoph Hellwig <hch@infradead.org>,
	dm-devel@redhat.com
Subject: Re: [dm-devel] [PATCH V5 11/12] block: add poll_capable method to support bio-based IO polling
Date: Thu, 15 Apr 2021 15:43:22 +0800	[thread overview]
Message-ID: <YHfumsTKHuvPGp47@T590> (raw)
In-Reply-To: <5f30059d-6650-8268-b681-d8567ac1c509@linux.alibaba.com>

On Thu, Apr 15, 2021 at 09:34:36AM +0800, JeffleXu wrote:
> 
> 
> On 4/14/21 7:24 PM, Ming Lei wrote:
> > On Wed, Apr 14, 2021 at 04:38:25PM +0800, JeffleXu wrote:
> >>
> >>
> >> On 4/12/21 5:38 PM, Christoph Hellwig wrote:
> >>> On Thu, Apr 01, 2021 at 10:19:26AM +0800, Ming Lei wrote:
> >>>> From: Jeffle Xu <jefflexu@linux.alibaba.com>
> >>>>
> >>>> This method can be used to check if bio-based device supports IO polling
> >>>> or not. For mq devices, checking for hw queue in polling mode is
> >>>> adequate, while the sanity check shall be implementation specific for
> >>>> bio-based devices. For example, dm device needs to check if all
> >>>> underlying devices are capable of IO polling.
> >>>>
> >>>> Though bio-based device may have done the sanity check during the
> >>>> device initialization phase, cacheing the result of this sanity check
> >>>> (such as by cacheing in the queue_flags) may not work. Because for dm
> >>>> devices, users could change the state of the underlying devices through
> >>>> '/sys/block/<dev>/io_poll', bypassing the dm device above. In this case,
> >>>> the cached result of the very beginning sanity check could be
> >>>> out-of-date. Thus the sanity check needs to be done every time 'io_poll'
> >>>> is to be modified.
> >>>
> >>> I really don't think thi should be a method, and I really do dislike
> >>> how we have all this "if (is_mq)" junk.  Why can't we have a flag on
> >>> the gendisk that signals if the device can support polling that
> >>> is autoamtically set for blk-mq and as-needed by bio based drivers?
> >>
> >> That would consume one more bit of queue->queue_flags.
> >>
> >> Besides, DM/MD is somehow special here that when one of the underlying
> >> devices is disabled polling through '/sys/block/<dev>/io_poll',
> >> currently there's no mechanism notifying the above MD/DM to clear the
> >> previously set queue_flags. Thus the outdated queue_flags still
> >> indicates this DM/MD is capable of polling, while in fact one of the
> >> underlying device has been disabled for polling.
> > 
> > Right, just like there isn't queue limit progagation.
> > 
> > Another blocker could be that bio based queue doesn't support queue
> > freezing.
> 
> Do you mean the queue freezing is called in the following code snippet?
> 
> ```
> static ssize_t queue_poll_store(struct request_queue *q, const char
> *page, size_t count)
> {
> 	...
> 	if (poll_on) {
> 		blk_queue_flag_set(QUEUE_FLAG_POLL, q);
> 	} else {
> 		blk_mq_freeze_queue(q);
> 		blk_queue_flag_clear(QUEUE_FLAG_POLL, q);
> 		blk_mq_unfreeze_queue(q);
> 	}
> ```

Yes, if it is a bio based queue. Or bio queued queue(DM, MD or others) may
use freeze_queue to do similar thing.

> 
> And I can't understand how bio-based queue doesn't support queue freezing.
> 
> ```
> submit_bio_noacct
> 	__submit_bio_noacct
> 		bio_queue_enter
> ```
> 
> Every time submitting a bio, bio_queue_enter() will be called, and once
> the queue has been frozen, bio_queue_enter() will wait there until the
> queue is unfrozen.

Not like blk-mq, the refcount is just grabbed during submission for bio based
queue. I will research a bit and see if we can extend freeze queue for
covering bio based queue. One trouble is that bio is ended before
freeing request.

> 
> > 
> >>
> >> Mike had ever suggested that we can trust the queue_flag, and clear the
> >> outdated queue_flags when later the IO submission or polling routine
> >> finally finds that the device is not capable of polling. Currently
> >> submit_bio_checks() will silently clear the REQ_HIPRI flag and still
> >> submit the bio when the device is actually not capable of polling. To
> >> fix the issue, could we break the submission and return an error code in
> >> submit_bio_checks() if the device is not capable of polling when
> >> submitting HIPRI bio?
> > 
> > I think we may just leave it alone, if underlying queue becomes not pollable,
> > the bio still can be submitted & completed via IRQ, just not efficient enough.
> 
> Yes it still works. I agree if there's no better solution...
> 
> And what about the issue Christoph originally concerned? Do we use one
> more flag bit indicating if the queue capable of polling, or the
> poll_capable() method way?

Just wondering why we can't use QUEUE_FLAG_POLL simply? If user wants to
enable it, let's do it for them. And bio driver can start with default poll
state by checking underlying queues.


Thanks,
Ming

--
dm-devel mailing list
dm-devel@redhat.com
https://listman.redhat.com/mailman/listinfo/dm-devel


  reply	other threads:[~2021-04-15  7:43 UTC|newest]

Thread overview: 92+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-04-01  2:19 [PATCH V5 00/12] block: support bio based io polling Ming Lei
2021-04-01  2:19 ` [dm-devel] " Ming Lei
2021-04-01  2:19 ` [PATCH V5 01/12] block: add helper of blk_queue_poll Ming Lei
2021-04-01  2:19   ` [dm-devel] " Ming Lei
2021-04-01  2:19 ` [PATCH V5 02/12] block: add one helper to free io_context Ming Lei
2021-04-01  2:19   ` [dm-devel] " Ming Lei
2021-04-01  2:19 ` [PATCH V5 03/12] block: create io poll context for submission and poll task Ming Lei
2021-04-01  2:19   ` [dm-devel] " Ming Lei
2021-04-12 10:19   ` Christoph Hellwig
2021-04-12 10:19     ` [dm-devel] " Christoph Hellwig
2021-04-01  2:19 ` [dm-devel] [PATCH V5 04/12] block: add req flag of REQ_POLL_CTX Ming Lei
2021-04-01  2:19   ` Ming Lei
2021-04-01  2:19 ` [dm-devel] [PATCH V5 05/12] block: add new field into 'struct bvec_iter' Ming Lei
2021-04-01  2:19   ` Ming Lei
2021-04-12  9:26   ` Christoph Hellwig
2021-04-12  9:26     ` [dm-devel] " Christoph Hellwig
2021-04-13  9:36     ` Ming Lei
2021-04-13  9:36       ` [dm-devel] " Ming Lei
2021-04-01  2:19 ` [dm-devel] [PATCH V5 06/12] block/mq: extract one helper function polling hw queue Ming Lei
2021-04-01  2:19   ` Ming Lei
2021-04-12  9:29   ` Christoph Hellwig
2021-04-12  9:29     ` [dm-devel] " Christoph Hellwig
2021-04-01  2:19 ` [dm-devel] [PATCH V5 07/12] block: prepare for supporting bio_list via other link Ming Lei
2021-04-01  2:19   ` Ming Lei
2021-04-12 10:18   ` Christoph Hellwig
2021-04-12 10:18     ` [dm-devel] " Christoph Hellwig
2021-04-12 11:37     ` Ming Lei
2021-04-12 11:37       ` [dm-devel] " Ming Lei
2021-04-01  2:19 ` [dm-devel] [PATCH V5 08/12] block: use per-task poll context to implement bio based io polling Ming Lei
2021-04-01  2:19   ` Ming Lei
2021-04-12  9:54   ` [dm-devel] " Christoph Hellwig
2021-04-12  9:54     ` Christoph Hellwig
2021-04-12 10:20     ` Ming Lei
2021-04-12 10:20       ` [dm-devel] " Ming Lei
2021-04-12 10:29       ` Christoph Hellwig
2021-04-12 10:29         ` [dm-devel] " Christoph Hellwig
2021-04-12 11:42         ` Ming Lei
2021-04-12 11:42           ` [dm-devel] " Ming Lei
2021-04-12 10:16   ` Christoph Hellwig
2021-04-12 10:16     ` [dm-devel] " Christoph Hellwig
2021-04-12 10:37     ` Ming Lei
2021-04-12 10:37       ` [dm-devel] " Ming Lei
2021-04-01  2:19 ` [PATCH V5 09/12] blk-mq: limit hw queues to be polled in each blk_poll() Ming Lei
2021-04-01  2:19   ` [dm-devel] " Ming Lei
2021-04-01  2:19 ` [PATCH V5 10/12] block: add queue_to_disk() to get gendisk from request_queue Ming Lei
2021-04-01  2:19   ` [dm-devel] " Ming Lei
2021-04-12 12:52   ` Jens Axboe
2021-04-12 12:52     ` [dm-devel] " Jens Axboe
2021-04-01  2:19 ` [PATCH V5 11/12] block: add poll_capable method to support bio-based IO polling Ming Lei
2021-04-01  2:19   ` [dm-devel] " Ming Lei
2021-04-12  9:38   ` Christoph Hellwig
2021-04-12  9:38     ` Christoph Hellwig
2021-04-14  8:38     ` JeffleXu
2021-04-14  8:38       ` [dm-devel] " JeffleXu
2021-04-14 11:24       ` Ming Lei
2021-04-14 11:24         ` Ming Lei
2021-04-15  1:34         ` JeffleXu
2021-04-15  1:34           ` [dm-devel] " JeffleXu
2021-04-15  7:43           ` Ming Lei [this message]
2021-04-15  7:43             ` Ming Lei
2021-04-15  9:21             ` JeffleXu
2021-04-15  9:21               ` [dm-devel] " JeffleXu
2021-04-15 10:06               ` Ming Lei
2021-04-15 10:06                 ` [dm-devel] " Ming Lei
2021-04-15 11:21                 ` JeffleXu
2021-04-15 11:21                   ` [dm-devel] " JeffleXu
2021-04-15 13:08                   ` Ming Lei
2021-04-15 13:08                     ` [dm-devel] " Ming Lei
2021-04-16  8:00   ` [PATCH] block: introduce QUEUE_FLAG_POLL_CAP flag Jeffle Xu
2021-04-16  8:00     ` [dm-devel] " Jeffle Xu
2021-04-16  8:42     ` JeffleXu
2021-04-16  8:42       ` [dm-devel] " JeffleXu
2021-04-16  9:07     ` Ming Lei
2021-04-16  9:07       ` [dm-devel] " Ming Lei
2021-04-16 10:20       ` JeffleXu
2021-04-16 10:20         ` [dm-devel] " JeffleXu
2021-04-17 14:06       ` JeffleXu
2021-04-17 14:06         ` [dm-devel] " JeffleXu
2021-04-19  2:21         ` Ming Lei
2021-04-19  2:21           ` [dm-devel] " Ming Lei
2021-04-19  5:40           ` JeffleXu
2021-04-19  5:40             ` [dm-devel] " JeffleXu
2021-04-19 13:36             ` Ming Lei
2021-04-19 13:36               ` [dm-devel] " Ming Lei
2021-04-20  7:25               ` JeffleXu
2021-04-20  7:25                 ` [dm-devel] " JeffleXu
2021-04-01  2:19 ` [dm-devel] [PATCH V5 12/12] dm: support IO polling for bio-based dm device Ming Lei
2021-04-01  2:19   ` Ming Lei
2021-04-09 15:39 ` [PATCH V5 00/12] block: support bio based io polling Ming Lei
2021-04-09 15:39   ` [dm-devel] " Ming Lei
2021-04-12  9:46 ` Christoph Hellwig
2021-04-12  9:46   ` Christoph Hellwig

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=YHfumsTKHuvPGp47@T590 \
    --to=ming.lei@redhat.com \
    --cc=axboe@kernel.dk \
    --cc=dm-devel@redhat.com \
    --cc=hare@suse.de \
    --cc=hch@infradead.org \
    --cc=jefflexu@linux.alibaba.com \
    --cc=linux-block@vger.kernel.org \
    --cc=snitzer@redhat.com \
    /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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.