.. | .. |
---|
17 | 17 | #include <asm/mman.h> |
---|
18 | 18 | #include <asm/tlb.h> |
---|
19 | 19 | #include <asm/tlbflush.h> |
---|
20 | | -#include <asm/pgalloc.h> |
---|
21 | 20 | #include <asm/elf.h> |
---|
22 | | -#include <asm/mpx.h> |
---|
23 | 21 | |
---|
24 | 22 | #if 0 /* This is just for testing */ |
---|
25 | 23 | struct page * |
---|
.. | .. |
---|
92 | 90 | * If hint address is above DEFAULT_MAP_WINDOW, look for unmapped area |
---|
93 | 91 | * in the full address space. |
---|
94 | 92 | */ |
---|
95 | | - info.high_limit = in_compat_syscall() ? |
---|
| 93 | + info.high_limit = in_32bit_syscall() ? |
---|
96 | 94 | task_size_32bit() : task_size_64bit(addr > DEFAULT_MAP_WINDOW); |
---|
97 | 95 | |
---|
98 | 96 | info.align_mask = PAGE_MASK & ~huge_page_mask(h); |
---|
.. | .. |
---|
116 | 114 | * If hint address is above DEFAULT_MAP_WINDOW, look for unmapped area |
---|
117 | 115 | * in the full address space. |
---|
118 | 116 | */ |
---|
119 | | - if (addr > DEFAULT_MAP_WINDOW && !in_compat_syscall()) |
---|
| 117 | + if (addr > DEFAULT_MAP_WINDOW && !in_32bit_syscall()) |
---|
120 | 118 | info.high_limit += TASK_SIZE_MAX - DEFAULT_MAP_WINDOW; |
---|
121 | 119 | |
---|
122 | 120 | info.align_mask = PAGE_MASK & ~huge_page_mask(h); |
---|
.. | .. |
---|
151 | 149 | if (len & ~huge_page_mask(h)) |
---|
152 | 150 | return -EINVAL; |
---|
153 | 151 | |
---|
154 | | - addr = mpx_unmapped_area_check(addr, len, flags); |
---|
155 | | - if (IS_ERR_VALUE(addr)) |
---|
156 | | - return addr; |
---|
157 | | - |
---|
158 | 152 | if (len > TASK_SIZE) |
---|
159 | 153 | return -ENOMEM; |
---|
160 | 154 | |
---|
.. | .. |
---|
186 | 180 | #endif /* CONFIG_HUGETLB_PAGE */ |
---|
187 | 181 | |
---|
188 | 182 | #ifdef CONFIG_X86_64 |
---|
189 | | -static __init int setup_hugepagesz(char *opt) |
---|
| 183 | +bool __init arch_hugetlb_valid_size(unsigned long size) |
---|
190 | 184 | { |
---|
191 | | - unsigned long ps = memparse(opt, &opt); |
---|
192 | | - if (ps == PMD_SIZE) { |
---|
193 | | - hugetlb_add_hstate(PMD_SHIFT - PAGE_SHIFT); |
---|
194 | | - } else if (ps == PUD_SIZE && boot_cpu_has(X86_FEATURE_GBPAGES)) { |
---|
195 | | - hugetlb_add_hstate(PUD_SHIFT - PAGE_SHIFT); |
---|
196 | | - } else { |
---|
197 | | - hugetlb_bad_size(); |
---|
198 | | - printk(KERN_ERR "hugepagesz: Unsupported page size %lu M\n", |
---|
199 | | - ps >> 20); |
---|
200 | | - return 0; |
---|
201 | | - } |
---|
202 | | - return 1; |
---|
| 185 | + if (size == PMD_SIZE) |
---|
| 186 | + return true; |
---|
| 187 | + else if (size == PUD_SIZE && boot_cpu_has(X86_FEATURE_GBPAGES)) |
---|
| 188 | + return true; |
---|
| 189 | + else |
---|
| 190 | + return false; |
---|
203 | 191 | } |
---|
204 | | -__setup("hugepagesz=", setup_hugepagesz); |
---|
205 | 192 | |
---|
206 | | -#if (defined(CONFIG_MEMORY_ISOLATION) && defined(CONFIG_COMPACTION)) || defined(CONFIG_CMA) |
---|
| 193 | +#ifdef CONFIG_CONTIG_ALLOC |
---|
207 | 194 | static __init int gigantic_pages_init(void) |
---|
208 | 195 | { |
---|
209 | 196 | /* With compaction or CMA we can allocate gigantic pages at runtime */ |
---|
210 | | - if (boot_cpu_has(X86_FEATURE_GBPAGES) && !size_to_hstate(1UL << PUD_SHIFT)) |
---|
| 197 | + if (boot_cpu_has(X86_FEATURE_GBPAGES)) |
---|
211 | 198 | hugetlb_add_hstate(PUD_SHIFT - PAGE_SHIFT); |
---|
212 | 199 | return 0; |
---|
213 | 200 | } |
---|