| .. | .. |
|---|
| 189 | 189 | return pte; |
|---|
| 190 | 190 | } |
|---|
| 191 | 191 | |
|---|
| 192 | | -pte_t *huge_pte_alloc(struct mm_struct *mm, |
|---|
| 192 | +pte_t *huge_pte_alloc(struct mm_struct *mm, struct vm_area_struct *vma, |
|---|
| 193 | 193 | unsigned long addr, unsigned long sz) |
|---|
| 194 | 194 | { |
|---|
| 195 | 195 | pgd_t *pgdp; |
|---|
| .. | .. |
|---|
| 254 | 254 | return pud_page(*pud) + ((address & ~PUD_MASK) >> PAGE_SHIFT); |
|---|
| 255 | 255 | } |
|---|
| 256 | 256 | |
|---|
| 257 | | -static __init int setup_hugepagesz(char *opt) |
|---|
| 257 | +bool __init arch_hugetlb_valid_size(unsigned long size) |
|---|
| 258 | 258 | { |
|---|
| 259 | | - unsigned long size; |
|---|
| 260 | | - char *string = opt; |
|---|
| 261 | | - |
|---|
| 262 | | - size = memparse(opt, &opt); |
|---|
| 263 | | - if (MACHINE_HAS_EDAT1 && size == PMD_SIZE) { |
|---|
| 264 | | - hugetlb_add_hstate(PMD_SHIFT - PAGE_SHIFT); |
|---|
| 265 | | - } else if (MACHINE_HAS_EDAT2 && size == PUD_SIZE) { |
|---|
| 266 | | - hugetlb_add_hstate(PUD_SHIFT - PAGE_SHIFT); |
|---|
| 267 | | - } else { |
|---|
| 268 | | - hugetlb_bad_size(); |
|---|
| 269 | | - pr_err("hugepagesz= specifies an unsupported page size %s\n", |
|---|
| 270 | | - string); |
|---|
| 271 | | - return 0; |
|---|
| 272 | | - } |
|---|
| 273 | | - return 1; |
|---|
| 259 | + if (MACHINE_HAS_EDAT1 && size == PMD_SIZE) |
|---|
| 260 | + return true; |
|---|
| 261 | + else if (MACHINE_HAS_EDAT2 && size == PUD_SIZE) |
|---|
| 262 | + return true; |
|---|
| 263 | + else |
|---|
| 264 | + return false; |
|---|
| 274 | 265 | } |
|---|
| 275 | | -__setup("hugepagesz=", setup_hugepagesz); |
|---|
| 276 | 266 | |
|---|
| 277 | 267 | static unsigned long hugetlb_get_unmapped_area_bottomup(struct file *file, |
|---|
| 278 | 268 | unsigned long addr, unsigned long len, |
|---|
| .. | .. |
|---|
| 329 | 319 | struct hstate *h = hstate_file(file); |
|---|
| 330 | 320 | struct mm_struct *mm = current->mm; |
|---|
| 331 | 321 | struct vm_area_struct *vma; |
|---|
| 332 | | - int rc; |
|---|
| 333 | 322 | |
|---|
| 334 | 323 | if (len & ~huge_page_mask(h)) |
|---|
| 335 | 324 | return -EINVAL; |
|---|
| .. | .. |
|---|
| 356 | 345 | else |
|---|
| 357 | 346 | addr = hugetlb_get_unmapped_area_topdown(file, addr, len, |
|---|
| 358 | 347 | pgoff, flags); |
|---|
| 359 | | - if (addr & ~PAGE_MASK) |
|---|
| 348 | + if (offset_in_page(addr)) |
|---|
| 360 | 349 | return addr; |
|---|
| 361 | 350 | |
|---|
| 362 | 351 | check_asce_limit: |
|---|
| 363 | | - if (addr + len > current->mm->context.asce_limit && |
|---|
| 364 | | - addr + len <= TASK_SIZE) { |
|---|
| 365 | | - rc = crst_table_upgrade(mm, addr + len); |
|---|
| 366 | | - if (rc) |
|---|
| 367 | | - return (unsigned long) rc; |
|---|
| 368 | | - } |
|---|
| 369 | | - return addr; |
|---|
| 352 | + return check_asce_limit(mm, addr, len); |
|---|
| 370 | 353 | } |
|---|