diff options
Diffstat (limited to 'mm/hugetlb.c')
| -rw-r--r-- | mm/hugetlb.c | 12 | 
1 files changed, 11 insertions, 1 deletions
| diff --git a/mm/hugetlb.c b/mm/hugetlb.c index 681b300185c0..9a334f5fb730 100644 --- a/mm/hugetlb.c +++ b/mm/hugetlb.c @@ -3125,6 +3125,13 @@ static void hugetlb_vm_op_close(struct vm_area_struct *vma)  	}  } +static int hugetlb_vm_op_split(struct vm_area_struct *vma, unsigned long addr) +{ +	if (addr & ~(huge_page_mask(hstate_vma(vma)))) +		return -EINVAL; +	return 0; +} +  /*   * We cannot handle pagefaults against hugetlb pages at all.  They cause   * handle_mm_fault() to try to instantiate regular-sized pages in the @@ -3141,6 +3148,7 @@ const struct vm_operations_struct hugetlb_vm_ops = {  	.fault = hugetlb_vm_op_fault,  	.open = hugetlb_vm_op_open,  	.close = hugetlb_vm_op_close, +	.split = hugetlb_vm_op_split,  };  static pte_t make_huge_pte(struct vm_area_struct *vma, struct page *page, @@ -4627,7 +4635,9 @@ pte_t *huge_pte_alloc(struct mm_struct *mm,  	pte_t *pte = NULL;  	pgd = pgd_offset(mm, addr); -	p4d = p4d_offset(pgd, addr); +	p4d = p4d_alloc(mm, pgd, addr); +	if (!p4d) +		return NULL;  	pud = pud_alloc(mm, p4d, addr);  	if (pud) {  		if (sz == PUD_SIZE) { |