diff options
Diffstat (limited to 'mm/hugetlb.c')
| -rw-r--r-- | mm/hugetlb.c | 10 | 
1 files changed, 8 insertions, 2 deletions
diff --git a/mm/hugetlb.c b/mm/hugetlb.c index 59a0059b39e..712895eda0d 100644 --- a/mm/hugetlb.c +++ b/mm/hugetlb.c @@ -3014,7 +3014,7 @@ same_page:  	return i ? i : -EFAULT;  } -void hugetlb_change_protection(struct vm_area_struct *vma, +unsigned long hugetlb_change_protection(struct vm_area_struct *vma,  		unsigned long address, unsigned long end, pgprot_t newprot)  {  	struct mm_struct *mm = vma->vm_mm; @@ -3022,6 +3022,7 @@ void hugetlb_change_protection(struct vm_area_struct *vma,  	pte_t *ptep;  	pte_t pte;  	struct hstate *h = hstate_vma(vma); +	unsigned long pages = 0;  	BUG_ON(address >= end);  	flush_cache_range(vma, address, end); @@ -3032,12 +3033,15 @@ void hugetlb_change_protection(struct vm_area_struct *vma,  		ptep = huge_pte_offset(mm, address);  		if (!ptep)  			continue; -		if (huge_pmd_unshare(mm, &address, ptep)) +		if (huge_pmd_unshare(mm, &address, ptep)) { +			pages++;  			continue; +		}  		if (!huge_pte_none(huge_ptep_get(ptep))) {  			pte = huge_ptep_get_and_clear(mm, address, ptep);  			pte = pte_mkhuge(pte_modify(pte, newprot));  			set_huge_pte_at(mm, address, ptep, pte); +			pages++;  		}  	}  	spin_unlock(&mm->page_table_lock); @@ -3049,6 +3053,8 @@ void hugetlb_change_protection(struct vm_area_struct *vma,  	 */  	flush_tlb_range(vma, start, end);  	mutex_unlock(&vma->vm_file->f_mapping->i_mmap_mutex); + +	return pages << h->order;  }  int hugetlb_reserve_pages(struct inode *inode,  |