Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit cbde83e2 authored by Xiao Guangrong's avatar Xiao Guangrong Committed by Linus Torvalds
Browse files

hugetlb: try to search again if it is really needed



Search again only if some holes may be skipped in the first pass.

[akpm@linux-foundation.org: clean up crazy compound definition]
Signed-off-by: default avatarXiao Guangrong <xiaoguangrong@linux.vnet.ibm.com>
Cc: Thomas Gleixner <tglx@linutronix.de>
Cc: Ingo Molnar <mingo@redhat.com>
Cc: "H. Peter Anvin" <hpa@zytor.com>
Cc: Michal Hocko <mhocko@suse.cz>
Cc: Hillf Danton <dhillf@gmail.com>
Cc: Andrea Arcangeli <aarcange@redhat.com>
Cc: KAMEZAWA Hiroyuki <kamezawa.hiroyu@jp.fujitsu.com>
Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
parent 4bfc130d
Loading
Loading
Loading
Loading
+6 −4
Original line number Original line Diff line number Diff line
@@ -309,9 +309,10 @@ static unsigned long hugetlb_get_unmapped_area_topdown(struct file *file,
	struct hstate *h = hstate_file(file);
	struct hstate *h = hstate_file(file);
	struct mm_struct *mm = current->mm;
	struct mm_struct *mm = current->mm;
	struct vm_area_struct *vma, *prev_vma;
	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;
	unsigned long largest_hole = mm->cached_hole_size;
	int first_time = 1;
	unsigned long start_addr;


	/* don't allow allocations above current base */
	/* don't allow allocations above current base */
	if (mm->free_area_cache > 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;
		mm->free_area_cache  = base;
	}
	}
try_again:
try_again:
	start_addr = mm->free_area_cache;

	/* make sure it can fit in the remaining address space */
	/* make sure it can fit in the remaining address space */
	if (mm->free_area_cache < len)
	if (mm->free_area_cache < len)
		goto fail;
		goto fail;
@@ -368,10 +371,9 @@ static unsigned long hugetlb_get_unmapped_area_topdown(struct file *file,
	 * if hint left us with no space for the requested
	 * if hint left us with no space for the requested
	 * mapping then try again:
	 * mapping then try again:
	 */
	 */
	if (first_time) {
	if (start_addr != base) {
		mm->free_area_cache = base;
		mm->free_area_cache = base;
		largest_hole = 0;
		largest_hole = 0;
		first_time = 0;
		goto try_again;
		goto try_again;
	}
	}
	/*
	/*