--- linux-2.6-npiggin/mm/vmscan.c | 9 +++++++-- 1 files changed, 7 insertions(+), 2 deletions(-) diff -puN mm/vmscan.c~vm-no-wild-kswapd2 mm/vmscan.c --- linux-2.6/mm/vmscan.c~vm-no-wild-kswapd2 2004-09-29 10:30:49.000000000 +1000 +++ linux-2.6-npiggin/mm/vmscan.c 2004-09-29 10:34:00.000000000 +1000 @@ -991,6 +991,7 @@ out: static int balance_pgdat(pg_data_t *pgdat, int nr_pages) { int to_free = nr_pages; + int all_zones_ok; int priority; int i; int total_scanned, total_reclaimed; @@ -1013,10 +1014,11 @@ loop_again: } for (priority = DEF_PRIORITY; priority >= 0; priority--) { - int all_zones_ok = 1; int end_zone = 0; /* Inclusive. 0 = ZONE_DMA */ unsigned long lru_pages = 0; + all_zones_ok = 1; + if (nr_pages == 0) { /* * Scan in the highmem->dma direction for the highest @@ -1106,7 +1108,7 @@ scan: * on zone->*_priority. */ if (total_reclaimed >= SWAP_CLUSTER_MAX) - goto loop_again; + break; } out: for (i = 0; i < pgdat->nr_zones; i++) { @@ -1114,6 +1116,9 @@ out: zone->prev_priority = zone->temp_priority; } + if (!all_zones_ok) + goto loop_again; + return total_reclaimed; } _