 find_vma ()

 find_vma ()    mm/mmap. .

          -
 ,     vm_end    addr.
 ,       ,  -
  addr    ,   addr.   -
   ,     NULL.

       
vm_area_struct.  ,    VMA  -
  ,   addr,       -
  .    find_vma ()  
 map_cache  .     ,
            ,
        (  -
   30-40%).    
 .       ,     
 ,    .    
 -   .

struct vm area struct * find vma(struct mm struct *mm, unsigned long addr)
{

struct vm area struct *vma = NULL;

if (mm) {

vma = mm->mmap cache;

if (!(vma && vma->vm_end > addr && vma->vm_start <= addr)) (
struct rb node * rb node;

rb node = mm->mm rb.rb node;

vma = NULL;

while (rb node) {

struct vm_area_struct * vma_tmp;

vma tmp = rb_entry(rb_node,

struct vm area struct, vm rb) ;

if (vma tmp->vm end > addr) {
vma = vma_tmp;

if (vma tmp->vm start <= addr)
break;

rb node = rb node->rb left;

} else

rb node = rb node->rb right;

}
if (vma)

mm->mmap_cache = vma;

}
}
return vma;

   323