Re: [PATCH 12/15] block: switch polling to be bio based

Keith Busch
2021-05-12T22:12:58Z

On Wed, May 12, 2021 at 03:03:40PM -0700, Sagi Grimberg wrote:
> On 5/12/21 6:15 AM, Christoph Hellwig wrote:
> > + *
> > + * Note: the caller must either be the context that submitted @bio, or
> > + * be in a RCU critical section to prevent freeing of @bio.
> > + */
> > +int bio_poll(struct bio *bio, unsigned int flags)
> > +{
> > + struct request_queue *q = bio->bi_bdev->bd_disk->queue;
> > + blk_qc_t cookie = READ_ONCE(bio->bi_cookie);
> > +
> > + if (cookie == BLK_QC_T_NONE ||
> > + !test_bit(QUEUE_FLAG_POLL, &q->queue_flags))
> > + return 0;
> > +
> > + if (current->plug)
> > + blk_flush_plug_list(current->plug, false);
> > +
> > + /* not yet implemented, so this should not happen */
> > + if (WARN_ON_ONCE(!queue_is_mq(q)))
>
> What happens if the I/O wasn't (yet) queued to the bottom device
> (i.e. no available path in nvme-mpath)?
>
> In this case the disk would be the mpath device node (which is
> not mq...)

The bi_cookie should remain BLK_QC_T_NONE in that case, so we wouldn't
get to the warning. But if that does happen, it doesn't appear that
anyone is going to wake up thread that needs to poll for this bio's
completion when a path becomes available for dispatch. I think it would
make sense for nvme-mpath to just clear the REQ_POLLED flag if it
doesn't immediately have viable path.