From: sagig@dev.mellanox.co.il (Sagi Grimberg)
Subject: [PATCH 3/3] block: Refuse adding appending a gapped integrity page to a bio
Date: Wed, 2 Sep 2015 11:04:52 +0300 [thread overview]
Message-ID: <55E6ADA4.5040905@dev.mellanox.co.il> (raw)
In-Reply-To: <20150819104246.GA4956@infradead.org>
On 8/19/2015 1:42 PM, Christoph Hellwig wrote:
> On Wed, Aug 19, 2015@01:30:56PM +0300, Sagi Grimberg wrote:
>> Actually I didn't. I started to, but then I noticed that
>> I was still seeing gaps when using cfq (e.g. non-mq code
>> path), I assume that this was never tested?
>
> It probably wasn't. The only user so far is the NVMe driver which
> is blk-mq only.
So I got back to have a look on this. I originally thought that
this issue was specific to io schedulers, but I don't think it is
anymore, its just easier to trigger with io schedulers.
It seems we are only protecting against gapped back merges (i.e.
appending a gapped bio to a request biotail) but we are not protecting
against front merges (i.e. adding a gapped bio to request as the bio
head).
Imagine we have two bio_vec elements and the queue boundary is 0xfff:
req_bvec: offset=0xe00 length=0x200
bio_bvec: offset=0x0 length=0x200
bvec_gap_to_prev() will allow back merging {req_bvec, bio_bvec} as
bio_vec->offset=0x0 and req_bvec->offset + req_bvec->length is aligned
to the queue boundary, but the problem is we might do a front merge
{bio_bvec, req_bvec} which gives us a gap.
I'm able to reproduce this with iser with 512B sequential reads
(encourage gapped merges) but I wonder how this issue was missed in
nvme (the code seem to allow front merges)?
Anyway, the patch below seems to solved the issue for me:
Comments?
--
commit 100383e208045368b4e3ac20e3fa46bdad966df2
Author: Sagi Grimberg <sagig at mellanox.com>
Date: Wed Sep 2 01:31:39 2015 +0300
block: Protect against front merges with gaps
We seem to have missed gaps detection on front merges.
Introduce req_gap_to_next call that is should detect
a gap in a front merge.
Signed-off-by: Sagi Grimberg <sagig at mellanox.com>
diff --git a/block/blk-merge.c b/block/blk-merge.c
index 09bf5cb..c95152a 100644
--- a/block/blk-merge.c
+++ b/block/blk-merge.c
@@ -327,9 +327,20 @@ int ll_back_merge_fn(struct request_queue *q,
struct request *req,
return ll_new_hw_segment(q, req, bio);
}
+static int req_gap_to_next(struct request *req, struct bio *bio)
+{
+ struct bio *next = req->bio;
+
+ return bvec_gap_to_prev(req->q, &bio->bi_io_vec[bio->bi_vcnt - 1],
+ next->bi_io_vec[0].bv_offset);
+}
+
int ll_front_merge_fn(struct request_queue *q, struct request *req,
struct bio *bio)
{
+ if (req_gap_to_next(req, bio))
+ return 0;
+
if (blk_rq_sectors(req) + bio_sectors(bio) >
blk_rq_get_max_sectors(req)) {
req->cmd_flags |= REQ_NOMERGE;
--
next prev parent reply other threads:[~2015-09-02 8: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 [this message]
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
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=55E6ADA4.5040905@dev.mellanox.co.il \
--to=sagig@dev.mellanox.co.il \
/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.