I still haven't seen an explanation why this simple thing doesn't work just as well: diff --git a/block/blk-merge.c b/block/blk-merge.c index 48e6725b32ee..f3073700166f 100644 --- a/block/blk-merge.c +++ b/block/blk-merge.c @@ -309,6 +309,11 @@ void __blk_queue_split(struct request_queue *q, struct bio **bio, nr_segs); break; default: + if ((*bio)->bi_vcnt == 1 && + (*bio)->bi_io_vec[0].bv_len <= PAGE_SIZE) { + *nr_segs = 1; + return; + } split = blk_bio_segment_split(q, *bio, &q->bio_split, nr_segs); break; }