// SPDX-License-Identifier: GPL-2.0 #include #include int pud_huge(pud_t pud) { return pud_leaf(pud); } int pmd_huge(pmd_t pmd) { return pmd_leaf(pmd); } bool __init arch_hugetlb_valid_size(unsigned long size) { if (size == HPAGE_SIZE) return true; else if (IS_ENABLED(CONFIG_64BIT) && size == PUD_SIZE) return true; else return false; } static __init int setup_hugepagesz(char *opt) { unsigned long ps = memparse(opt, &opt); if (arch_hugetlb_valid_size(ps)) { hugetlb_add_hstate(ilog2(ps) - PAGE_SHIFT); return 1; } hugetlb_bad_size(); pr_err("hugepagesz: Unsupported page size %lu M\n", ps >> 20); return 0; } __setup("hugepagesz=", setup_hugepagesz); #ifdef CONFIG_CONTIG_ALLOC static __init int gigantic_pages_init(void) { /* With CONTIG_ALLOC, we can allocate gigantic pages at runtime */ if (IS_ENABLED(CONFIG_64BIT) && !size_to_hstate(1UL << PUD_SHIFT)) hugetlb_add_hstate(PUD_SHIFT - PAGE_SHIFT); return 0; } arch_initcall(gigantic_pages_init); #endif