45 lines
1.0 KiB
C
45 lines
1.0 KiB
C
|
// 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
|