diff options
author | Andrew Morton <akpm@osdl.org> | 2004-10-07 17:32:49 -0700 |
---|---|---|
committer | Linus Torvalds <torvalds@ppc970.osdl.org> | 2004-10-07 17:32:49 -0700 |
commit | d3e540588299ff7540fc3cb5cab632a29940ac31 (patch) | |
tree | 29c59ee1f8fafc4dfa3352903bb09bd624ac34a4 /mm | |
parent | 70d88abf9994ff042b8c715de069ed92fce16cf1 (diff) | |
download | history-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.c | 11 |
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)) |