Commit 39231e8d6ba7 for kernel

commit 39231e8d6ba7f794b566fd91ebd88c0834a23b98
Author: David Hildenbrand (Red Hat) <david@kernel.org>
Date:   Fri Nov 14 22:49:20 2025 +0100

    mm: fix MAX_FOLIO_ORDER on powerpc configs with hugetlb

    In the past, CONFIG_ARCH_HAS_GIGANTIC_PAGE indicated that we support
    runtime allocation of gigantic hugetlb folios.  In the meantime it evolved
    into a generic way for the architecture to state that it supports gigantic
    hugetlb folios.

    In commit fae7d834c43c ("mm: add __dump_folio()") we started using
    CONFIG_ARCH_HAS_GIGANTIC_PAGE to decide MAX_FOLIO_ORDER: whether we could
    have folios larger than what the buddy can handle.  In the context of that
    commit, we started using MAX_FOLIO_ORDER to detect page corruptions when
    dumping tail pages of folios.  Before that commit, we assumed that we
    cannot have folios larger than the highest buddy order, which was
    obviously wrong.

    In commit 7b4f21f5e038 ("mm/hugetlb: check for unreasonable folio sizes
    when registering hstate"), we used MAX_FOLIO_ORDER to detect
    inconsistencies, and in fact, we found some now.

    Powerpc allows for configs that can allocate gigantic folio during boot
    (not at runtime), that do not set CONFIG_ARCH_HAS_GIGANTIC_PAGE and can
    exceed PUD_ORDER.

    To fix it, let's make powerpc select CONFIG_ARCH_HAS_GIGANTIC_PAGE with
    hugetlb on powerpc, and increase the maximum folio size with hugetlb to 16
    GiB on 64bit (possible on arm64 and powerpc) and 1 GiB on 32 bit
    (powerpc).  Note that on some powerpc configurations, whether we actually
    have gigantic pages depends on the setting of CONFIG_ARCH_FORCE_MAX_ORDER,
    but there is nothing really problematic about setting it unconditionally:
    we just try to keep the value small so we can better detect problems in
    __dump_folio() and inconsistencies around the expected largest folio in
    the system.

    Ideally, we'd have a better way to obtain the maximum hugetlb folio size
    and detect ourselves whether we really end up with gigantic folios.  Let's
    defer bigger changes and fix the warnings first.

    While at it, handle gigantic DAX folios more clearly: DAX can only end up
    creating gigantic folios with HAVE_ARCH_TRANSPARENT_HUGEPAGE_PUD.

    Add a new Kconfig option HAVE_GIGANTIC_FOLIOS to make both cases clearer.
    In particular, worry about ARCH_HAS_GIGANTIC_PAGE only with HUGETLB_PAGE.

    Note: with enabling CONFIG_ARCH_HAS_GIGANTIC_PAGE on powerpc, we will now
    also allow for runtime allocations of folios in some more powerpc configs.
    I don't think this is a problem, but if it is we could handle it through
    __HAVE_ARCH_GIGANTIC_PAGE_RUNTIME_SUPPORTED.

    While __dump_page()/__dump_folio was also problematic (not handling
    dumping of tail pages of such gigantic folios correctly), it doesn't seem
    critical enough to mark it as a fix.

    Link: https://lkml.kernel.org/r/20251114214920.2550676-1-david@kernel.org
    Fixes: 7b4f21f5e038 ("mm/hugetlb: check for unreasonable folio sizes when registering hstate")
    Reported-by: Christophe Leroy <christophe.leroy@csgroup.eu>
    Closes: https://lore.kernel.org/r/3e043453-3f27-48ad-b987-cc39f523060a@csgroup.eu/
    Reported-by: Sourabh Jain <sourabhjain@linux.ibm.com>
    Closes: https://lore.kernel.org/r/94377f5c-d4f0-4c0f-b0f6-5bf1cd7305b1@linux.ibm.com/
    Signed-off-by: David Hildenbrand (Red Hat) <david@kernel.org>
    Cc: Ritesh Harjani (IBM) <ritesh.list@gmail.com>
    Cc: Madhavan Srinivasan <maddy@linux.ibm.com>
    Cc: Donet Tom <donettom@linux.ibm.com>
    Cc: Michael Ellerman <mpe@ellerman.id.au>
    Cc: Nicholas Piggin <npiggin@gmail.com>
    Cc: Christophe Leroy <christophe.leroy@csgroup.eu>
    Cc: Lorenzo Stoakes <lorenzo.stoakes@oracle.com>
    Cc: "Liam R. Howlett" <Liam.Howlett@oracle.com>
    Cc: Vlastimil Babka <vbabka@suse.cz>
    Cc: Mike Rapoport <rppt@kernel.org>
    Cc: Suren Baghdasaryan <surenb@google.com>
    Cc: Michal Hocko <mhocko@suse.com>
    Cc: Nathan Chancellor <nathan@kernel.org>
    Signed-off-by: Andrew Morton <akpm@linux-foundation.org>

diff --git a/arch/powerpc/Kconfig b/arch/powerpc/Kconfig
index e24f4d88885a..9537a61ebae0 100644
--- a/arch/powerpc/Kconfig
+++ b/arch/powerpc/Kconfig
@@ -137,6 +137,7 @@ config PPC
 	select ARCH_HAS_DMA_OPS			if PPC64
 	select ARCH_HAS_FORTIFY_SOURCE
 	select ARCH_HAS_GCOV_PROFILE_ALL
+	select ARCH_HAS_GIGANTIC_PAGE		if ARCH_SUPPORTS_HUGETLBFS
 	select ARCH_HAS_KCOV
 	select ARCH_HAS_KERNEL_FPU_SUPPORT	if PPC64 && PPC_FPU
 	select ARCH_HAS_MEMBARRIER_CALLBACKS
diff --git a/arch/powerpc/platforms/Kconfig.cputype b/arch/powerpc/platforms/Kconfig.cputype
index 7b527d18aa5e..4c321a8ea896 100644
--- a/arch/powerpc/platforms/Kconfig.cputype
+++ b/arch/powerpc/platforms/Kconfig.cputype
@@ -423,7 +423,6 @@ config PPC_64S_HASH_MMU
 config PPC_RADIX_MMU
 	bool "Radix MMU Support"
 	depends on PPC_BOOK3S_64
-	select ARCH_HAS_GIGANTIC_PAGE
 	default y
 	help
 	  Enable support for the Power ISA 3.0 Radix style MMU. Currently this
diff --git a/include/linux/mm.h b/include/linux/mm.h
index d16b33bacc32..7c79b3369b82 100644
--- a/include/linux/mm.h
+++ b/include/linux/mm.h
@@ -2074,7 +2074,7 @@ static inline unsigned long folio_nr_pages(const struct folio *folio)
 	return folio_large_nr_pages(folio);
 }

