mm/gup: Increment the page refcount before the pincount
authorMatthew Wilcox (Oracle) <willy@infradead.org>
Fri, 4 Feb 2022 14:24:26 +0000 (09:24 -0500)
committerMatthew Wilcox (Oracle) <willy@infradead.org>
Mon, 21 Mar 2022 16:56:34 +0000 (12:56 -0400)
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>
Reviewed-by: John Hubbard <jhubbard@nvidia.com>
Reviewed-by: Christoph Hellwig <hch@lst.de>
mm/gup.c

index e54359e..eb7747b 100644 (file)
--- a/mm/gup.c
+++ b/mm/gup.c
@@ -213,25 +213,23 @@ bool __must_check try_grab_page(struct page *page, unsigned int flags)
        if (flags & FOLL_GET)
                return try_get_page(page);
        else if (flags & FOLL_PIN) {
-               int refs = 1;
-
                page = compound_head(page);
 
                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);
        }