From: axboe@kernel.dk (Jens Axboe)
Subject: [PATCH 3/3] block: Refuse adding appending a gapped integrity page to a bio
Date: Wed, 2 Sep 2015 12:03:30 -0600 [thread overview]
Message-ID: <55E739F2.2050006@kernel.dk> (raw)
In-Reply-To: <55E7324B.3060601@dev.mellanox.co.il>
On 09/02/2015 11:30 AM, Sagi Grimberg wrote:
> On 9/2/2015 5:37 PM, Jens Axboe wrote:
>> On 09/02/2015 02:04 AM, Sagi Grimberg wrote:
>>> 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?
>>
>> Weird, I guess front merging was overlooked when the initial patch was
>> added. Looks correct to me, and as far as I can see, we have now got all
>> bases covered.
>>
>> But there's room for some cleanup now, where we check is a bit of a
>> mess. If we kill the check in blk_rq_merge_ok() and only do them in the
>> front/back merge points (and the req-to-req case), then I think that
>> would be an improvement.
>
>
> Yea, we do get to checking back merges even for front merges in this
> point...
Yup
>> Does the below work for you?
>
> It's not on top of Keith virt_boundary patch right?
> First glance looks ok though.
Looks like I was on the wrong branch, master. Let me update it for post
that patch.
--
Jens Axboe
next prev parent reply other threads:[~2015-09-02 18:03 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 [this message]
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=55E739F2.2050006@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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).