1 // SPDX-License-Identifier: GPL-2.0 2 #include <linux/hugetlb.h> 3 #include <linux/err.h> 4 5 int pud_huge(pud_t pud) 6 { 7 return pud_present(pud) && 8 (pud_val(pud) & (_PAGE_READ | _PAGE_WRITE | _PAGE_EXEC)); 9 } 10 11 int pmd_huge(pmd_t pmd) 12 { 13 return pmd_present(pmd) && 14 (pmd_val(pmd) & (_PAGE_READ | _PAGE_WRITE | _PAGE_EXEC)); 15 } 16 17 static __init int setup_hugepagesz(char *opt) 18 { 19 unsigned long ps = memparse(opt, &opt); 20 21 if (ps == HPAGE_SIZE) { 22 hugetlb_add_hstate(HPAGE_SHIFT - PAGE_SHIFT); 23 } else if (IS_ENABLED(CONFIG_64BIT) && ps == PUD_SIZE) { 24 hugetlb_add_hstate(PUD_SHIFT - PAGE_SHIFT); 25 } else { 26 hugetlb_bad_size(); 27 pr_err("hugepagesz: Unsupported page size %lu M\n", ps >> 20); 28 return 0; 29 } 30 31 return 1; 32 } 33 __setup("hugepagesz=", setup_hugepagesz); 34 35 #ifdef CONFIG_CONTIG_ALLOC 36 static __init int gigantic_pages_init(void) 37 { 38 /* With CONTIG_ALLOC, we can allocate gigantic pages at runtime */ 39 if (IS_ENABLED(CONFIG_64BIT) && !size_to_hstate(1UL << PUD_SHIFT)) 40 hugetlb_add_hstate(PUD_SHIFT - PAGE_SHIFT); 41 return 0; 42 } 43 arch_initcall(gigantic_pages_init); 44 #endif 45