--- linux/mm/vmscan.c.orig Sat Jul 11 09:13:37 1998 +++ linux/mm/vmscan.c Sat Jul 11 09:26:18 1998 @@ -448,7 +448,7 @@ { static int state = 0; int i=6; - int stop; + int stop, shrink = 0; /* Always trim SLAB caches when memory gets low. */ kmem_cache_reap(gfp_mask); @@ -458,14 +458,19 @@ if (gfp_mask & __GFP_WAIT) stop = 0; if (((buffermem >> PAGE_SHIFT) * 100 > buffer_mem.borrow_percent * num_physpages) - || (page_cache_size * 100 > page_cache.borrow_percent * num_physpages)) + || (page_cache_size * 100 > page_cache.borrow_percent * num_physpages)) { state = 0; + shrink = i - stop; + } switch (state) { do { case 0: - if (shrink_mmap(i, gfp_mask)) - return 1; + do { + if (shrink_mmap(i, gfp_mask)) + return 1; + if (shrink) shrink--; + } while (shrink); state = 1; case 1: if ((gfp_mask & __GFP_IO) && shm_swap(i, gfp_mask))