mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2025-01-06 05:13:18 +00:00
block: avoid blk_bio_segment_split for small I/O operations
__blk_queue_split() adds significant overhead for small I/O operations. Add a shortcut to avoid it for cases where we know we never need to split. Based on a patch from Ming Lei. Signed-off-by: Christoph Hellwig <hch@lst.de> Signed-off-by: Jens Axboe <axboe@kernel.dk>
This commit is contained in:
parent
d2c9be89f8
commit
fa53228721
@ -293,7 +293,7 @@ static struct bio *blk_bio_segment_split(struct request_queue *q,
|
|||||||
void __blk_queue_split(struct request_queue *q, struct bio **bio,
|
void __blk_queue_split(struct request_queue *q, struct bio **bio,
|
||||||
unsigned int *nr_segs)
|
unsigned int *nr_segs)
|
||||||
{
|
{
|
||||||
struct bio *split;
|
struct bio *split = NULL;
|
||||||
|
|
||||||
switch (bio_op(*bio)) {
|
switch (bio_op(*bio)) {
|
||||||
case REQ_OP_DISCARD:
|
case REQ_OP_DISCARD:
|
||||||
@ -309,6 +309,20 @@ void __blk_queue_split(struct request_queue *q, struct bio **bio,
|
|||||||
nr_segs);
|
nr_segs);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
|
/*
|
||||||
|
* All drivers must accept single-segments bios that are <=
|
||||||
|
* PAGE_SIZE. This is a quick and dirty check that relies on
|
||||||
|
* the fact that 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 (!q->limits.chunk_sectors &&
|
||||||
|
(*bio)->bi_vcnt == 1 &&
|
||||||
|
(*bio)->bi_io_vec[0].bv_len <= PAGE_SIZE) {
|
||||||
|
*nr_segs = 1;
|
||||||
|
break;
|
||||||
|
}
|
||||||
split = blk_bio_segment_split(q, *bio, &q->bio_split, nr_segs);
|
split = blk_bio_segment_split(q, *bio, &q->bio_split, nr_segs);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user