Re: [PATCH RFC 12/35] mm: limit folio/compound page sizes in problematic kernel configs
David Hildenbrand <[email protected]>
| Newsgroups | com.zx2c4.lists.wireguard,dev.linux.lists.iommu,dev.linux.lists.virtualization,org.freedesktop.lists.dri-devel,org.freedesktop.lists.intel-gfx,org.infradead.lists.linux-arm-kernel,org.infradead.lists.linux-riscv,org.kernel.vger.io-uring,org.kernel.vger.kvm,org.kernel.vger.linux-crypto,org.kernel.vger.linux-ide,org.kernel.vger.linux-kernel,org.kernel.vger.linux-kselftest,org.kernel.vger.linux-mips,org.kernel.vger.linux-mmc,org.kernel.vger.linux-s390,org.kernel.vger.linux-scsi,org.kernel.vger.netdev,org.kvack.linux-mm |
|---|---|
| Message-ID | <[email protected]> |
On 21.08.25 22:46, Zi Yan wrote: > On 21 Aug 2025, at 16:06, David Hildenbrand wrote: > >> Let's limit the maximum folio size in problematic kernel config where >> the memmap is allocated per memory section (SPARSEMEM without >> SPARSEMEM_VMEMMAP) to a single memory section. >> >> Currently, only a single architectures supports ARCH_HAS_GIGANTIC_PAGE >> but not SPARSEMEM_VMEMMAP: sh. >> >> Fortunately, the biggest hugetlb size sh supports is 64 MiB >> (HUGETLB_PAGE_SIZE_64MB) and the section size is at least 64 MiB >> (SECTION_SIZE_BITS == 26), so their use case is not degraded. >> >> As folios and memory sections are naturally aligned to their order-2 size >> in memory, consequently a single folio can no longer span multiple memory >> sections on these problematic kernel configs. >> >> nth_page() is no longer required when operating within a single compound >> page / folio. >> >> Signed-off-by: David Hildenbrand <[email protected]> >> --- >> include/linux/mm.h | 22 ++++++++++++++++++---- >> 1 file changed, 18 insertions(+), 4 deletions(-) >> >> diff --git a/include/linux/mm.h b/include/linux/mm.h >> index 77737cbf2216a..48a985e17ef4e 100644 >> --- a/include/linux/mm.h >> +++ b/include/linux/mm.h >> @@ -2053,11 +2053,25 @@ static inline long folio_nr_pages(const struct folio *folio) >> return folio_large_nr_pages(folio); >> } >> >> -/* Only hugetlbfs can allocate folios larger than MAX_ORDER */ >> -#ifdef CONFIG_ARCH_HAS_GIGANTIC_PAGE >> -#define MAX_FOLIO_ORDER PUD_ORDER >> -#else >> +#if !defined(CONFIG_ARCH_HAS_GIGANTIC_PAGE) >> +/* >> + * We don't expect any folios that exceed buddy sizes (and consequently >> + * memory sections). >> + */ >> #define MAX_FOLIO_ORDER MAX_PAGE_ORDER >> +#elif defined(CONFIG_SPARSEMEM) && !defined(CONFIG_SPARSEMEM_VMEMMAP) >> +/* >> + * Only pages within a single memory section are guaranteed to be >> + * contiguous. By limiting folios to a single memory section, all folio >> + * pages are guaranteed to be contiguous. >> + */ >> +#define MAX_FOLIO_ORDER PFN_SECTION_SHIFT >> +#else >> +/* >> + * There is no real limit on the folio size. We limit them to the maximum we >> + * currently expect. > > The comment about hugetlbfs is helpful here, since the other folios are still > limited by buddy allocator’s MAX_ORDER. Yeah, but the old comment was wrong (there is DAX). I can add here "currently expect (e.g., hugetlfs, dax)." -- Cheers David / dhildenb