--- vmscan.c.~1~ 2003-09-16 20:44:14.000000000 -0400 +++ vmscan.c 2003-09-17 18:23:03.000000000 -0400 @@ -364,6 +364,20 @@ return 0; } +static void shrink_vfs_caches(int force, unsigned int gfp_mask) +{ + static unsigned long last_scan = 0; + + if (force || time_after(jiffies, last_scan + 5*HZ)) { + shrink_dcache_memory(vm_vfs_scan_ratio, gfp_mask); + shrink_icache_memory(vm_vfs_scan_ratio, gfp_mask); +#ifdef CONFIG_QUOTA + shrink_dqcache_memory(vm_vfs_scan_ratio, gfp_mask); +#endif + last_scan = jiffies; + } +} + static void FASTCALL(refill_inactive(int nr_pages, zone_t * classzone)); static int FASTCALL(shrink_cache(int nr_pages, zone_t * classzone, unsigned int gfp_mask, int * failed_swapout)); static int shrink_cache(int nr_pages, zone_t * classzone, unsigned int gfp_mask, int * failed_swapout) @@ -372,7 +386,7 @@ int max_scan = (classzone->nr_inactive_pages + classzone->nr_active_pages) / vm_cache_scan_ratio; int max_mapped = vm_mapped_ratio * nr_pages; - while (max_scan && classzone->nr_inactive_pages && (entry = inactive_list.prev) != &inactive_list) { + while (--max_scan >= 0 && classzone->nr_inactive_pages && (entry = inactive_list.prev) != &inactive_list) { struct page * page; if (unlikely(current->need_resched)) { @@ -516,11 +530,7 @@ if (nr_pages <= 0) goto out; - shrink_dcache_memory(vm_vfs_scan_ratio, gfp_mask); - shrink_icache_memory(vm_vfs_scan_ratio, gfp_mask); -#ifdef CONFIG_QUOTA - shrink_dqcache_memory(vm_vfs_scan_ratio, gfp_mask); -#endif + shrink_vfs_caches(*failed_swapout, gfp_mask); if (!*failed_swapout) *failed_swapout = !swap_out(classzone); @@ -614,6 +624,8 @@ if (nr_pages <= 0) goto out; + shrink_vfs_caches(0, gfp_mask); + spin_lock(&pagemap_lru_lock); refill_inactive(nr_pages, classzone); @@ -638,11 +650,9 @@ nr_pages = shrink_caches(classzone, gfp_mask, nr_pages, &failed_swapout); if (nr_pages <= 0) return 1; - shrink_dcache_memory(vm_vfs_scan_ratio, gfp_mask); - shrink_icache_memory(vm_vfs_scan_ratio, gfp_mask); -#ifdef CONFIG_QUOTA - shrink_dqcache_memory(vm_vfs_scan_ratio, gfp_mask); -#endif + + shrink_vfs_caches(1, gfp_mask); + if (!failed_swapout) failed_swapout = !swap_out(classzone); } while (--tries);