aboutsummaryrefslogtreecommitdiffstats
path: root/mm
diff options
context:
space:
mode:
authorAndrew Morton <akpm@osdl.org>2004-10-07 17:32:49 -0700
committerLinus Torvalds <torvalds@ppc970.osdl.org>2004-10-07 17:32:49 -0700
commitd3e540588299ff7540fc3cb5cab632a29940ac31 (patch)
tree29c59ee1f8fafc4dfa3352903bb09bd624ac34a4 /mm
parent70d88abf9994ff042b8c715de069ed92fce16cf1 (diff)
downloadhistory-d3e540588299ff7540fc3cb5cab632a29940ac31.tar.gz
[PATCH] vmscan: handle empty zones
There's a lockup condition where kswapd ensounters an empty zone which has all its metadata set to zero. Fix that by adding explicit checks for empty zones and just skip over them. 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.c11
1 files changed, 11 insertions, 0 deletions
diff --git a/mm/vmscan.c b/mm/vmscan.c
index b6f288a49d4cde..a6e04da6154adb 100644
--- a/mm/vmscan.c
+++ b/mm/vmscan.c
@@ -851,6 +851,9 @@ shrink_caches(struct zone **zones, struct scan_control *sc)
for (i = 0; zones[i] != NULL; i++) {
struct zone *zone = zones[i];
+ if (zone->present_pages == 0)
+ continue;
+
zone->temp_priority = sc->priority;
if (zone->prev_priority > sc->priority)
zone->prev_priority = sc->priority;
@@ -1004,6 +1007,9 @@ loop_again:
for (i = pgdat->nr_zones - 1; i >= 0; i--) {
struct zone *zone = pgdat->node_zones + i;
+ if (zone->present_pages == 0)
+ continue;
+
if (zone->all_unreclaimable &&
priority != DEF_PRIORITY)
continue;
@@ -1036,6 +1042,9 @@ scan:
for (i = 0; i <= end_zone; i++) {
struct zone *zone = pgdat->node_zones + i;
+ if (zone->present_pages == 0)
+ continue;
+
if (zone->all_unreclaimable && priority != DEF_PRIORITY)
continue;
@@ -1159,6 +1168,8 @@ static int kswapd(void *p)
*/
void wakeup_kswapd(struct zone *zone)
{
+ if (zone->present_pages == 0)
+ return;
if (zone->free_pages > zone->pages_low)
return;
if (!waitqueue_active(&zone->zone_pgdat->kswapd_wait))