aboutsummaryrefslogtreecommitdiffstats
path: root/mm
diff options
context:
space:
mode:
authorNick Piggin <npiggin@suse.de>2006-09-26 02:31:27 -0400
committerLinus Torvalds <torvalds@g5.osdl.org>2006-09-26 11:48:48 -0400
commit408d85441cd5a9bd6bc851d677a10c605ed8db5f (patch)
tree547ba9fbd4000585f14e9fcdd3cf539cde58a25a /mm
parent6ddab3b9ebebc88bfdd8107c64f12d7e4480c559 (diff)
[PATCH] oom: use unreclaimable info
__alloc_pages currently starts shooting if page reclaim has failed to free up swap_cluster_max pages in one run through the priorities. This is not always a good indicator on its own, so make use of the all_unreclaimable logic as well: don't consider going OOM until all zones we're interested in are unreclaimable. Signed-off-by: Nick Piggin <npiggin@suse.de> Signed-off-by: Andrew Morton <akpm@osdl.org> Signed-off-by: Linus Torvalds <torvalds@osdl.org>
Diffstat (limited to 'mm')
-rw-r--r--mm/vmscan.c8
1 files changed, 8 insertions, 0 deletions
diff --git a/mm/vmscan.c b/mm/vmscan.c
index 16180587fd7d..ba18d0c36b83 100644
--- a/mm/vmscan.c
+++ b/mm/vmscan.c
@@ -62,6 +62,8 @@ struct scan_control {
62 int swap_cluster_max; 62 int swap_cluster_max;
63 63
64 int swappiness; 64 int swappiness;
65
66 int all_unreclaimable;
65}; 67};
66 68
67/* 69/*
@@ -925,6 +927,7 @@ static unsigned long shrink_zones(int priority, struct zone **zones,
925 unsigned long nr_reclaimed = 0; 927 unsigned long nr_reclaimed = 0;
926 int i; 928 int i;
927 929
930 sc->all_unreclaimable = 1;
928 for (i = 0; zones[i] != NULL; i++) { 931 for (i = 0; zones[i] != NULL; i++) {
929 struct zone *zone = zones[i]; 932 struct zone *zone = zones[i];
930 933
@@ -941,6 +944,8 @@ static unsigned long shrink_zones(int priority, struct zone **zones,
941 if (zone->all_unreclaimable && priority != DEF_PRIORITY) 944 if (zone->all_unreclaimable && priority != DEF_PRIORITY)
942 continue; /* Let kswapd poll it */ 945 continue; /* Let kswapd poll it */
943 946
947 sc->all_unreclaimable = 0;
948
944 nr_reclaimed += shrink_zone(priority, zone, sc); 949 nr_reclaimed += shrink_zone(priority, zone, sc);
945 } 950 }
946 return nr_reclaimed; 951 return nr_reclaimed;
@@ -1021,6 +1026,9 @@ unsigned long try_to_free_pages(struct zone **zones, gfp_t gfp_mask)
1021 if (sc.nr_scanned && priority < DEF_PRIORITY - 2) 1026 if (sc.nr_scanned && priority < DEF_PRIORITY - 2)
1022 blk_congestion_wait(WRITE, HZ/10); 1027 blk_congestion_wait(WRITE, HZ/10);
1023 } 1028 }
1029 /* top priority shrink_caches still had more to do? don't OOM, then */
1030 if (!sc.all_unreclaimable)
1031 ret = 1;
1024out: 1032out:
1025 for (i = 0; zones[i] != 0; i++) { 1033 for (i = 0; zones[i] != 0; i++) {
1026 struct zone *zone = zones[i]; 1034 struct zone *zone = zones[i];