
From: Manfred Spraul <manfred@colorfullife.com>

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);
 

_
