diff options
author | Christoph Hellwig <hch@lst.de> | 2019-04-11 02:23:27 -0400 |
---|---|---|
committer | Jens Axboe <axboe@kernel.dk> | 2019-04-12 11:06:36 -0400 |
commit | 8a96a0e408102fb7aa73d8aa0b5e2219cfd51e55 (patch) | |
tree | a62d8c0f583ee464e40b5a41fae7cd4b891b7f31 /block/blk-merge.c | |
parent | 22391ac30ab9cc2ba610bf7ea2244840b83c8017 (diff) |
block: rewrite blk_bvec_map_sg to avoid a nth_page call
The offset in scatterlists is allowed to be larger than the page size,
so don't go to great length to avoid that case and simplify the
arithmetics.
Signed-off-by: Christoph Hellwig <hch@lst.de>
Reviewed-by: Bart Van Assche <bvanassche@acm.org>
Reviewed-by: Ming Lei <ming.lei@redhat.com>
Reviewed-by: Johannes Thumshirn <jthumshirn@suse.de>
Signed-off-by: Jens Axboe <axboe@kernel.dk>
Diffstat (limited to 'block/blk-merge.c')
-rw-r--r-- | block/blk-merge.c | 21 |
1 files changed, 6 insertions, 15 deletions
diff --git a/block/blk-merge.c b/block/blk-merge.c index 895795cdb145..247b17f2a0f6 100644 --- a/block/blk-merge.c +++ b/block/blk-merge.c | |||
@@ -469,26 +469,17 @@ static unsigned blk_bvec_map_sg(struct request_queue *q, | |||
469 | struct scatterlist **sg) | 469 | struct scatterlist **sg) |
470 | { | 470 | { |
471 | unsigned nbytes = bvec->bv_len; | 471 | unsigned nbytes = bvec->bv_len; |
472 | unsigned nsegs = 0, total = 0, offset = 0; | 472 | unsigned nsegs = 0, total = 0; |
473 | 473 | ||
474 | while (nbytes > 0) { | 474 | while (nbytes > 0) { |
475 | unsigned seg_size; | 475 | unsigned offset = bvec->bv_offset + total; |
476 | struct page *pg; | 476 | unsigned len = min(get_max_segment_size(q, offset), nbytes); |
477 | unsigned idx; | ||
478 | 477 | ||
479 | *sg = blk_next_sg(sg, sglist); | 478 | *sg = blk_next_sg(sg, sglist); |
479 | sg_set_page(*sg, bvec->bv_page, len, offset); | ||
480 | 480 | ||
481 | seg_size = get_max_segment_size(q, bvec->bv_offset + total); | 481 | total += len; |
482 | seg_size = min(nbytes, seg_size); | 482 | nbytes -= len; |
483 | |||
484 | offset = (total + bvec->bv_offset) % PAGE_SIZE; | ||
485 | idx = (total + bvec->bv_offset) / PAGE_SIZE; | ||
486 | pg = bvec_nth_page(bvec->bv_page, idx); | ||
487 | |||
488 | sg_set_page(*sg, pg, seg_size, offset); | ||
489 | |||
490 | total += seg_size; | ||
491 | nbytes -= seg_size; | ||
492 | nsegs++; | 483 | nsegs++; |
493 | } | 484 | } |
494 | 485 | ||