|
|
@@ -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;
|