diff options
-rw-r--r-- | src/memory/compaction.c | 9 |
1 files changed, 8 insertions, 1 deletions
diff --git a/src/memory/compaction.c b/src/memory/compaction.c index ffa67d58..357ae075 100644 --- a/src/memory/compaction.c +++ b/src/memory/compaction.c @@ -280,7 +280,7 @@ static void compact_validate_zone(struct zone_info *zone, for (order = req_order; order <= MAX_PAGE_ORDER; ++order) available_pages += zone->pages_per_order[order] << order; - if ((1000 - (available_pages * 1000 / zone->free_pages)) >= frag_level) + if (zone->free_pages > 0 && (1000 - (available_pages * 1000 / zone->free_pages)) >= frag_level) current_frag_map |= 1 << req_order; } @@ -324,6 +324,13 @@ static void compaction_verify(struct compact_control *compact) for (n = 0; n < mem_info->zone_count; ++n) { struct zone_info *zone = &mem_info->zones[n]; + /* + * Some devices make a zone but don't allocate any pages for it. + * We can ignore these empty zones. + */ + if (zone->managed <= 0) + continue; + compaction_verify_zone(compact, zone); if (zone->frag_warn & ZONE_FRAG_WARN_RAISE) { /* |