Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

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

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
Loading
Loading
Loading
Loading
+5 −13
Original line number Diff line number Diff line
@@ -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,23 +340,15 @@ static unsigned long hugetlb_get_unmapped_area_topdown(struct file *file,
		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;
		}
		}

		/* remember the largest hole we saw so far */
		if (addr + largest_hole < vma->vm_start)