Message ID | 20151222052611.GA10487@xzibit.linux.bs1.fc.nec.co.jp |
---|---|
State | Not Applicable |
Delegated to: | David Miller |
Headers | show |
On 12/21/2015 10:26 PM, Junichi Nomura wrote: > On 12/22/15 12:59, Kent Overstreet wrote: >> reproduced it with 32 bit pae: >> >>> 1. Exclude memory above 4G line with boot param "max_addr=4G". >> >> doesn't work - max_addr=1G doesn't work either >> >>> 2. Disable highmem with "highmem=0". >> >> works! >> >>> 3. Try booting 64bit kernel. >> >> works > > blk_queue_bio() does split then bounce, which makes the segment > counting based on pages before bouncing and could go wrong. Good catch! The blk-mq parts aren't affected by this, the screw up only happened in the old IO path. I've added this with the appropriate tested-by from Artem, and CC stable and listed the commit that broke it: commit 54efd50bfd873e2dbf784e0b21a8027ba4299a3e Author: Kent Overstreet <kent.overstreet@gmail.com> Date: Thu Apr 23 22:37:18 2015 -0700 block: make generic_make_request handle arbitrarily sized bios Thanks to all involved in nailing this down, it'll go out shortly.
diff --git a/block/blk-core.c b/block/blk-core.c index 5131993b..1d1c3c7 100644 --- a/block/blk-core.c +++ b/block/blk-core.c @@ -1689,8 +1689,6 @@ static blk_qc_t blk_queue_bio(struct request_queue *q, struct bio *bio) struct request *req; unsigned int request_count = 0; - blk_queue_split(q, &bio, q->bio_split); - /* * low level driver can indicate that it wants pages above a * certain limit bounced to low memory (ie for highmem, or even @@ -1698,6 +1696,8 @@ static blk_qc_t blk_queue_bio(struct request_queue *q, struct bio *bio) */ blk_queue_bounce(q, &bio); + blk_queue_split(q, &bio, q->bio_split); + if (bio_integrity_enabled(bio) && bio_integrity_prep(bio)) { bio->bi_error = -EIO; bio_endio(bio);--