hugetlb: remove prev_vma from hugetlb_get_unmapped_area_topdown()
authorXiao Guangrong <xiaoguangrong@linux.vnet.ibm.com>
Wed, 21 Mar 2012 23:34:14 +0000 (16:34 -0700)
committerLinus Torvalds <torvalds@linux-foundation.org>
Thu, 22 Mar 2012 00:54:59 +0000 (17:54 -0700)
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>
arch/x86/mm/hugetlbpage.c

index c20e81c..f6679a7 100644 (file)
@@ -308,7 +308,7 @@ static unsigned long hugetlb_get_unmapped_area_topdown(struct file *file,
 {
        struct hstate *h = hstate_file(file);
        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 addr = addr0;
        unsigned long largest_hole = mm->cached_hole_size;
@@ -340,22 +340,14 @@ try_again:
                if (!vma)
                        return addr;
 
-               /*
-                * 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))) {
+               if (addr + len <= vma->vm_start) {
                        /* remember the address as a hint for next time */
                        mm->cached_hole_size = largest_hole;
                        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 */
-                       if (mm->free_area_cache == vma->vm_end) {
-                               mm->free_area_cache = vma->vm_start;
-                               mm->cached_hole_size = largest_hole;
-                       }
+                       mm->free_area_cache = vma->vm_start;
+                       mm->cached_hole_size = largest_hole;
                }
 
                /* remember the largest hole we saw so far */