From: Manfred Spraul if alloc_slabmgmt fails, then kmem_freepages() calls sub_page_state(), altough nr_slab was not yet increased. The attached patch fixes that by moving the inc_page_state into kmem_getpages(). include/linux/page-flags.h | 1 + mm/slab.c | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff -puN include/linux/page-flags.h~nr-slab-accounting-fix include/linux/page-flags.h --- 25/include/linux/page-flags.h~nr-slab-accounting-fix 2003-12-14 23:30:17.000000000 -0800 +++ 25-akpm/include/linux/page-flags.h 2003-12-14 23:30:17.000000000 -0800 @@ -133,6 +133,7 @@ extern void get_full_page_state(struct p #define inc_page_state(member) mod_page_state(member, 1UL) #define dec_page_state(member) mod_page_state(member, 0UL - 1) +#define add_page_state(member,delta) mod_page_state(member, (delta)) #define sub_page_state(member,delta) mod_page_state(member, 0UL - (delta)) diff -puN mm/slab.c~nr-slab-accounting-fix mm/slab.c --- 25/mm/slab.c~nr-slab-accounting-fix 2003-12-14 23:30:17.000000000 -0800 +++ 25-akpm/mm/slab.c 2003-12-14 23:30:57.000000000 -0800 @@ -812,6 +812,7 @@ static inline void *kmem_getpages(kmem_c if (cachep->flags & SLAB_RECLAIM_ACCOUNT) atomic_add(i, &slab_reclaim_pages); + add_page_state(nr_slab, i); while (i--) { SetPageSlab(page); page++; @@ -1608,7 +1609,6 @@ static int cache_grow (kmem_cache_t * ca do { SET_PAGE_CACHE(page, cachep); SET_PAGE_SLAB(page, slabp); - inc_page_state(nr_slab); page++; } while (--i); _