OSDN Git Service

mm/compaction: fix invalid free_pfn and compact_cached_free_pfn
[uclinux-h8/linux.git] / mm / compaction.c
index 585de54..56fa321 100644 (file)
@@ -200,7 +200,8 @@ static void reset_cached_positions(struct zone *zone)
 {
        zone->compact_cached_migrate_pfn[0] = zone->zone_start_pfn;
        zone->compact_cached_migrate_pfn[1] = zone->zone_start_pfn;
-       zone->compact_cached_free_pfn = zone_end_pfn(zone);
+       zone->compact_cached_free_pfn =
+                       round_down(zone_end_pfn(zone) - 1, pageblock_nr_pages);
 }
 
 /*
@@ -1371,11 +1372,11 @@ static int compact_zone(struct zone *zone, struct compact_control *cc)
         */
        cc->migrate_pfn = zone->compact_cached_migrate_pfn[sync];
        cc->free_pfn = zone->compact_cached_free_pfn;
-       if (cc->free_pfn < start_pfn || cc->free_pfn > end_pfn) {
-               cc->free_pfn = end_pfn & ~(pageblock_nr_pages-1);
+       if (cc->free_pfn < start_pfn || cc->free_pfn >= end_pfn) {
+               cc->free_pfn = round_down(end_pfn - 1, pageblock_nr_pages);
                zone->compact_cached_free_pfn = cc->free_pfn;
        }
-       if (cc->migrate_pfn < start_pfn || cc->migrate_pfn > end_pfn) {
+       if (cc->migrate_pfn < start_pfn || cc->migrate_pfn >= end_pfn) {
                cc->migrate_pfn = start_pfn;
                zone->compact_cached_migrate_pfn[0] = cc->migrate_pfn;
                zone->compact_cached_migrate_pfn[1] = cc->migrate_pfn;