Index: linux-2.6.15-rc3/mm/swap_state.c =================================================================== --- linux-2.6.15-rc3.orig/mm/swap_state.c 2005-11-30 23:41:08.000000000 -0800 +++ linux-2.6.15-rc3/mm/swap_state.c 2005-11-30 23:43:00.000000000 -0800 @@ -84,7 +84,6 @@ static int __add_to_swap_cache(struct pa SetPageSwapCache(page); set_page_private(page, entry.val); total_swapcache_pages++; - pagecache_acct(1); inc_node_page_state(page_to_nid(page), n_pagecache); } write_unlock_irq(&swapper_space.tree_lock); @@ -130,7 +129,6 @@ void __delete_from_swap_cache(struct pag set_page_private(page, 0); ClearPageSwapCache(page); total_swapcache_pages--; - pagecache_acct(-1); dec_node_page_state(page_to_nid(page), n_pagecache); INC_CACHE_INFO(del_total); } Index: linux-2.6.15-rc3/include/linux/pagemap.h =================================================================== --- linux-2.6.15-rc3.orig/include/linux/pagemap.h 2005-11-28 19:51:27.000000000 -0800 +++ linux-2.6.15-rc3/include/linux/pagemap.h 2005-11-30 23:43:46.000000000 -0800 @@ -99,49 +99,9 @@ int add_to_page_cache_lru(struct page *p extern void remove_from_page_cache(struct page *page); extern void __remove_from_page_cache(struct page *page); -extern atomic_t nr_pagecache; - -#ifdef CONFIG_SMP - -#define PAGECACHE_ACCT_THRESHOLD max(16, NR_CPUS * 2) -DECLARE_PER_CPU(long, nr_pagecache_local); - -/* - * pagecache_acct implements approximate accounting for pagecache. - * vm_enough_memory() do not need high accuracy. Writers will keep - * an offset in their per-cpu arena and will spill that into the - * global count whenever the absolute value of the local count - * exceeds the counter's threshold. - * - * MUST be protected from preemption. - * current protection is mapping->page_lock. - */ -static inline void pagecache_acct(int count) -{ - long *local; - - local = &__get_cpu_var(nr_pagecache_local); - *local += count; - if (*local > PAGECACHE_ACCT_THRESHOLD || *local < -PAGECACHE_ACCT_THRESHOLD) { - atomic_add(*local, &nr_pagecache); - *local = 0; - } -} - -#else - -static inline void pagecache_acct(int count) -{ - atomic_add(count, &nr_pagecache); -} -#endif - static inline unsigned long get_page_cache_size(void) { - int ret = atomic_read(&nr_pagecache); - if (unlikely(ret < 0)) - ret = 0; - return ret; + return global_stat[NR_PAGECACHE]; } /* Index: linux-2.6.15-rc3/mm/filemap.c =================================================================== --- linux-2.6.15-rc3.orig/mm/filemap.c 2005-11-30 23:41:08.000000000 -0800 +++ linux-2.6.15-rc3/mm/filemap.c 2005-11-30 23:43:00.000000000 -0800 @@ -115,7 +115,6 @@ void __remove_from_page_cache(struct pag radix_tree_delete(&mapping->page_tree, page->index); page->mapping = NULL; mapping->nrpages--; - pagecache_acct(-1); dec_node_page_state(page_to_nid(page), n_pagecache); } @@ -391,7 +390,6 @@ int add_to_page_cache(struct page *page, page->mapping = mapping; page->index = offset; mapping->nrpages++; - pagecache_acct(1); inc_node_page_state(page_to_nid(page), n_pagecache); } write_unlock_irq(&mapping->tree_lock);