|
@@ -3901,6 +3901,7 @@ static void setup_zone_migrate_reserve(struct zone *zone)
|
|
|
struct page *page;
|
|
|
unsigned long block_migratetype;
|
|
|
int reserve;
|
|
|
+ int old_reserve;
|
|
|
|
|
|
/*
|
|
|
* Get the start pfn, end pfn and the number of blocks to reserve
|
|
@@ -3922,6 +3923,12 @@ static void setup_zone_migrate_reserve(struct zone *zone)
|
|
|
* future allocation of hugepages at runtime.
|
|
|
*/
|
|
|
reserve = min(2, reserve);
|
|
|
+ old_reserve = zone->nr_migrate_reserve_block;
|
|
|
+
|
|
|
+ /* When memory hot-add, we almost always need to do nothing */
|
|
|
+ if (reserve == old_reserve)
|
|
|
+ return;
|
|
|
+ zone->nr_migrate_reserve_block = reserve;
|
|
|
|
|
|
for (pfn = start_pfn; pfn < end_pfn; pfn += pageblock_nr_pages) {
|
|
|
if (!pfn_valid(pfn))
|
|
@@ -3959,6 +3966,12 @@ static void setup_zone_migrate_reserve(struct zone *zone)
|
|
|
reserve--;
|
|
|
continue;
|
|
|
}
|
|
|
+ } else if (!old_reserve) {
|
|
|
+ /*
|
|
|
+ * At boot time we don't need to scan the whole zone
|
|
|
+ * for turning off MIGRATE_RESERVE.
|
|
|
+ */
|
|
|
+ break;
|
|
|
}
|
|
|
|
|
|
/*
|