// SPDX-License-Identifier: GPL-2.0 #include <linux/hugetlb.h> #include <linux/err.h> int pud_huge(pud_t pud) { return pud_present(pud) && (pud_val(pud) & (_PAGE_READ | _PAGE_WRITE | _PAGE_EXEC)); } int pmd_huge(pmd_t pmd) { return pmd_present(pmd) && (pmd_val(pmd) & (_PAGE_READ | _PAGE_WRITE | _PAGE_EXEC)); } static __init int setup_hugepagesz(char *opt) { unsigned long ps = memparse(opt, &opt); if (ps == HPAGE_SIZE) { hugetlb_add_hstate(HPAGE_SHIFT - PAGE_SHIFT); } else if (IS_ENABLED(CONFIG_64BIT) && ps == PUD_SIZE) { hugetlb_add_hstate(PUD_SHIFT - PAGE_SHIFT); } else { hugetlb_bad_size(); pr_err("hugepagesz: Unsupported page size %lu M\n", ps >> 20); return 0; } return 1; } __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