Index: linux-2.6.15-rc3/mm/rmap.c =================================================================== --- linux-2.6.15-rc3.orig/mm/rmap.c 2005-11-29 03:51:27.000000000 +0000 +++ linux-2.6.15-rc3/mm/rmap.c 2005-11-29 20:34:07.000000000 +0000 @@ -496,6 +496,20 @@ void page_remove_rmap(struct page *page) if (page_test_and_clear_dirty(page)) set_page_dirty(page); dec_page_state(nr_mapped); + + /* Once in a while check if the pagecache became too big + * and kswapd needs to be run + */ + if ((nr_mapped & PAGE_MASK) == 0) { + unsigned long pagecache, mapped; + struct zone *zone = page_zone(page); + + pagecache = get_page_state(nr_pagecache); + mapped = get_page_state(nr_mapped); + + if (pagecache - mapped > sysctl_pagecache_limit[page_zonenum(page)]) + wakeup_kswapd(zone, 0); + } } } Index: linux-2.6.15-rc3/mm/vmscan.c =================================================================== --- linux-2.6.15-rc3.orig/mm/vmscan.c 2005-11-29 03:51:27.000000000 +0000 +++ linux-2.6.15-rc3/mm/vmscan.c 2005-11-29 20:34:07.000000000 +0000 @@ -1056,7 +1056,7 @@ loop_again: sc.gfp_mask = GFP_KERNEL; sc.may_writepage = 0; sc.may_swap = 1; - sc.nr_mapped = read_page_state(nr_mapped); + sc.nr_mapped = read_page_state_node(nr_mapped); inc_page_state(pageoutrun);