From: John Hubbard <jhubbard@nvidia.com>
To: Joao Martins <joao.m.martins@oracle.com>, <linux-mm@kvack.org>
Cc: <linux-kernel@vger.kernel.org>, <linux-rdma@vger.kernel.org>,
Andrew Morton <akpm@linux-foundation.org>,
Jason Gunthorpe <jgg@ziepe.ca>,
Doug Ledford <dledford@redhat.com>,
Matthew Wilcox <willy@infradead.org>
Subject: Re: [PATCH v2 1/4] mm/gup: add compound page list iterator
Date: Thu, 4 Feb 2021 20:11:46 -0800 [thread overview]
Message-ID: <74edd971-a80c-78b6-7ab2-5c1f6ba4ade9@nvidia.com> (raw)
In-Reply-To: <20210204202500.26474-2-joao.m.martins@oracle.com>
On 2/4/21 12:24 PM, Joao Martins wrote:
> Add an helper that iterates over head pages in a list of pages. It
> essentially counts the tails until the next page to process has a
> different head that the current. This is going to be used by
> unpin_user_pages() family of functions, to batch the head page refcount
> updates once for all passed consecutive tail pages.
>
> Suggested-by: Jason Gunthorpe <jgg@nvidia.com>
> Signed-off-by: Joao Martins <joao.m.martins@oracle.com>
> ---
> mm/gup.c | 29 +++++++++++++++++++++++++++++
> 1 file changed, 29 insertions(+)
>
> diff --git a/mm/gup.c b/mm/gup.c
> index d68bcb482b11..d1549c61c2f6 100644
> --- a/mm/gup.c
> +++ b/mm/gup.c
> @@ -215,6 +215,35 @@ void unpin_user_page(struct page *page)
> }
> EXPORT_SYMBOL(unpin_user_page);
>
> +static inline void compound_next(unsigned long i, unsigned long npages,
> + struct page **list, struct page **head,
> + unsigned int *ntails)
> +{
> + struct page *page;
> + unsigned int nr;
> +
> + if (i >= npages)
> + return;
> +
> + list += i;
> + npages -= i;
It is worth noting that this is slightly more complex to read than it needs to be.
You are changing both endpoints of a loop at once. That's hard to read for a human.
And you're only doing it in order to gain the small benefit of being able to
use nr directly at the end of the routine.
If instead you keep npages constant like it naturally wants to be, you could
just do a "(*ntails)++" in the loop, to take care of *ntails.
However, given that the patch is correct and works as-is, the above is really just
an optional idea, so please feel free to add:
Reviewed-by: John Hubbard <jhubbard@nvidia.com>
thanks,
--
John Hubbard
NVIDIA
> + page = compound_head(*list);
> +
> + for (nr = 1; nr < npages; nr++) {
> + if (compound_head(list[nr]) != page)
> + break;
> + }
> +
> + *head = page;
> + *ntails = nr;
> +}
> +
> +#define for_each_compound_head(__i, __list, __npages, __head, __ntails) \
> + for (__i = 0, \
> + compound_next(__i, __npages, __list, &(__head), &(__ntails)); \
> + __i < __npages; __i += __ntails, \
> + compound_next(__i, __npages, __list, &(__head), &(__ntails)))
> +
> /**
> * unpin_user_pages_dirty_lock() - release and optionally dirty gup-pinned pages
> * @pages: array of pages to be maybe marked dirty, and definitely released.
>
next prev parent reply other threads:[~2021-02-05 4:11 UTC|newest]
Thread overview: 10+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-02-04 20:24 [PATCH v2 0/4] mm/gup: page unpining improvements Joao Martins
2021-02-04 20:24 ` [PATCH v2 1/4] mm/gup: add compound page list iterator Joao Martins
2021-02-05 4:11 ` John Hubbard [this message]
2021-02-05 10:46 ` Joao Martins
2021-02-05 19:53 ` John Hubbard
2021-02-04 20:24 ` [PATCH v2 2/4] mm/gup: decrement head page once for group of subpages Joao Martins
2021-02-04 20:24 ` [PATCH v2 3/4] mm/gup: add a range variant of unpin_user_pages_dirty_lock() Joao Martins
2021-02-05 4:49 ` John Hubbard
2021-02-05 11:56 ` Joao Martins
2021-02-04 20:25 ` [PATCH v2 4/4] RDMA/umem: batch page unpin in __ib_umem_release() Joao Martins
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=74edd971-a80c-78b6-7ab2-5c1f6ba4ade9@nvidia.com \
--to=jhubbard@nvidia.com \
--cc=akpm@linux-foundation.org \
--cc=dledford@redhat.com \
--cc=jgg@ziepe.ca \
--cc=joao.m.martins@oracle.com \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-mm@kvack.org \
--cc=linux-rdma@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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox