All of lore.kernel.org
 help / color / mirror / Atom feed
From: axboe@kernel.dk (Jens Axboe)
Subject: [PATCH 3/3] block: Refuse adding appending a gapped integrity page to a bio
Date: Thu, 3 Sep 2015 09:04:47 -0600	[thread overview]
Message-ID: <20150903150447.GA24222@kernel.dk> (raw)
In-Reply-To: <55E80DD4.9000505@dev.mellanox.co.il>

On Thu, Sep 03 2015, Sagi Grimberg wrote:
> On 9/2/2015 10:18 PM, Jens Axboe wrote:
> >On Wed, Sep 02 2015, Sagi Grimberg wrote:
> >>>Does the below work for you?
> >>
> >>It's not on top of Keith virt_boundary patch right?
> >>First glance looks ok though.
> >
> >Updated for that.
> >
> 
> Thanks Jens,
> 
> I'll test it.

Cleaned up version, unified the gap checking and changed the names of
the function to make it easier to understand. And then we only need to
check bio_has_data() in bio_will_gap().

Functionally it should be identical to the previous one.


diff --git a/block/blk-merge.c b/block/blk-merge.c
index cce23ba1ae5f..bf9c45ddcd11 100644
--- a/block/blk-merge.c
+++ b/block/blk-merge.c
@@ -435,9 +435,31 @@ no_merge:
 	return 0;
 }
 
+static bool bio_will_gap(struct request_queue *q, struct bio *prev,
+			 struct bio *next)
+{
+	if (!bio_has_data(prev))
+		return false;
+
+	return bvec_gap_to_prev(q, &prev->bi_io_vec[prev->bi_vcnt - 1],
+				next->bi_io_vec[0].bv_offset);
+}
+
+static bool req_gap_back_merge(struct request *req, struct bio *next)
+{
+	return bio_will_gap(req->q, req->biotail, next);
+}
+
+static bool req_gap_front_merge(struct request *req, struct bio *bio)
+{
+	return bio_will_gap(req->q, bio, req->bio);
+}
+
 int ll_back_merge_fn(struct request_queue *q, struct request *req,
 		     struct bio *bio)
 {
+	if (req_gap_back_merge(req, bio))
+		return 0;
 	if (blk_rq_sectors(req) + bio_sectors(bio) >
 	    blk_rq_get_max_sectors(req)) {
 		req->cmd_flags |= REQ_NOMERGE;
@@ -456,6 +478,9 @@ int ll_back_merge_fn(struct request_queue *q, struct request *req,
 int ll_front_merge_fn(struct request_queue *q, struct request *req,
 		      struct bio *bio)
 {
+
+	if (req_gap_front_merge(req, bio))
+		return 0;
 	if (blk_rq_sectors(req) + bio_sectors(bio) >
 	    blk_rq_get_max_sectors(req)) {
 		req->cmd_flags |= REQ_NOMERGE;
@@ -482,14 +507,6 @@ static bool req_no_special_merge(struct request *req)
 	return !q->mq_ops && req->special;
 }
 
-static int req_gap_to_prev(struct request *req, struct bio *next)
-{
-	struct bio *prev = req->biotail;
-
-	return bvec_gap_to_prev(req->q, &prev->bi_io_vec[prev->bi_vcnt - 1],
-			next->bi_io_vec[0].bv_offset);
-}
-
 static int ll_merge_requests_fn(struct request_queue *q, struct request *req,
 				struct request *next)
 {
@@ -504,7 +521,7 @@ static int ll_merge_requests_fn(struct request_queue *q, struct request *req,
 	if (req_no_special_merge(req) || req_no_special_merge(next))
 		return 0;
 
-	if (req_gap_to_prev(req, next->bio))
+	if (req_gap_back_merge(req, next->bio))
 		return 0;
 
 	/*
@@ -712,10 +729,6 @@ bool blk_rq_merge_ok(struct request *rq, struct bio *bio)
 	    !blk_write_same_mergeable(rq->bio, bio))
 		return false;
 
-	/* Only check gaps if the bio carries data */
-	if (bio_has_data(bio) && req_gap_to_prev(rq, bio))
-		return false;
-
 	return true;
 }
 

-- 
Jens Axboe

  parent reply	other threads:[~2015-09-03 15:04 UTC|newest]

Thread overview: 29+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2015-07-15 13:19 [PATCH 0/3] Fixes for gapped scatters Sagi Grimberg
2015-07-15 13:19 ` [PATCH 1/3] block: copy multi iovec user mappings if QUEUE_FLAG_SG_GAPS is set Sagi Grimberg
2015-07-16 16:47   ` Keith Busch
2015-07-16 16:49     ` Jens Axboe
2015-07-16 19:47       ` Matthew Wilcox
2015-07-17 15:26         ` Jens Axboe
2015-07-17  7:44       ` Christoph Hellwig
2015-07-17  7:43     ` Christoph Hellwig
2015-07-15 13:19 ` [PATCH 2/3] block: Refuse request/bio merges with gaps in the integrity payload Sagi Grimberg
2015-07-15 13:19 ` [PATCH 3/3] block: Refuse adding appending a gapped integrity page to a bio Sagi Grimberg
2015-07-15 15:28   ` Jens Axboe
2015-07-16  9:26     ` Christoph Hellwig
2015-07-16 15:58       ` Jens Axboe
2015-07-19 15:18         ` Sagi Grimberg
2015-08-19  9:40           ` Christoph Hellwig
2015-08-19 10:30             ` Sagi Grimberg
2015-08-19 10:42               ` Christoph Hellwig
2015-09-02  8:04                 ` Sagi Grimberg
2015-09-02 14:37                   ` Jens Axboe
2015-09-02 17:30                     ` Sagi Grimberg
2015-09-02 18:03                       ` Jens Axboe
2015-09-02 19:18                       ` Jens Axboe
2015-09-03  9:07                         ` Sagi Grimberg
2015-09-03 14:53                           ` Jens Axboe
2015-09-03 15:04                           ` Jens Axboe [this message]
2015-09-03 15:41                             ` Sagi Grimberg
2015-09-03 15:52                               ` Jens Axboe
2015-07-17  1:50       ` Martin K. Petersen
2015-07-17  1:39 ` [PATCH 0/3] Fixes for gapped scatters Martin K. Petersen

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=20150903150447.GA24222@kernel.dk \
    --to=axboe@kernel.dk \
    /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.