Message ID | x49a7ka7qy9.fsf@segfault.boston.devel.redhat.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | block: clarify documentation for blk_{start|finish}_plug | expand |
On Tue, Jan 08, 2019 at 04:57:34PM -0500, Jeff Moyer wrote: > There was some confusion about what these functions did. Make it clear > that this is a hint for upper layers to pass to the block layer, and > that it does not guarantee that I/O will not be submitted between a > start and finish plug. > > Reported-by: "Darrick J. Wong" <darrick.wong@oracle.com> > Signed-off-by: Jeff Moyer <jmoyer@redhat.com> > > diff --git a/block/blk-core.c b/block/blk-core.c > index c78042975737..f2732f106a2e 100644 > --- a/block/blk-core.c > +++ b/block/blk-core.c > @@ -1683,6 +1683,15 @@ EXPORT_SYMBOL(kblockd_mod_delayed_work_on); > * @plug: The &struct blk_plug that needs to be initialized > * > * Description: > + * blk_start_plug() indicates to the block layer an intent by the caller > + * to submit multiple I/O requests in a batch. The block layer may use > + * this hint to defer submitting I/Os from the caller until blk_finish_plug() > + * is called. However, the block layer may choose to submit requests > + * before a call to blk_finish_plug() if the number of queued I/Os > + * exceeds %BLK_MAX_REQUEST_COUNT, or if the size of the I/O is larger than > + * %BLK_PLUG_FLUSH_SIZE. The queued I/Os may also be submitted early if > + * the task schedules (see below). Makes sense to my poor brain, Reviewed-by: Darrick J. Wong <darrick.wong@oracle.com> --D > * Tracking blk_plug inside the task_struct will help with auto-flushing the > * pending I/O should the task end up blocking between blk_start_plug() and > * blk_finish_plug(). This is important from a performance perspective, but > @@ -1765,6 +1774,16 @@ void blk_flush_plug_list(struct blk_plug *plug, bool from_schedule) > blk_mq_flush_plug_list(plug, from_schedule); > } > > +/** > + * blk_finish_plug - mark the end of a batch of submitted I/O > + * @plug: The &struct blk_plug passed to blk_start_plug() > + * > + * Description: > + * Indicate that a batch of I/O submissions is complete. This function > + * must be paired with an initial call to blk_start_plug(). The intent > + * is to allow the block layer to optimize I/O submission. See the > + * documentation for blk_start_plug() for more information. > + */ > void blk_finish_plug(struct blk_plug *plug) > { > if (plug != current->plug)
On Wed, Jan 9, 2019 at 5:59 AM Jeff Moyer <jmoyer@redhat.com> wrote: > > There was some confusion about what these functions did. Make it clear > that this is a hint for upper layers to pass to the block layer, and > that it does not guarantee that I/O will not be submitted between a > start and finish plug. > > Reported-by: "Darrick J. Wong" <darrick.wong@oracle.com> > Signed-off-by: Jeff Moyer <jmoyer@redhat.com> > > diff --git a/block/blk-core.c b/block/blk-core.c > index c78042975737..f2732f106a2e 100644 > --- a/block/blk-core.c > +++ b/block/blk-core.c > @@ -1683,6 +1683,15 @@ EXPORT_SYMBOL(kblockd_mod_delayed_work_on); > * @plug: The &struct blk_plug that needs to be initialized > * > * Description: > + * blk_start_plug() indicates to the block layer an intent by the caller > + * to submit multiple I/O requests in a batch. The block layer may use > + * this hint to defer submitting I/Os from the caller until blk_finish_plug() > + * is called. However, the block layer may choose to submit requests > + * before a call to blk_finish_plug() if the number of queued I/Os > + * exceeds %BLK_MAX_REQUEST_COUNT, or if the size of the I/O is larger than > + * %BLK_PLUG_FLUSH_SIZE. The queued I/Os may also be submitted early if > + * the task schedules (see below). > + * > * Tracking blk_plug inside the task_struct will help with auto-flushing the > * pending I/O should the task end up blocking between blk_start_plug() and > * blk_finish_plug(). This is important from a performance perspective, but > @@ -1765,6 +1774,16 @@ void blk_flush_plug_list(struct blk_plug *plug, bool from_schedule) > blk_mq_flush_plug_list(plug, from_schedule); > } > > +/** > + * blk_finish_plug - mark the end of a batch of submitted I/O > + * @plug: The &struct blk_plug passed to blk_start_plug() > + * > + * Description: > + * Indicate that a batch of I/O submissions is complete. This function > + * must be paired with an initial call to blk_start_plug(). The intent > + * is to allow the block layer to optimize I/O submission. See the > + * documentation for blk_start_plug() for more information. > + */ > void blk_finish_plug(struct blk_plug *plug) > { > if (plug != current->plug) Reviewed-by: Ming Lei <ming.lei@redhat.com> Thanks, Ming Lei
On 1/8/19 2:57 PM, Jeff Moyer wrote: > There was some confusion about what these functions did. Make it clear > that this is a hint for upper layers to pass to the block layer, and > that it does not guarantee that I/O will not be submitted between a > start and finish plug. Thanks Jeff, that's definitely an improvement, I like how it's phrased as intent, there are no guarantees and we can change things down the line as well (the auto-unplug threshold is a good example of that). Applied for 5.0.
diff --git a/block/blk-core.c b/block/blk-core.c index c78042975737..f2732f106a2e 100644 --- a/block/blk-core.c +++ b/block/blk-core.c @@ -1683,6 +1683,15 @@ EXPORT_SYMBOL(kblockd_mod_delayed_work_on); * @plug: The &struct blk_plug that needs to be initialized * * Description: + * blk_start_plug() indicates to the block layer an intent by the caller + * to submit multiple I/O requests in a batch. The block layer may use + * this hint to defer submitting I/Os from the caller until blk_finish_plug() + * is called. However, the block layer may choose to submit requests + * before a call to blk_finish_plug() if the number of queued I/Os + * exceeds %BLK_MAX_REQUEST_COUNT, or if the size of the I/O is larger than + * %BLK_PLUG_FLUSH_SIZE. The queued I/Os may also be submitted early if + * the task schedules (see below). + * * Tracking blk_plug inside the task_struct will help with auto-flushing the * pending I/O should the task end up blocking between blk_start_plug() and * blk_finish_plug(). This is important from a performance perspective, but @@ -1765,6 +1774,16 @@ void blk_flush_plug_list(struct blk_plug *plug, bool from_schedule) blk_mq_flush_plug_list(plug, from_schedule); } +/** + * blk_finish_plug - mark the end of a batch of submitted I/O + * @plug: The &struct blk_plug passed to blk_start_plug() + * + * Description: + * Indicate that a batch of I/O submissions is complete. This function + * must be paired with an initial call to blk_start_plug(). The intent + * is to allow the block layer to optimize I/O submission. See the + * documentation for blk_start_plug() for more information. + */ void blk_finish_plug(struct blk_plug *plug) { if (plug != current->plug)
There was some confusion about what these functions did. Make it clear that this is a hint for upper layers to pass to the block layer, and that it does not guarantee that I/O will not be submitted between a start and finish plug. Reported-by: "Darrick J. Wong" <darrick.wong@oracle.com> Signed-off-by: Jeff Moyer <jmoyer@redhat.com>