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

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
...@@ -309,9 +309,10 @@ static unsigned long hugetlb_get_unmapped_area_topdown(struct file *file, ...@@ -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, ...@@ -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, ...@@ -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;
} }
/* /*
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment