Index: linux-2.6.18-rc4/mm/slabifier.c =================================================================== --- linux-2.6.18-rc4.orig/mm/slabifier.c 2006-08-21 17:44:55.198578188 -0700 +++ linux-2.6.18-rc4/mm/slabifier.c 2006-08-21 17:45:14.184710092 -0700 @@ -515,6 +515,7 @@ redo: goto redo; page = lru_to_first_page(&s->partial); list_del(&page->lru); + /* Search list for page from the correct node */ s->nr_partial--; } @@ -971,6 +972,45 @@ static unsigned long slab_objects(struct static void *slab_alloc_node(struct slab_cache *sc, gfp_t flags, int node) { + struct slab *s = (void *)sc; + int cpu = node_to_first_cpu(node); + struct page *page; + void **object = NULL; + void *next_object; + unsigned long flags; + + local_irq_save(flags); + + do { + page = get_and_lock_active(s, cpu); + + if (unlikely(!page)) { + page = reload(s, cpu, gfpflags); + + if (!page) + goto out; + } + if (page_to_nid(page) != node) { + deactivate_slab(page); + continue; + } + + object = get_object_pointer(page); + } while (!object); + + inc_object_counter(page); + next_object = object[s->offset]; + set_object_pointer(page, next_object); + if (likely(!next_object)) + /* Sorry, fully allocated slab! */ + deactivate_slab(s, page); + else + SetPageReferenced(page); + check_free_chain(s, page); + slab_unlock(page); +out: + local_irq_restore(flags); + return object; return slab_alloc(sc, flags); }