diff options
Diffstat (limited to 'mm/hugetlb.c')
| -rw-r--r-- | mm/hugetlb.c | 13 | 
1 files changed, 13 insertions, 0 deletions
diff --git a/mm/hugetlb.c b/mm/hugetlb.c index 97b1e0290c66..6cdc7b2d9100 100644 --- a/mm/hugetlb.c +++ b/mm/hugetlb.c @@ -4299,6 +4299,19 @@ long follow_hugetlb_page(struct mm_struct *mm, struct vm_area_struct *vma,  		pfn_offset = (vaddr & ~huge_page_mask(h)) >> PAGE_SHIFT;  		page = pte_page(huge_ptep_get(pte)); + +		/* +		 * Instead of doing 'try_get_page()' below in the same_page +		 * loop, just check the count once here. +		 */ +		if (unlikely(page_count(page) <= 0)) { +			if (pages) { +				spin_unlock(ptl); +				remainder = 0; +				err = -ENOMEM; +				break; +			} +		}  same_page:  		if (pages) {  			pages[i] = mem_map_offset(page, pfn_offset);  |