From: Ming Lei <ming.lei@redhat.com>
To: "Matthew Wilcox (Oracle)" <willy@infradead.org>
Cc: Jens Axboe <axboe@kernel.dk>,
linux-block@vger.kernel.org, linux-kernel@vger.kernel.org,
Christoph Hellwig <hch@lst.de>
Subject: Re: [PATCH] block: Fix page_is_mergeable() for compound pages
Date: Tue, 18 Aug 2020 10:15:24 +0800 [thread overview]
Message-ID: <20200818021524.GA2505641@T590> (raw)
In-Reply-To: <20200817195206.15172-1-willy@infradead.org>
On Mon, Aug 17, 2020 at 08:52:06PM +0100, Matthew Wilcox (Oracle) wrote:
> If we pass in an offset which is larger than PAGE_SIZE, then
> page_is_mergeable() thinks it's not mergeable with the previous bio_vec,
> leading to a large number of bio_vecs being used. Use a slightly more
> obvious test that the two pages are compatible with each other.
>
> Signed-off-by: Matthew Wilcox (Oracle) <willy@infradead.org>
> Fixes: 52d52d1c98a9 ("block: only allow contiguous page structs in a bio_vec")
>
> ---
> block/bio.c | 10 +++++-----
> 1 file changed, 5 insertions(+), 5 deletions(-)
>
> diff --git a/block/bio.c b/block/bio.c
> index c63ba04bd629..a9931f23d933 100644
> --- a/block/bio.c
> +++ b/block/bio.c
> @@ -740,8 +740,8 @@ static inline bool page_is_mergeable(const struct bio_vec *bv,
> struct page *page, unsigned int len, unsigned int off,
> bool *same_page)
> {
> - phys_addr_t vec_end_addr = page_to_phys(bv->bv_page) +
> - bv->bv_offset + bv->bv_len - 1;
> + size_t bv_end = bv->bv_offset + bv->bv_len;
> + phys_addr_t vec_end_addr = page_to_phys(bv->bv_page) + bv_end - 1;
> phys_addr_t page_addr = page_to_phys(page);
>
> if (vec_end_addr + 1 != page_addr + off)
> @@ -750,9 +750,9 @@ static inline bool page_is_mergeable(const struct bio_vec *bv,
> return false;
>
> *same_page = ((vec_end_addr & PAGE_MASK) == page_addr);
> - if (!*same_page && pfn_to_page(PFN_DOWN(vec_end_addr)) + 1 != page)
> - return false;
> - return true;
> + if (*same_page)
> + return true;
> + return (bv->bv_page + bv_end / PAGE_SIZE) == (page + off / PAGE_SIZE);
Looks this way is more straightforward, meantime can cover compound
pages:
Reviewed-by: Ming Lei <ming.lei@redhat.com>
Thanks,
Ming
next prev parent reply other threads:[~2020-08-18 2:15 UTC|newest]
Thread overview: 3+ messages / expand[flat|nested] mbox.gz Atom feed top
2020-08-17 19:52 [PATCH] block: Fix page_is_mergeable() for compound pages Matthew Wilcox (Oracle)
2020-08-18 2:15 ` Ming Lei [this message]
2020-08-18 2:36 ` Jens Axboe
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=20200818021524.GA2505641@T590 \
--to=ming.lei@redhat.com \
--cc=axboe@kernel.dk \
--cc=hch@lst.de \
--cc=linux-block@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=willy@infradead.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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.