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: Xiao 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: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This commit is contained in:
Родитель
4bfc130d5a
Коммит
cbde83e21c
|
@ -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 @@ fail:
|
||||||
* 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;
|
||||||
}
|
}
|
||||||
/*
|
/*
|
||||||
|
|
Загрузка…
Ссылка в новой задаче