Patch "block: make sure a big bio is split into at most 256 bvecs" has been added to the 4.7-stable tree
Subsystems (2)
This is a note to let you know that I've just added the patch titled
block: make sure a big bio is split into at most 256 bvecs
to the 4.7-stable tree which can be found at:
http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary
The filename of the patch is:
block-make-sure-a-big-bio-is-split-into-at-most-256-bvecs.patch
and it can be found in the queue-4.7 subdirectory.
If you, or anyone else, feels it should not be added to the stable tree, please let <[email protected]> know about it.
Quoted 1 line
From
4d70dca4eadf2f95abe389116ac02b8439c2d16cMon Sep 17 00:00:00 2001
From: Ming Lei <[email protected]>
Date: Tue, 23 Aug 2016 21:49:45 +0800
Subject: block: make sure a big bio is split into at most 256 bvecs
From: Ming Lei <[email protected]>
commit 4d70dca4eadf2f95abe389116ac02b8439c2d16c upstream.
After arbitrary bio size was introduced, the incoming bio may be very big. We have to split the bio into small bios so that each holds at most BIO_MAX_PAGES bvecs for safety reason, such as bio_clone().
This patch fixes the following kernel crash:
Quoted 5 lines
[ 172.660142] BUG: unable to handle kernel NULL pointer dereference at 0000000000000028 [ 172.660229] IP: [<ffffffff811e53b4>] bio_trim+0xf/0x2a [ 172.660289] PGD 7faf3e067 PUD 7f9279067 PMD 0 [ 172.660399] Oops: 0000 [#1] SMP[...]
Quoted 8 lines
[ 172.664780] Call Trace: [ 172.664813] [<ffffffffa007f3be>] ? raid1_make_request+0x2e8/0xad7 [raid1] [ 172.664846] [<ffffffff811f07da>] ? blk_queue_split+0x377/0x3d4 [ 172.664880] [<ffffffffa005fb5f>] ? md_make_request+0xf6/0x1e9 [md_mod] [ 172.664912] [<ffffffff811eb860>] ? generic_make_request+0xb5/0x155 [ 172.664947] [<ffffffffa0445c89>] ? prio_io+0x85/0x95 [bcache] [ 172.664981] [<ffffffffa0448252>] ? register_cache_set+0x355/0x8d0 [bcache] [ 172.665016] [<ffffffffa04497d3>] ? register_bcache+0x1006/0x1174 [bcache]
The issue can be reproduced by the following steps:
- create one raid1 over two virtio-blk
- build bcache device over the above raid1 and another cache device and bucket size is set as 2Mbytes
- set cache mode as writeback
- run random write over ext4 on the bcache device
--- block/blk-merge.c | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+)
block/blk-merge.c +22 -0
@@ -94,9 +94,31 @@ static struct bio *blk_bio_segment_splitbool do_split = true;struct bio *new =NULL ;const unsigned max_sectors =get_max_io_size (q, bio); +unsigned bvecs =0 ;bio_for_each_segment (bv, bio, iter) {/* +* With arbitrary bio size, the incoming bio may be very +* big. We have to split the bio into small bios so that +* each holds at most BIO_MAX_PAGES bvecs because +* bio_clone() can fail to allocate big bvecs. +* +* It should have been better to apply the limit per +* request queue in which bio_clone() is involved, +* instead of globally. The biggest blocker is the +* bio_clone() in bio bounce. +* +* If bio is splitted by this reason, we should have +* allowed to continue bios merging, but don't do +* that now for making the change simple. +* +* TODO: deal with bio bounce's bio_clone() gracefully +* and convert the global limit into per-queue limit. +*/ +if (bvecs++ >=BIO_MAX_PAGES ) + goto split; + +/* * If the queue doesn't support SG gaps and adding this * offset would create a gap, disallow it. */
Patches currently in stable-queue which might be from [email protected] are
queue-4.7/block-make-sure-a-big-bio-is-split-into-at-most-256-bvecs.patch