--- mm/slub.c | 20 ++++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) Index: linux-2.6/mm/slub.c =================================================================== --- linux-2.6.orig/mm/slub.c 2007-10-17 15:48:23.000000000 -0700 +++ linux-2.6/mm/slub.c 2007-10-17 15:49:11.000000000 -0700 @@ -841,24 +841,26 @@ static void trace(struct kmem_cache *s, static void add_full(struct kmem_cache *s, struct page *page) { struct kmem_cache_node *n = get_node(s, page_to_nid(page)); + unsigned long flags; - spin_lock(&n->list_lock); + spin_lock_irqsave(&n->list_lock, flags); list_add(&page->lru, &n->full); - spin_unlock(&n->list_lock); + spin_unlock_irqrestore(&n->list_lock, flags); } static void remove_full(struct kmem_cache *s, struct page *page) { struct kmem_cache_node *n; + unsigned long flags; if (!(s->flags & SLAB_STORE_USER)) return; n = get_node(s, page_to_nid(page)); - spin_lock(&n->list_lock); + spin_lock_irqsave(&n->list_lock, flags); list_del(&page->lru); - spin_unlock(&n->list_lock); + spin_unlock_irqrestore(&n->list_lock, flags); } static void setup_object_debug(struct kmem_cache *s, struct page *page, @@ -1239,14 +1241,15 @@ static void add_partial(struct kmem_cach struct page *page, int tail) { struct kmem_cache_node *n = get_node(s, page_to_nid(page)); + unsigned long flags; - spin_lock(&n->list_lock); + spin_lock_irqsave(&n->list_lock, flags); n->nr_partial++; if (tail) list_add_tail(&page->lru, &n->partial); else list_add(&page->lru, &n->partial); - spin_unlock(&n->list_lock); + spin_unlock_irqrestore(&n->list_lock, flags); } /*