Message ID | 20210608160603.1535935-15-hch@lst.de |
---|---|
State | Superseded |
Headers | show |
Series | [01/16] mm: use kmap_local_page in memzero_page | expand |
On Tue, Jun 08, 2021 at 06:06:01PM +0200, Christoph Hellwig wrote: > Rewrite the actual bounce buffering loop in __blk_queue_bounce to that > the memcpy_to_bvec helper can be used to perform the data copies. > > Signed-off-by: Christoph Hellwig <hch@lst.de> > --- > block/bounce.c | 21 +++++++-------------- > 1 file changed, 7 insertions(+), 14 deletions(-) > > diff --git a/block/bounce.c b/block/bounce.c > index a2fc6326b6c9..b5ad09e07bcf 100644 > --- a/block/bounce.c > +++ b/block/bounce.c > @@ -243,24 +243,17 @@ void __blk_queue_bounce(struct request_queue *q, struct bio **bio_orig) > * because the 'bio' is single-page bvec. > */ > for (i = 0, to = bio->bi_io_vec; i < bio->bi_vcnt; to++, i++) { > - struct page *page = to->bv_page; > + struct page *bounce_page; > > - if (!PageHighMem(page)) > + if (!PageHighMem(to->bv_page)) > continue; > > - to->bv_page = mempool_alloc(&page_pool, GFP_NOIO); > - inc_zone_page_state(to->bv_page, NR_BOUNCE); > + bounce_page = mempool_alloc(&page_pool, GFP_NOIO); > + inc_zone_page_state(bounce_page, NR_BOUNCE); > > - if (rw == WRITE) { > - char *vto, *vfrom; > - > - flush_dcache_page(page); > - > - vto = page_address(to->bv_page) + to->bv_offset; > - vfrom = kmap_atomic(page) + to->bv_offset; > - memcpy(vto, vfrom, to->bv_len); > - kunmap_atomic(vfrom); > - } > + if (rw == WRITE) > + memcpy_from_bvec(page_address(bounce_page), to); NIT: the fact that the copy is from 'to' makes my head hurt... But I don't see a good way to change that without declaring unnecessary variables... :-( The logic seems right. Ira > + to->bv_page = bounce_page; > } > > trace_block_bio_bounce(*bio_orig); > -- > 2.30.2 >
diff --git a/block/bounce.c b/block/bounce.c index a2fc6326b6c9..b5ad09e07bcf 100644 --- a/block/bounce.c +++ b/block/bounce.c @@ -243,24 +243,17 @@ void __blk_queue_bounce(struct request_queue *q, struct bio **bio_orig) * because the 'bio' is single-page bvec. */ for (i = 0, to = bio->bi_io_vec; i < bio->bi_vcnt; to++, i++) { - struct page *page = to->bv_page; + struct page *bounce_page; - if (!PageHighMem(page)) + if (!PageHighMem(to->bv_page)) continue; - to->bv_page = mempool_alloc(&page_pool, GFP_NOIO); - inc_zone_page_state(to->bv_page, NR_BOUNCE); + bounce_page = mempool_alloc(&page_pool, GFP_NOIO); + inc_zone_page_state(bounce_page, NR_BOUNCE); - if (rw == WRITE) { - char *vto, *vfrom; - - flush_dcache_page(page); - - vto = page_address(to->bv_page) + to->bv_offset; - vfrom = kmap_atomic(page) + to->bv_offset; - memcpy(vto, vfrom, to->bv_len); - kunmap_atomic(vfrom); - } + if (rw == WRITE) + memcpy_from_bvec(page_address(bounce_page), to); + to->bv_page = bounce_page; } trace_block_bio_bounce(*bio_orig);
Rewrite the actual bounce buffering loop in __blk_queue_bounce to that the memcpy_to_bvec helper can be used to perform the data copies. Signed-off-by: Christoph Hellwig <hch@lst.de> --- block/bounce.c | 21 +++++++-------------- 1 file changed, 7 insertions(+), 14 deletions(-)