Reapply "ANDROID: block: Add support for filesystem requests and small segments"
This reverts commit I764adf995cae6b485d4d98e410c78128a88647e0. Bug: 333812722 Bug: 308663717 Bug: 319125789 Change-Id: Ie7f03b9d1ab67a33ccbc4311ba26cd746e1aaa22 Signed-off-by: Bart Van Assche <bvanassche@acm.org> [jyescas@google.com: Call blk_segments() in blk_mq_submit_bio() for the case when request is defined or it is null] Signed-off-by: Juan Yescas <jyescas@google.com>
This commit is contained in:
parent
141ebdcb28
commit
24edb63b85
@ -285,7 +285,8 @@ static struct bio *bio_split_rw(struct bio *bio, struct queue_limits *lim,
|
|||||||
if (nsegs < lim->max_segments &&
|
if (nsegs < lim->max_segments &&
|
||||||
bytes + bv.bv_len <= max_bytes &&
|
bytes + bv.bv_len <= max_bytes &&
|
||||||
bv.bv_offset + bv.bv_len <= PAGE_SIZE) {
|
bv.bv_offset + bv.bv_len <= PAGE_SIZE) {
|
||||||
nsegs++;
|
/* single-page bvec optimization */
|
||||||
|
nsegs += blk_segments(lim, bv.bv_len);
|
||||||
bytes += bv.bv_len;
|
bytes += bv.bv_len;
|
||||||
} else {
|
} else {
|
||||||
if (bvec_split_segs(lim, &bv, &nsegs, &bytes,
|
if (bvec_split_segs(lim, &bv, &nsegs, &bytes,
|
||||||
@ -533,7 +534,10 @@ static int __blk_bios_map_sg(struct request_queue *q, struct bio *bio,
|
|||||||
__blk_segment_map_sg_merge(q, &bvec, &bvprv, sg))
|
__blk_segment_map_sg_merge(q, &bvec, &bvprv, sg))
|
||||||
goto next_bvec;
|
goto next_bvec;
|
||||||
|
|
||||||
if (bvec.bv_offset + bvec.bv_len <= PAGE_SIZE)
|
if (bvec.bv_offset + bvec.bv_len <= PAGE_SIZE &&
|
||||||
|
(!blk_queue_sub_page_limits(&q->limits) ||
|
||||||
|
bvec.bv_len <= q->limits.max_segment_size))
|
||||||
|
/* single-segment bvec optimization */
|
||||||
nsegs += __blk_bvec_map_sg(bvec, sglist, sg);
|
nsegs += __blk_bvec_map_sg(bvec, sglist, sg);
|
||||||
else
|
else
|
||||||
nsegs += blk_bvec_map_sg(q, &bvec, sglist, sg);
|
nsegs += blk_bvec_map_sg(q, &bvec, sglist, sg);
|
||||||
|
@ -2956,6 +2956,8 @@ void blk_mq_submit_bio(struct bio *bio)
|
|||||||
bio = __bio_split_to_limits(bio, &q->limits, &nr_segs);
|
bio = __bio_split_to_limits(bio, &q->limits, &nr_segs);
|
||||||
if (!bio)
|
if (!bio)
|
||||||
return;
|
return;
|
||||||
|
} else if (bio->bi_vcnt == 1) {
|
||||||
|
nr_segs = blk_segments(&q->limits, bio->bi_io_vec[0].bv_len);
|
||||||
}
|
}
|
||||||
if (!bio_integrity_prep(bio))
|
if (!bio_integrity_prep(bio))
|
||||||
return;
|
return;
|
||||||
@ -2971,6 +2973,8 @@ void blk_mq_submit_bio(struct bio *bio)
|
|||||||
bio = __bio_split_to_limits(bio, &q->limits, &nr_segs);
|
bio = __bio_split_to_limits(bio, &q->limits, &nr_segs);
|
||||||
if (!bio)
|
if (!bio)
|
||||||
goto fail;
|
goto fail;
|
||||||
|
} else if (bio->bi_vcnt == 1) {
|
||||||
|
nr_segs = blk_segments(&q->limits, bio->bi_io_vec[0].bv_len);
|
||||||
}
|
}
|
||||||
if (!bio_integrity_prep(bio))
|
if (!bio_integrity_prep(bio))
|
||||||
goto fail;
|
goto fail;
|
||||||
|
11
block/blk.h
11
block/blk.h
@ -337,13 +337,12 @@ static inline bool bio_may_exceed_limits(struct bio *bio,
|
|||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* All drivers must accept single-segments bios that are <= PAGE_SIZE.
|
* Check whether bio splitting should be performed. This check may
|
||||||
* This is a quick and dirty check that relies on the fact that
|
* trigger the bio splitting code even if splitting is not necessary.
|
||||||
* bi_io_vec[0] is always valid if a bio has data. The check might
|
|
||||||
* lead to occasional false negatives when bios are cloned, but compared
|
|
||||||
* to the performance impact of cloned bios themselves the loop below
|
|
||||||
* doesn't matter anyway.
|
|
||||||
*/
|
*/
|
||||||
|
if (blk_queue_sub_page_limits(lim) && bio->bi_io_vec &&
|
||||||
|
bio->bi_io_vec->bv_len > lim->max_segment_size)
|
||||||
|
return true;
|
||||||
return lim->chunk_sectors || bio->bi_vcnt != 1 ||
|
return lim->chunk_sectors || bio->bi_vcnt != 1 ||
|
||||||
bio->bi_io_vec->bv_len + bio->bi_io_vec->bv_offset > PAGE_SIZE;
|
bio->bi_io_vec->bv_len + bio->bi_io_vec->bv_offset > PAGE_SIZE;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user