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@xxxxxx> > --- > 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 >