All of lore.kernel.org
 help / color / mirror / Atom feed
From: tom.leiming@gmail.com (Ming Lei)
Subject: [PATCH for-4.4] block: split bios to max possible length
Date: Wed, 6 Jan 2016 17:46:39 +0800	[thread overview]
Message-ID: <20160106174639.65e0ced4@tom-T450> (raw)
In-Reply-To: <20160106055133.GA4868@localhost.localdomain>

On Wed, 6 Jan 2016 05:51:34 +0000
Keith Busch <keith.busch@intel.com> wrote:

> On Wed, Jan 06, 2016@10:17:51AM +0800, Ming Lei wrote:
> 
> But this patch was to split on stripe boundaries, which is an even worse
> penalty if we get the split wrong.
> 
> > +	bool no_sg_merge = !!test_bit(QUEUE_FLAG_NO_SG_MERGE, &q->queue_flags);
> >  
> >  	bio_for_each_segment(bv, bio, iter) {
> > -		if (sectors + (bv.bv_len >> 9) > blk_max_size_offset(q, bio->bi_iter.bi_sector))
> > +		if (no_sg_merge)
> > +			goto new_segment;
> 
> Bad idea for NVMe. We need to split on SG gaps, which you've skipped,
> or you will BUG_ON in the NVMe driver.

Given it is close to v4.4 release, I propose the following fix instead
of the bvec splitting approach, which is not ready in current block stack.

-----
 block/blk-merge.c | 10 +++++++++-
 1 file changed, 9 insertions(+), 1 deletion(-)

diff --git a/block/blk-merge.c b/block/blk-merge.c
index e73846a..9ffe431 100644
--- a/block/blk-merge.c
+++ b/block/blk-merge.c
@@ -81,8 +81,16 @@ static struct bio *blk_bio_segment_split(struct request_queue *q,
 	struct bio *new = NULL;
 
 	bio_for_each_segment(bv, bio, iter) {
-		if (sectors + (bv.bv_len >> 9) > blk_max_size_offset(q, bio->bi_iter.bi_sector))
+		if (sectors + (bv.bv_len >> 9) > blk_max_size_offset(q,
+					bio->bi_iter.bi_sector)) {
+			/*
+			 * avoid to split out zero length bio if size to
+			 * chunk boundary is too small
+			 */
+			if (!sectors)
+				goto new_segment;
 			goto split;
+		}
 
 		/*
 		 * If the queue doesn't support SG gaps and adding this
-- 
1.9.1

      parent reply	other threads:[~2016-01-06  9:46 UTC|newest]

Thread overview: 15+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2016-01-04 18:24 [PATCH for-4.4] block: split bios to max possible length Keith Busch
2016-01-05  4:54 ` Ming Lei
2016-01-05 15:09   ` Keith Busch
2016-01-06  2:17     ` Ming Lei
2016-01-06  5:51       ` Keith Busch
2016-01-06  6:29         ` Ming Lei
2016-01-06  6:53           ` Ming Lei
2016-01-06 15:18             ` Keith Busch
2016-01-06 15:43               ` Ming Lei
2016-01-06 16:21                 ` Keith Busch
2016-01-07  0:14                   ` Ming Lei
2016-01-07 10:46                   ` Kent Overstreet
2016-01-09 11:10                     ` Ming Lei
2016-01-06 15:29           ` Keith Busch
2016-01-06  9:46         ` Ming Lei [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=20160106174639.65e0ced4@tom-T450 \
    --to=tom.leiming@gmail.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.