From: "Rafael J. Wysocki" Make shrink_all_memory() repeat the attempts to free more memory if there seems to be no pages to free. Signed-off-by: Rafael J. Wysocki Cc: Pavel Machek Signed-off-by: Andrew Morton --- mm/vmscan.c | 7 +++++++ 1 files changed, 7 insertions(+) diff -puN mm/vmscan.c~mm-make-shrink_all_memory-try-harder mm/vmscan.c --- devel/mm/vmscan.c~mm-make-shrink_all_memory-try-harder 2006-03-11 02:46:24.000000000 -0800 +++ devel-akpm/mm/vmscan.c 2006-03-11 02:46:24.000000000 -0800 @@ -33,6 +33,7 @@ #include #include #include +#include #include #include @@ -1784,11 +1785,13 @@ unsigned long shrink_all_memory(unsigned pg_data_t *pgdat; unsigned long nr_to_free = nr_pages; unsigned long ret = 0; + unsigned retry = 2; struct reclaim_state reclaim_state = { .reclaimed_slab = 0, }; current->reclaim_state = &reclaim_state; +repeat: for_each_pgdat(pgdat) { unsigned long freed; @@ -1798,6 +1801,10 @@ unsigned long shrink_all_memory(unsigned if ((long)nr_to_free <= 0) break; } + if (retry-- && ret < nr_pages) { + blk_congestion_wait(WRITE, HZ/5); + goto repeat; + } current->reclaim_state = NULL; return ret; } _