From: Rafael J. Wysocki Date: Wed, 22 Mar 2006 08:09:04 +0000 (-0800) Subject: [PATCH] mm: make shrink_all_memory try harder X-Git-Url: http://git.cdn.openwrt.org/?a=commitdiff_plain;h=248a0301e703cbf781aa02a91bcfc6da75870dd7;p=openwrt%2Fstaging%2Fblogic.git [PATCH] mm: make shrink_all_memory try harder 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 Signed-off-by: Linus Torvalds --- diff --git a/mm/vmscan.c b/mm/vmscan.c index f713e9f6ac73..548e023c193b 100644 --- a/mm/vmscan.c +++ b/mm/vmscan.c @@ -33,6 +33,7 @@ #include #include #include +#include #include #include @@ -1784,11 +1785,13 @@ unsigned long shrink_all_memory(unsigned long nr_pages) 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 long nr_pages) 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; }