[PATCH] mm: make shrink_all_memory try harder
authorRafael J. Wysocki <rjw@sisk.pl>
Wed, 22 Mar 2006 08:09:04 +0000 (00:09 -0800)
committerLinus Torvalds <torvalds@g5.osdl.org>
Wed, 22 Mar 2006 15:54:05 +0000 (07:54 -0800)
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 <rjw@sisk.pl>
Cc: Pavel Machek <pavel@ucw.cz>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
mm/vmscan.c

index f713e9f6ac733c07f305e0fce93aa9e1f8f6b6b4..548e023c193b0ae52d94f2d8e4dc753634204ec0 100644 (file)
@@ -33,6 +33,7 @@
 #include <linux/cpuset.h>
 #include <linux/notifier.h>
 #include <linux/rwsem.h>
+#include <linux/delay.h>
 
 #include <asm/tlbflush.h>
 #include <asm/div64.h>
@@ -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;
 }