]> git.neil.brown.name Git - history.git/commitdiff
[PATCH] vmscan: handle empty zones
authorAndrew Morton <akpm@osdl.org>
Fri, 8 Oct 2004 00:32:49 +0000 (17:32 -0700)
committerLinus Torvalds <torvalds@ppc970.osdl.org>
Fri, 8 Oct 2004 00:32:49 +0000 (17:32 -0700)
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>
mm/vmscan.c

index b6f288a49d4cde5771198a359b5d6b630dbbecd5..a6e04da6154adbe52fd283076177b44c6c8b5f5e 100644 (file)
@@ -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))