From: Nick Piggin In try_to_free_pages(), put even pressure on the slab even if we have reclaimed enough pages from the LRU. --- mm/vmscan.c | 14 +++++++------- 1 files changed, 7 insertions(+), 7 deletions(-) diff -puN mm/vmscan.c~try_to_free_pages-shrink_slab-evenness mm/vmscan.c --- 25/mm/vmscan.c~try_to_free_pages-shrink_slab-evenness 2004-02-28 23:37:59.000000000 -0800 +++ 25-akpm/mm/vmscan.c 2004-02-28 23:37:59.000000000 -0800 @@ -877,6 +877,13 @@ int try_to_free_pages(struct zone **zone get_page_state(&ps); nr_reclaimed += shrink_caches(zones, priority, &total_scanned, gfp_mask, nr_pages, &ps); + if (zones[0] - zones[0]->zone_pgdat->node_zones < ZONE_HIGHMEM) { + shrink_slab(total_scanned, gfp_mask); + if (reclaim_state) { + nr_reclaimed += reclaim_state->reclaimed_slab; + reclaim_state->reclaimed_slab = 0; + } + } if (nr_reclaimed >= nr_pages) { ret = 1; goto out; @@ -892,13 +899,6 @@ int try_to_free_pages(struct zone **zone /* Take a nap, wait for some writeback to complete */ blk_congestion_wait(WRITE, HZ/10); - if (zones[0] - zones[0]->zone_pgdat->node_zones < ZONE_HIGHMEM) { - shrink_slab(total_scanned, gfp_mask); - if (reclaim_state) { - nr_reclaimed += reclaim_state->reclaimed_slab; - reclaim_state->reclaimed_slab = 0; - } - } } if ((gfp_mask & __GFP_FS) && !(gfp_mask & __GFP_NORETRY)) out_of_memory(); _