diff mbox series

[01/75] mm/gup: Increment the page refcount before the pincount

Message ID 20220204195852.1751729-2-willy@infradead.org (mailing list archive)
State New
Headers show
Series MM folio patches for 5.18 | expand

Commit Message

Matthew Wilcox Feb. 4, 2022, 7:57 p.m. UTC
We should always increase the refcount before doing anything else to
the page so that other page users see the elevated refcount first.

Signed-off-by: Matthew Wilcox (Oracle) <willy@infradead.org>
---
 mm/gup.c | 12 ++++++------
 1 file changed, 6 insertions(+), 6 deletions(-)

Comments

John Hubbard Feb. 4, 2022, 9:13 p.m. UTC | #1
On 2/4/22 11:57, Matthew Wilcox (Oracle) wrote:
> We should always increase the refcount before doing anything else to
> the page so that other page users see the elevated refcount first.

Absolutely agree in principle. Is there anything else to say, though,
such as why this matters here? Or is the change just being done for
"best practices"? (Which is still a very solid reason, of course.)
> 
> Signed-off-by: Matthew Wilcox (Oracle) <willy@infradead.org>
> ---
>   mm/gup.c | 12 ++++++------
>   1 file changed, 6 insertions(+), 6 deletions(-)
> 
> diff --git a/mm/gup.c b/mm/gup.c
> index a9d4d724aef7..08020987dfc0 100644
> --- a/mm/gup.c
> +++ b/mm/gup.c
> @@ -220,18 +220,18 @@ bool __must_check try_grab_page(struct page *page, unsigned int flags)
>   		if (WARN_ON_ONCE(page_ref_count(page) <= 0))
>   			return false;
>   
> -		if (hpage_pincount_available(page))
> -			hpage_pincount_add(page, 1);
> -		else
> -			refs = GUP_PIN_COUNTING_BIAS;
> -
>   		/*
>   		 * Similar to try_grab_compound_head(): even if using the
>   		 * hpage_pincount_add/_sub() routines, be sure to
>   		 * *also* increment the normal page refcount field at least
>   		 * once, so that the page really is pinned.
>   		 */
> -		page_ref_add(page, refs);

A fine point: this hunk removes the last use of "refs", which means that
this patch will lead to an unused variable warning. So I think it would
be best to remove the "int refs = 1;" line in this patch, rather than
waiting until patch #10.

With that change, please feel free to add:

Reviewed-by: John Hubbard <jhubbard@nvidia.com>


thanks,
Matthew Wilcox Feb. 4, 2022, 9:28 p.m. UTC | #2
On Fri, Feb 04, 2022 at 01:13:29PM -0800, John Hubbard wrote:
> On 2/4/22 11:57, Matthew Wilcox (Oracle) wrote:
> > We should always increase the refcount before doing anything else to
> > the page so that other page users see the elevated refcount first.
> 
> Absolutely agree in principle. Is there anything else to say, though,
> such as why this matters here? Or is the change just being done for
> "best practices"? (Which is still a very solid reason, of course.)

I'm not sure if any software examines both refcount and pincount to
determine whether it knows what all of the refcounts to a page mean,
but a human might.  If someone else calls dump_page() after we update
pincount and before we update refcount, we might make a bad decision
while debugging.  When the updates are the other way around, a spurious
extra refcount is to be expected and should not confuse anyone more than
they already are.

> > Signed-off-by: Matthew Wilcox (Oracle) <willy@infradead.org>
> > ---
> >   mm/gup.c | 12 ++++++------
> >   1 file changed, 6 insertions(+), 6 deletions(-)
> > 
> > diff --git a/mm/gup.c b/mm/gup.c
> > index a9d4d724aef7..08020987dfc0 100644
> > --- a/mm/gup.c
> > +++ b/mm/gup.c
> > @@ -220,18 +220,18 @@ bool __must_check try_grab_page(struct page *page, unsigned int flags)
> >   		if (WARN_ON_ONCE(page_ref_count(page) <= 0))
> >   			return false;
> > -		if (hpage_pincount_available(page))
> > -			hpage_pincount_add(page, 1);
> > -		else
> > -			refs = GUP_PIN_COUNTING_BIAS;
> > -
> >   		/*
> >   		 * Similar to try_grab_compound_head(): even if using the
> >   		 * hpage_pincount_add/_sub() routines, be sure to
> >   		 * *also* increment the normal page refcount field at least
> >   		 * once, so that the page really is pinned.
> >   		 */
> > -		page_ref_add(page, refs);
> 
> A fine point: this hunk removes the last use of "refs", which means that
> this patch will lead to an unused variable warning. So I think it would
> be best to remove the "int refs = 1;" line in this patch, rather than
> waiting until patch #10.

Argh!  I noticed that I needed to do that, and then forgot to do it.
Thanks!

> With that change, please feel free to add:
> 
> Reviewed-by: John Hubbard <jhubbard@nvidia.com>

Added, and git tree updated.
Christoph Hellwig Feb. 7, 2022, 7:45 a.m. UTC | #3
Looks good, modulo the refs fixup:

Reviewed-by: Christoph Hellwig <hch@lst.de>
diff mbox series

Patch

diff --git a/mm/gup.c b/mm/gup.c
index a9d4d724aef7..08020987dfc0 100644
--- a/mm/gup.c
+++ b/mm/gup.c
@@ -220,18 +220,18 @@  bool __must_check try_grab_page(struct page *page, unsigned int flags)
 		if (WARN_ON_ONCE(page_ref_count(page) <= 0))
 			return false;
 
-		if (hpage_pincount_available(page))
-			hpage_pincount_add(page, 1);
-		else
-			refs = GUP_PIN_COUNTING_BIAS;
-
 		/*
 		 * Similar to try_grab_compound_head(): even if using the
 		 * hpage_pincount_add/_sub() routines, be sure to
 		 * *also* increment the normal page refcount field at least
 		 * once, so that the page really is pinned.
 		 */
-		page_ref_add(page, refs);
+		if (hpage_pincount_available(page)) {
+			page_ref_add(page, 1);
+			hpage_pincount_add(page, 1);
+		} else {
+			page_ref_add(page, GUP_PIN_COUNTING_BIAS);
+		}
 
 		mod_node_page_state(page_pgdat(page), NR_FOLL_PIN_ACQUIRED, 1);
 	}