--- include/linux/vmstat.h | 10 ---------- mm/slab.c | 25 ++++++++++--------------- mm/vmstat.c | 36 +++++++++++++++++++----------------- 3 files changed, 29 insertions(+), 42 deletions(-) Index: linux-2.6/mm/slab.c =================================================================== --- linux-2.6.orig/mm/slab.c 2007-04-20 00:49:00.000000000 -0700 +++ linux-2.6/mm/slab.c 2007-04-20 01:06:24.000000000 -0700 @@ -1611,7 +1611,6 @@ __initcall(cpucache_init); static void *kmem_getpages(struct kmem_cache *cachep, gfp_t flags, int nodeid) { struct page *page; - int nr_pages; int i; #ifndef CONFIG_MMU @@ -1628,14 +1627,11 @@ static void *kmem_getpages(struct kmem_c if (!page) return NULL; - nr_pages = (1 << cachep->gfporder); if (cachep->flags & SLAB_RECLAIM_ACCOUNT) - add_zone_page_state(page_zone(page), - NR_SLAB_RECLAIMABLE, nr_pages); + inc_zone_page_state(page, NR_SLAB_RECLAIMABLE); else - add_zone_page_state(page_zone(page), - NR_SLAB_UNRECLAIMABLE, nr_pages); - for (i = 0; i < nr_pages; i++) + inc_zone_page_state(page, NR_SLAB_UNRECLAIMABLE); + for (i = 0; i < (1 << cachep->gfporder); i++) __SetPageSlab(page + i); return page_address(page); } @@ -1647,22 +1643,21 @@ static void kmem_freepages(struct kmem_c { unsigned long i = (1 << cachep->gfporder); struct page *page = virt_to_page(addr); - const unsigned long nr_freed = i; + /* Aint working no compound page !!! */ if (cachep->flags & SLAB_RECLAIM_ACCOUNT) - sub_zone_page_state(page_zone(page), - NR_SLAB_RECLAIMABLE, nr_freed); + dec_zone_page_state(page, NR_SLAB_RECLAIMABLE); else - sub_zone_page_state(page_zone(page), - NR_SLAB_UNRECLAIMABLE, nr_freed); + dec_zone_page_state(page, NR_SLAB_UNRECLAIMABLE); + + if (current->reclaim_state) + current->reclaim_state->reclaimed_slab += i; while (i--) { BUG_ON(!PageSlab(page)); __ClearPageSlab(page); page++; } - if (current->reclaim_state) - current->reclaim_state->reclaimed_slab += nr_freed; - free_pages((unsigned long)addr, cachep->gfporder); + __free_pages(page, cachep->gfporder); } static void kmem_rcu_free(struct rcu_head *head) Index: linux-2.6/mm/vmstat.c =================================================================== --- linux-2.6.orig/mm/vmstat.c 2007-04-20 00:44:28.000000000 -0700 +++ linux-2.6/mm/vmstat.c 2007-04-20 01:04:28.000000000 -0700 @@ -170,20 +170,6 @@ void __mod_zone_page_state(struct zone * EXPORT_SYMBOL(__mod_zone_page_state); /* - * For an unknown interrupt state - */ -void mod_zone_page_state(struct zone *zone, enum zone_stat_item item, - int delta) -{ - unsigned long flags; - - local_irq_save(flags); - __mod_zone_page_state(zone, item, delta); - local_irq_restore(flags); -} -EXPORT_SYMBOL(mod_zone_page_state); - -/* * Optimized increment and decrement functions. * * These are only for a single page and therefore can take a struct page * @@ -223,7 +209,13 @@ void __inc_zone_state(struct zone *zone, void __inc_zone_page_state(struct page *page, enum zone_stat_item item) { - __inc_zone_state(page_zone(page), item); + int order = compound_order(page); + struct zone *zone = page_zone(page); + + if (unlikely(order)) + __mod_zone_page_state(zone, item, 1 << order); + else + __inc_zone_state(zone, item); } EXPORT_SYMBOL(__inc_zone_page_state); @@ -244,7 +236,13 @@ void __dec_zone_state(struct zone *zone, void __dec_zone_page_state(struct page *page, enum zone_stat_item item) { - __dec_zone_state(page_zone(page), item); + int order = compound_order(page); + struct zone *zone = page_zone(page); + + if (unlikely(order)) + __mode_zone_state(zone, item, -(1 << order)); + else + __dec_zone_state(zone, item); } EXPORT_SYMBOL(__dec_zone_page_state); @@ -261,10 +259,14 @@ void inc_zone_page_state(struct page *pa { unsigned long flags; struct zone *zone; + int order = compound_order(page); zone = page_zone(page); local_irq_save(flags); - __inc_zone_state(zone, item); + if (unlikely(order)) + __mod_zone_page_state(zone, item, 1 << order); + else + __inc_zone_state(zone, item); local_irq_restore(flags); } EXPORT_SYMBOL(inc_zone_page_state); Index: linux-2.6/include/linux/vmstat.h =================================================================== --- linux-2.6.orig/include/linux/vmstat.h 2007-04-20 00:44:16.000000000 -0700 +++ linux-2.6/include/linux/vmstat.h 2007-04-20 01:04:00.000000000 -0700 @@ -182,14 +182,6 @@ extern void zone_statistics(struct zonel #endif /* CONFIG_NUMA */ -#define __add_zone_page_state(__z, __i, __d) \ - __mod_zone_page_state(__z, __i, __d) -#define __sub_zone_page_state(__z, __i, __d) \ - __mod_zone_page_state(__z, __i,-(__d)) - -#define add_zone_page_state(__z, __i, __d) mod_zone_page_state(__z, __i, __d) -#define sub_zone_page_state(__z, __i, __d) mod_zone_page_state(__z, __i, -(__d)) - static inline void zap_zone_vm_stats(struct zone *zone) { memset(zone->vm_stat, 0, sizeof(zone->vm_stat)); @@ -202,7 +194,6 @@ void __mod_zone_page_state(struct zone * void __inc_zone_page_state(struct page *, enum zone_stat_item); void __dec_zone_page_state(struct page *, enum zone_stat_item); -void mod_zone_page_state(struct zone *, enum zone_stat_item, int); void inc_zone_page_state(struct page *, enum zone_stat_item); void dec_zone_page_state(struct page *, enum zone_stat_item); @@ -257,7 +248,6 @@ static inline void __dec_zone_page_state */ #define inc_zone_page_state __inc_zone_page_state #define dec_zone_page_state __dec_zone_page_state -#define mod_zone_page_state __mod_zone_page_state static inline void refresh_cpu_vm_stats(int cpu) { } static inline void refresh_vm_stats(void) { }