-#if !defined(CONFIG_ARCH_HAS_GIGANTIC_PAGE)
+#if !defined(CONFIG_HAVE_GIGANTIC_FOLIOS)
 /*
  * We don't expect any folios that exceed buddy sizes (and consequently
  * memory sections).
@@ -2087,10 +2087,17 @@ static inline unsigned long folio_nr_pages(const struct folio *folio)
  * pages are guaranteed to be contiguous.
  */
 #define MAX_FOLIO_ORDER		PFN_SECTION_SHIFT
-#else
+#elif defined(CONFIG_HUGETLB_PAGE)
 /*
  * There is no real limit on the folio size. We limit them to the maximum we
- * currently expect (e.g., hugetlb, dax).
+ * currently expect (see CONFIG_HAVE_GIGANTIC_FOLIOS): with hugetlb, we expect
+ * no folios larger than 16 GiB on 64bit and 1 GiB on 32bit.
+ */
+#define MAX_FOLIO_ORDER		get_order(IS_ENABLED(CONFIG_64BIT) ? SZ_16G : SZ_1G)
+#else
+/*
+ * Without hugetlb, gigantic folios that are bigger than a single PUD are
+ * currently impossible.
  */
 #define MAX_FOLIO_ORDER		PUD_ORDER
 #endif
diff --git a/mm/Kconfig b/mm/Kconfig
index 0e26f4fc8717..ca3f146bc705 100644
--- a/mm/Kconfig
+++ b/mm/Kconfig
@@ -908,6 +908,13 @@ config PAGE_MAPCOUNT
 config PGTABLE_HAS_HUGE_LEAVES
 	def_bool TRANSPARENT_HUGEPAGE || HUGETLB_PAGE

+#
+# We can end up creating gigantic folio.
+#
+config HAVE_GIGANTIC_FOLIOS
+	def_bool (HUGETLB_PAGE && ARCH_HAS_GIGANTIC_PAGE) || \
+		 (ZONE_DEVICE && HAVE_ARCH_TRANSPARENT_HUGEPAGE_PUD)
+
 # TODO: Allow to be enabled without THP
 config ARCH_SUPPORTS_HUGE_PFNMAP
 	def_bool n