From: Ming Lei <ming.lei@redhat.com>
To: Christoph Hellwig <hch@lst.de>
Cc: Jens Axboe <axboe@kernel.dk>, linux-block@vger.kernel.org
Subject: Re: [PATCH 4/5] block: change how we get page references in bio_iov_iter_get_pages
Date: Thu, 11 Apr 2019 15:36:09 +0800 [thread overview]
Message-ID: <20190411073608.GD421@ming.t460p> (raw)
In-Reply-To: <20190411062331.27800-5-hch@lst.de>
On Thu, Apr 11, 2019 at 08:23:30AM +0200, Christoph Hellwig wrote:
> Instead of needing a special macro to iterate over all pages in
> a bvec just do a second passs over the whole bio. This also matches
> what we do on the release side. The release side helper is moved
> up to where we need the get helper to clearly express the symmetry.
>
> Signed-off-by: Christoph Hellwig <hch@lst.de>
> ---
> block/bio.c | 51 ++++++++++++++++++++++----------------------
> include/linux/bvec.h | 5 -----
> 2 files changed, 25 insertions(+), 31 deletions(-)
>
> diff --git a/block/bio.c b/block/bio.c
> index c2a389b1509a..d3490aeb1a7e 100644
> --- a/block/bio.c
> +++ b/block/bio.c
> @@ -861,6 +861,26 @@ int bio_add_page(struct bio *bio, struct page *page,
> }
> EXPORT_SYMBOL(bio_add_page);
>
> +static void bio_get_pages(struct bio *bio)
> +{
> + struct bvec_iter_all iter_all;
> + struct bio_vec *bvec;
> + int i;
> +
> + bio_for_each_segment_all(bvec, bio, i, iter_all)
> + get_page(bvec->bv_page);
> +}
> +
> +static void bio_release_pages(struct bio *bio)
> +{
> + struct bvec_iter_all iter_all;
> + struct bio_vec *bvec;
> + int i;
> +
> + bio_for_each_segment_all(bvec, bio, i, iter_all)
> + put_page(bvec->bv_page);
> +}
> +
> static int __bio_iov_bvec_add_pages(struct bio *bio, struct iov_iter *iter)
> {
> const struct bio_vec *bv = iter->bvec;
> @@ -875,15 +895,6 @@ static int __bio_iov_bvec_add_pages(struct bio *bio, struct iov_iter *iter)
> bv->bv_offset + iter->iov_offset);
> if (unlikely(size != len))
> return -EINVAL;
> -
> - if (!bio_flagged(bio, BIO_NO_PAGE_REF)) {
> - struct page *page;
> - int i;
> -
> - mp_bvec_for_each_page(page, bv, i)
> - get_page(page);
> - }
> -
> iov_iter_advance(iter, size);
> return 0;
> }
> @@ -963,13 +974,6 @@ int bio_iov_iter_get_pages(struct bio *bio, struct iov_iter *iter)
> if (WARN_ON_ONCE(bio->bi_vcnt))
> return -EINVAL;
>
> - /*
> - * If this is a BVEC iter, then the pages are kernel pages. Don't
> - * release them on IO completion, if the caller asked us to.
> - */
> - if (is_bvec && iov_iter_bvec_no_ref(iter))
> - bio_set_flag(bio, BIO_NO_PAGE_REF);
> -
> do {
> if (is_bvec)
> ret = __bio_iov_bvec_add_pages(bio, iter);
> @@ -977,6 +981,11 @@ int bio_iov_iter_get_pages(struct bio *bio, struct iov_iter *iter)
> ret = __bio_iov_iter_get_pages(bio, iter);
> } while (!ret && iov_iter_count(iter) && !bio_full(bio));
>
> + if (iov_iter_bvec_no_ref(iter))
> + bio_set_flag(bio, BIO_NO_PAGE_REF);
> + else
> + bio_get_pages(bio);
> +
> return bio->bi_vcnt ? 0 : ret;
> }
>
> @@ -1670,16 +1679,6 @@ void bio_set_pages_dirty(struct bio *bio)
> }
> }
>
> -static void bio_release_pages(struct bio *bio)
> -{
> - struct bio_vec *bvec;
> - int i;
> - struct bvec_iter_all iter_all;
> -
> - bio_for_each_segment_all(bvec, bio, i, iter_all)
> - put_page(bvec->bv_page);
> -}
> -
> /*
> * bio_check_pages_dirty() will check that all the BIO's pages are still dirty.
> * If they are, then fine. If, however, some pages are clean then they must
> diff --git a/include/linux/bvec.h b/include/linux/bvec.h
> index f6275c4da13a..307bbda62b7b 100644
> --- a/include/linux/bvec.h
> +++ b/include/linux/bvec.h
> @@ -189,9 +189,4 @@ static inline void mp_bvec_last_segment(const struct bio_vec *bvec,
> }
> }
>
> -#define mp_bvec_for_each_page(pg, bv, i) \
> - for (i = (bv)->bv_offset / PAGE_SIZE; \
> - (i <= (((bv)->bv_offset + (bv)->bv_len - 1) / PAGE_SIZE)) && \
> - (pg = bvec_nth_page((bv)->bv_page, i)); i += 1)
> -
> #endif /* __LINUX_BVEC_ITER_H */
> --
> 2.20.1
>
Reviewed-by: Ming Lei <ming.lei@redhat.com>
--
Ming
next prev parent reply other threads:[~2019-04-11 7:36 UTC|newest]
Thread overview: 12+ messages / expand[flat|nested] mbox.gz Atom feed top
2019-04-11 6:23 avoid calling nth_page in the block I/O path v2 Christoph Hellwig
2019-04-11 6:23 ` [PATCH 1/5] block: rewrite blk_bvec_map_sg to avoid a nth_page call Christoph Hellwig
2019-04-11 6:23 ` [PATCH 2/5] block: refactor __bio_iov_bvec_add_pages Christoph Hellwig
2019-04-11 7:10 ` Ming Lei
2019-04-11 6:23 ` [PATCH 3/5] block: don't allow multiple bio_iov_iter_get_pages calls per bio Christoph Hellwig
2019-04-11 7:31 ` Ming Lei
2019-04-12 15:03 ` Bart Van Assche
2019-04-11 6:23 ` [PATCH 4/5] block: change how we get page references in bio_iov_iter_get_pages Christoph Hellwig
2019-04-11 7:36 ` Ming Lei [this message]
2019-04-11 6:23 ` [PATCH 5/5] block: only allow contiguous page structs in a bio_vec Christoph Hellwig
2019-04-12 15:15 ` avoid calling nth_page in the block I/O path v2 Jens Axboe
-- strict thread matches above, loose matches on Subject: below --
2019-04-08 10:46 avoid calling nth_page in the block I/O path Christoph Hellwig
2019-04-08 10:46 ` [PATCH 4/5] block: change how we get page references in bio_iov_iter_get_pages Christoph Hellwig
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20190411073608.GD421@ming.t460p \
--to=ming.lei@redhat.com \
--cc=axboe@kernel.dk \
--cc=hch@lst.de \
--cc=linux-block@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox