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: Xiao Guangrong <xiaoguangrong@linux.vnet.ibm.com> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This commit is contained in:
parent
40716e2924
commit
b69add218d
|
@ -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,22 +340,14 @@ try_again:
|
||||||
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 */
|
||||||
|
|
Loading…
Reference in New Issue