mm/gup: remove gup_fast_pgd_leaf() and clean up the relevant codes
authorBaoquan He <bhe@redhat.com>
Thu, 10 Apr 2025 03:57:16 +0000 (11:57 +0800)
committerAndrew Morton <akpm@linux-foundation.org>
Mon, 12 May 2025 00:48:31 +0000 (17:48 -0700)
In the current kernel, only pud huge page is supported in some
architectures.  P4d and pgd huge pages haven't been supported yet.  And in
mm/gup.c, there's no pgd huge page handling in the follow_page_mask() code
path.  Hence it doesn't make sense to only have gup_fast_pgd_leaf() in
gup_fast code path.

Here remove gup_fast_pgd_leaf() and clean up the relevant codes.

Link: https://lkml.kernel.org/r/20250410035717.473207-4-bhe@redhat.com
Signed-off-by: Baoquan He <bhe@redhat.com>
Reviewed-by: Oscar Salvador <osalvador@suse.de>
Acked-by: David Hildenbrand <david@redhat.com>
Cc: Yanjun.Zhu <yanjun.zhu@linux.dev>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
mm/gup.c

index eb668da933e1700f074ed0b436bb7274c44baa9d..77a5bc622567218e26c4bb9c201a1ebc6c5b469c 100644 (file)
--- a/mm/gup.c
+++ b/mm/gup.c
@@ -3172,46 +3172,6 @@ static int gup_fast_pud_leaf(pud_t orig, pud_t *pudp, unsigned long addr,
        return 1;
 }
 
-static int gup_fast_pgd_leaf(pgd_t orig, pgd_t *pgdp, unsigned long addr,
-               unsigned long end, unsigned int flags, struct page **pages,
-               int *nr)
-{
-       int refs;
-       struct page *page;
-       struct folio *folio;
-
-       if (!pgd_access_permitted(orig, flags & FOLL_WRITE))
-               return 0;
-
-       BUILD_BUG_ON(pgd_devmap(orig));
-
-       page = pgd_page(orig);
-       refs = record_subpages(page, PGDIR_SIZE, addr, end, pages + *nr);
-
-       folio = try_grab_folio_fast(page, refs, flags);
-       if (!folio)
-               return 0;
-
-       if (unlikely(pgd_val(orig) != pgd_val(*pgdp))) {
-               gup_put_folio(folio, refs, flags);
-               return 0;
-       }
-
-       if (!pgd_write(orig) && gup_must_unshare(NULL, flags, &folio->page)) {
-               gup_put_folio(folio, refs, flags);
-               return 0;
-       }
-
-       if (!gup_fast_folio_allowed(folio, flags)) {
-               gup_put_folio(folio, refs, flags);
-               return 0;
-       }
-
-       *nr += refs;
-       folio_set_referenced(folio);
-       return 1;
-}
-
 static int gup_fast_pmd_range(pud_t *pudp, pud_t pud, unsigned long addr,
                unsigned long end, unsigned int flags, struct page **pages,
                int *nr)
@@ -3306,12 +3266,9 @@ static void gup_fast_pgd_range(unsigned long addr, unsigned long end,
                next = pgd_addr_end(addr, end);
                if (pgd_none(pgd))
                        return;
-               if (unlikely(pgd_leaf(pgd))) {
-                       if (!gup_fast_pgd_leaf(pgd, pgdp, addr, next, flags,
-                                              pages, nr))
-                               return;
-               } else if (!gup_fast_p4d_range(pgdp, pgd, addr, next, flags,
-                                              pages, nr))
+               BUILD_BUG_ON(pgd_leaf(pgd));
+               if (!gup_fast_p4d_range(pgdp, pgd, addr, next, flags,
+                                       pages, nr))
                        return;
        } while (pgdp++, addr = next, addr != end);
 }