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

hugetlb: remove prev_vma from hugetlb_get_unmapped_area_topdown()

After looking up the vma which covers or follows the cached search
address, the following condition is always true:

	!prev_vma || (addr >= prev_vma->vm_end)

so we can stop checking the previous VMA altogether.
Signed-off-by: default avatarXiao Guangrong <xiaoguangrong@linux.vnet.ibm.com>
Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
parent 40716e29
...@@ -308,7 +308,7 @@ static unsigned long hugetlb_get_unmapped_area_topdown(struct file *file, ...@@ -308,7 +308,7 @@ 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;
unsigned long base = mm->mmap_base; unsigned long base = mm->mmap_base;
unsigned long addr = addr0; unsigned long addr = addr0;
unsigned long largest_hole = mm->cached_hole_size; unsigned long largest_hole = mm->cached_hole_size;
...@@ -340,23 +340,15 @@ static unsigned long hugetlb_get_unmapped_area_topdown(struct file *file, ...@@ -340,23 +340,15 @@ static unsigned long hugetlb_get_unmapped_area_topdown(struct file *file,
if (!vma) if (!vma)
return addr; return addr;
/* if (addr + len <= vma->vm_start) {
* new region fits between prev_vma->vm_end and
* vma->vm_start, use it:
*/
prev_vma = vma->vm_prev;
if (addr + len <= vma->vm_start &&
(!prev_vma || (addr >= prev_vma->vm_end))) {
/* remember the address as a hint for next time */ /* remember the address as a hint for next time */
mm->cached_hole_size = largest_hole; mm->cached_hole_size = largest_hole;
return (mm->free_area_cache = addr); return (mm->free_area_cache = addr);
} else { } else if (mm->free_area_cache == vma->vm_end) {
/* pull free_area_cache down to the first hole */ /* pull free_area_cache down to the first hole */
if (mm->free_area_cache == vma->vm_end) {
mm->free_area_cache = vma->vm_start; mm->free_area_cache = vma->vm_start;
mm->cached_hole_size = largest_hole; mm->cached_hole_size = largest_hole;
} }
}
/* remember the largest hole we saw so far */ /* remember the largest hole we saw so far */
if (addr + largest_hole < vma->vm_start) if (addr + largest_hole < vma->vm_start)
......
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