Message ID | 20170626121034.3051-17-ming.lei@redhat.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
On Mon, Jun 26, 2017 at 08:09:59PM +0800, Ming Lei wrote: > bio_for_each_segment_all(bvec, bio, i) { > - org_vec = bio_orig->bi_io_vec + i + start; > - > - if (bvec->bv_page == org_vec->bv_page) > - continue; > + orig_vec = bio_iter_iovec(bio_orig, orig_iter); > + if (bvec->bv_page == orig_vec.bv_page) > + goto next; > > dec_zone_page_state(bvec->bv_page, NR_BOUNCE); > mempool_free(bvec->bv_page, pool); > + next: > + bio_advance_iter(bio_orig, &orig_iter, orig_vec.bv_len); > } > I think this might be written more clearly as: bio_for_each_segment_all(bvec, bio, i) { orig_vec = bio_iter_iovec(bio_orig, orig_iter); if (bvec->bv_page != orig_vec.bv_page) { dec_zone_page_state(bvec->bv_page, NR_BOUNCE); mempool_free(bvec->bv_page, pool); } bio_advance_iter(bio_orig, &orig_iter, orig_vec.bv_len); } What do you think?
On Mon, Jun 26, 2017 at 11:12:11PM -0700, Matthew Wilcox wrote: > On Mon, Jun 26, 2017 at 08:09:59PM +0800, Ming Lei wrote: > > bio_for_each_segment_all(bvec, bio, i) { > > - org_vec = bio_orig->bi_io_vec + i + start; > > - > > - if (bvec->bv_page == org_vec->bv_page) > > - continue; > > + orig_vec = bio_iter_iovec(bio_orig, orig_iter); > > + if (bvec->bv_page == orig_vec.bv_page) > > + goto next; > > > > dec_zone_page_state(bvec->bv_page, NR_BOUNCE); > > mempool_free(bvec->bv_page, pool); > > + next: > > + bio_advance_iter(bio_orig, &orig_iter, orig_vec.bv_len); > > } > > > > I think this might be written more clearly as: > > bio_for_each_segment_all(bvec, bio, i) { > orig_vec = bio_iter_iovec(bio_orig, orig_iter); > if (bvec->bv_page != orig_vec.bv_page) { > dec_zone_page_state(bvec->bv_page, NR_BOUNCE); > mempool_free(bvec->bv_page, pool); > } > bio_advance_iter(bio_orig, &orig_iter, orig_vec.bv_len); > } > > What do you think? Yeah, looks the above code is more clean, will do it in V3. thanks, Ming
diff --git a/block/bounce.c b/block/bounce.c index 916ee9a9a216..4eea1b2d8618 100644 --- a/block/bounce.c +++ b/block/bounce.c @@ -135,21 +135,22 @@ static void copy_to_high_bio_irq(struct bio *to, struct bio *from) static void bounce_end_io(struct bio *bio, mempool_t *pool) { struct bio *bio_orig = bio->bi_private; - struct bio_vec *bvec, *org_vec; + struct bio_vec *bvec, orig_vec; int i; - int start = bio_orig->bi_iter.bi_idx; + struct bvec_iter orig_iter = bio_orig->bi_iter; /* * free up bounce indirect pages used */ bio_for_each_segment_all(bvec, bio, i) { - org_vec = bio_orig->bi_io_vec + i + start; - - if (bvec->bv_page == org_vec->bv_page) - continue; + orig_vec = bio_iter_iovec(bio_orig, orig_iter); + if (bvec->bv_page == orig_vec.bv_page) + goto next; dec_zone_page_state(bvec->bv_page, NR_BOUNCE); mempool_free(bvec->bv_page, pool); + next: + bio_advance_iter(bio_orig, &orig_iter, orig_vec.bv_len); } bio_orig->bi_status = bio->bi_status;
We will support multipage bvecs in the future, so change to iterator way for getting bv_page of bvec from original bio. Signed-off-by: Ming Lei <ming.lei@redhat.com> --- block/bounce.c | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-)