diff options
author | Xiao Guangrong <xiaoguangrong@linux.vnet.ibm.com> | 2012-03-21 19:33:55 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2012-03-21 20:54:56 -0400 |
commit | cbde83e21c4fd50bfc4240408355c1e5d393063d (patch) | |
tree | 21899d4db2dadcdaea04b019c7d9f1d62344f5b4 /arch/x86/mm | |
parent | 4bfc130d5afa28395288d1b57092906349604b41 (diff) |
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>
Diffstat (limited to 'arch/x86/mm')
-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 8ecbb4bba4b3..c20e81c3425d 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, | |||
309 | struct hstate *h = hstate_file(file); | 309 | struct hstate *h = hstate_file(file); |
310 | struct mm_struct *mm = current->mm; | 310 | struct mm_struct *mm = current->mm; |
311 | struct vm_area_struct *vma, *prev_vma; | 311 | struct vm_area_struct *vma, *prev_vma; |
312 | unsigned long base = mm->mmap_base, addr = addr0; | 312 | unsigned long base = mm->mmap_base; |
313 | unsigned long addr = addr0; | ||
313 | unsigned long largest_hole = mm->cached_hole_size; | 314 | unsigned long largest_hole = mm->cached_hole_size; |
314 | int first_time = 1; | 315 | unsigned long start_addr; |
315 | 316 | ||
316 | /* don't allow allocations above current base */ | 317 | /* don't allow allocations above current base */ |
317 | if (mm->free_area_cache > base) | 318 | if (mm->free_area_cache > base) |
@@ -322,6 +323,8 @@ static unsigned long hugetlb_get_unmapped_area_topdown(struct file *file, | |||
322 | mm->free_area_cache = base; | 323 | mm->free_area_cache = base; |
323 | } | 324 | } |
324 | try_again: | 325 | try_again: |
326 | start_addr = mm->free_area_cache; | ||
327 | |||
325 | /* make sure it can fit in the remaining address space */ | 328 | /* make sure it can fit in the remaining address space */ |
326 | if (mm->free_area_cache < len) | 329 | if (mm->free_area_cache < len) |
327 | goto fail; | 330 | goto fail; |
@@ -368,10 +371,9 @@ fail: | |||
368 | * if hint left us with no space for the requested | 371 | * if hint left us with no space for the requested |
369 | * mapping then try again: | 372 | * mapping then try again: |
370 | */ | 373 | */ |
371 | if (first_time) { | 374 | if (start_addr != base) { |
372 | mm->free_area_cache = base; | 375 | mm->free_area_cache = base; |
373 | largest_hole = 0; | 376 | largest_hole = 0; |
374 | first_time = 0; | ||
375 | goto try_again; | 377 | goto try_again; |
376 | } | 378 | } |
377 | /* | 379 | /* |