diff options
| -rw-r--r-- | arch/x86/mm/hugetlbpage.c | 10 | 
1 files changed, 6 insertions, 4 deletions
diff --git a/arch/x86/mm/hugetlbpage.c b/arch/x86/mm/hugetlbpage.c index 8ecbb4bba4b..c20e81c3425 100644 --- a/arch/x86/mm/hugetlbpage.c +++ b/arch/x86/mm/hugetlbpage.c @@ -309,9 +309,10 @@ static unsigned long hugetlb_get_unmapped_area_topdown(struct file *file,  	struct hstate *h = hstate_file(file);  	struct mm_struct *mm = current->mm;  	struct vm_area_struct *vma, *prev_vma; -	unsigned long base = mm->mmap_base, addr = addr0; +	unsigned long base = mm->mmap_base; +	unsigned long addr = addr0;  	unsigned long largest_hole = mm->cached_hole_size; -	int first_time = 1; +	unsigned long start_addr;  	/* don't allow allocations above current base */  	if (mm->free_area_cache > base) @@ -322,6 +323,8 @@ static unsigned long hugetlb_get_unmapped_area_topdown(struct file *file,  		mm->free_area_cache  = base;  	}  try_again: +	start_addr = mm->free_area_cache; +  	/* make sure it can fit in the remaining address space */  	if (mm->free_area_cache < len)  		goto fail; @@ -368,10 +371,9 @@ fail:  	 * if hint left us with no space for the requested  	 * mapping then try again:  	 */ -	if (first_time) { +	if (start_addr != base) {  		mm->free_area_cache = base;  		largest_hole = 0; -		first_time = 0;  		goto try_again;  	}  	/*  |