From: Pankaj Raghav <p.raghav@xxxxxxxxxxx> Add largest_zero_folio() routine so that huge_zero_folio can be used without the need to pass any mm struct. This will return ZERO_PAGE folio if CONFIG_STATIC_PMD_ZERO_PAGE is disabled or if we failed to allocate a PMD page from memblock. This routine can also be called even if THP is disabled. Signed-off-by: Pankaj Raghav <p.raghav@xxxxxxxxxxx> --- include/linux/mm.h | 28 ++++++++++++++++++++++++++-- 1 file changed, 26 insertions(+), 2 deletions(-) diff --git a/include/linux/mm.h b/include/linux/mm.h index 428fe6d36b3c..d5543cf7b8e9 100644 --- a/include/linux/mm.h +++ b/include/linux/mm.h @@ -4018,17 +4018,41 @@ static inline bool vma_is_special_huge(const struct vm_area_struct *vma) #endif /* CONFIG_TRANSPARENT_HUGEPAGE || CONFIG_HUGETLBFS */ +extern struct folio *huge_zero_folio; +extern unsigned long huge_zero_pfn; + #ifdef CONFIG_STATIC_PMD_ZERO_PAGE extern void __init static_pmd_zero_init(void); + +/* + * largest_zero_folio - Get the largest zero size folio available + * + * This function will return a PMD sized zero folio if CONFIG_STATIC_PMD_ZERO_PAGE + * is enabled. Otherwise, a ZERO_PAGE folio is returned. + * + * Deduce the size of the folio with folio_size instead of assuming the + * folio size. + */ +static inline struct folio *largest_zero_folio(void) +{ + if(!huge_zero_folio) + return page_folio(ZERO_PAGE(0)); + + return READ_ONCE(huge_zero_folio); +} + #else static inline void __init static_pmd_zero_init(void) { return; } + +static inline struct folio *largest_zero_folio(void) +{ + return page_folio(ZERO_PAGE(0)); +} #endif -extern struct folio *huge_zero_folio; -extern unsigned long huge_zero_pfn; #ifdef CONFIG_TRANSPARENT_HUGEPAGE static inline bool is_huge_zero_folio(const struct folio *folio) -- 2.49.0