start_addr = addr = mm->free_area_cache; 
if (len > mm->cached_hole_size) { start_addr = addr = mm->free_area_cache; } else { start_addr = addr = TASK_UNMAPPED_BASE; mm->cached_hole_size = 0; } 
unsigned long arch_get_unmapped_area(struct file *filp, unsigned long addr,				     unsigned long len, unsigned long pgoff,				     unsigned long flags){	struct mm_struct *mm = current->mm;	struct vm_area_struct *vma;	unsigned long start_addr;	if (len > TASK_SIZE)		return -ENOMEM;	if (addr) {		addr = PAGE_ALIGN(addr);		vma = find_vma(mm, addr);		if (((TASK_SIZE - len) >= addr)		    && (!vma || (addr+len) <= vma->vm_start)		    && !is_hugepage_only_range(mm, addr,len))			return addr;	}	start_addr = addr = mm->free_area_cache;full_search:	vma = find_vma(mm, addr);	while (TASK_SIZE - len >= addr) {		BUG_ON(vma && (addr >= vma->vm_end));		if (touches_hugepage_low_range(mm, addr, len)) {			addr = ALIGN(addr+1, 1<<SID_SHIFT);			vma = find_vma(mm, addr);			continue;		}		if (touches_hugepage_high_range(addr, len)) {			addr = TASK_HPAGE_END;			vma = find_vma(mm, addr);			continue;		}		if (!vma || addr + len <= vma->vm_start) {			/*			 * Remember the place where we stopped the search:			 */			mm->free_area_cache = addr + len;			return addr;		}		addr = vma->vm_end;		vma = vma->vm_next;	}	/* Make sure we didn't miss any holes */	if (start_addr != TASK_UNMAPPED_BASE) {		start_addr = addr = TASK_UNMAPPED_BASE;		goto full_search;	}	return -ENOMEM;}
4520	/local/tlutelli/issta_data/temp/c/2005_temp/2005/4520/1363c3cd8603a913a27e2995dccbd70d5312d8e6/hugetlbpage.c/buggy/arch/ppc64/mm/hugetlbpage.c