]> www.infradead.org Git - users/jedix/linux-maple.git/commitdiff
mm/huge_memory: convert split_huge_pages_pid() from follow_page() to folio_walk
authorDavid Hildenbrand <david@redhat.com>
Fri, 2 Aug 2024 15:55:20 +0000 (17:55 +0200)
committerAndrew Morton <akpm@linux-foundation.org>
Sat, 17 Aug 2024 00:52:51 +0000 (17:52 -0700)
Let's remove yet another follow_page() user.  Note that we have to do the
split without holding the PTL, after folio_walk_end().  We don't care
about losing the secretmem check in follow_page().

Link: https://lkml.kernel.org/r/20240802155524.517137-8-david@redhat.com
Signed-off-by: David Hildenbrand <david@redhat.com>
Reviewed-by: Zi Yan <ziy@nvidia.com>
Cc: Alexander Gordeev <agordeev@linux.ibm.com>
Cc: Christian Borntraeger <borntraeger@linux.ibm.com>
Cc: Claudio Imbrenda <imbrenda@linux.ibm.com>
Cc: Gerald Schaefer <gerald.schaefer@linux.ibm.com>
Cc: Heiko Carstens <hca@linux.ibm.com>
Cc: Janosch Frank <frankja@linux.ibm.com>
Cc: Jonathan Corbet <corbet@lwn.net>
Cc: Matthew Wilcox <willy@infradead.org>
Cc: Sven Schnelle <svens@linux.ibm.com>
Cc: Vasily Gorbik <gor@linux.ibm.com>
Cc: Ryan Roberts <ryan.roberts@arm.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
mm/huge_memory.c

index 29e76d285e4b5cbfa8dd31d1585050870a465139..fe4f8415edfd2505e04494568fb41187b4759efd 100644 (file)
@@ -40,6 +40,7 @@
 #include <linux/memory-tiers.h>
 #include <linux/compat.h>
 #include <linux/pgalloc_tag.h>
+#include <linux/pagewalk.h>
 
 #include <asm/tlb.h>
 #include <asm/pgalloc.h>
@@ -3504,7 +3505,7 @@ static int split_huge_pages_pid(int pid, unsigned long vaddr_start,
         */
        for (addr = vaddr_start; addr < vaddr_end; addr += PAGE_SIZE) {
                struct vm_area_struct *vma = vma_lookup(mm, addr);
-               struct page *page;
+               struct folio_walk fw;
                struct folio *folio;
 
                if (!vma)
@@ -3516,13 +3517,10 @@ static int split_huge_pages_pid(int pid, unsigned long vaddr_start,
                        continue;
                }
 
-               /* FOLL_DUMP to ignore special (like zero) pages */
-               page = follow_page(vma, addr, FOLL_GET | FOLL_DUMP);
-
-               if (IS_ERR_OR_NULL(page))
+               folio = folio_walk_start(&fw, vma, addr, 0);
+               if (!folio)
                        continue;
 
-               folio = page_folio(page);
                if (!is_transparent_hugepage(folio))
                        goto next;
 
@@ -3541,13 +3539,19 @@ static int split_huge_pages_pid(int pid, unsigned long vaddr_start,
 
                if (!folio_trylock(folio))
                        goto next;
+               folio_get(folio);
+               folio_walk_end(&fw, vma);
 
                if (!split_folio_to_order(folio, new_order))
                        split++;
 
                folio_unlock(folio);
-next:
                folio_put(folio);
+
+               cond_resched();
+               continue;
+next:
+               folio_walk_end(&fw, vma);
                cond_resched();
        }
        mmap_read_unlock(mm);