flags |= cachep->gfpflags;

if (likely(nodeid ==-1) ) {

addr = (void*)_get_free_pages(flags, cachep->gfporder);

if (iaddr)

return NULL;

page = virt_to_page(addr);

} else {

page = alloc pages node(nodeid, flags, cachep->gfporder);

if (!page)

return NULL;

addr = page_address(page) ;

i = (1  cachep->gfporder) ;

if (cachep->flags & SLAB_RECLAIM_ACCOUNT)

atomic_add(i, &slab_reclaim_pages); ,
add page state(nr_slab, i) ;

while (i--) {

SetPageSlab(page) ;

page++;

}
return addr;

}

       ,  
   .    ,  -
   __get_free_pages () .     , 
         
 .       , 
         -
  flags.        -
   cachep->gfporder.     , 
   ,      NUMA-
(Non-Uniform Memory Access,      ).  -
 nodeid   -1,       
  ,    .    
    NUMA-.    
       .

     ,   NUMA-,
      kmem_getpages ()   .

static inline void * kmem getpages(kmem cache t *cachep, unsigned long flags)
(

void *addr;

flags |= cachep->gfpflags;

addr = (void*) _get_free_pages (flags, cachep->gfporder);

return addr;

}

  251