|
@@ -291,28 +291,37 @@ EXPORT_SYMBOL(nr_online_nodes);
|
|
|
int page_group_by_mobility_disabled __read_mostly;
|
|
|
|
|
|
#ifdef CONFIG_DEFERRED_STRUCT_PAGE_INIT
|
|
|
+
|
|
|
+/*
|
|
|
+ * Determine how many pages need to be initialized durig early boot
|
|
|
+ * (non-deferred initialization).
|
|
|
+ * The value of first_deferred_pfn will be set later, once non-deferred pages
|
|
|
+ * are initialized, but for now set it ULONG_MAX.
|
|
|
+ */
|
|
|
static inline void reset_deferred_meminit(pg_data_t *pgdat)
|
|
|
{
|
|
|
- unsigned long max_initialise;
|
|
|
- unsigned long reserved_lowmem;
|
|
|
+ phys_addr_t start_addr, end_addr;
|
|
|
+ unsigned long max_pgcnt;
|
|
|
+ unsigned long reserved;
|
|
|
|
|
|
/*
|
|
|
* Initialise at least 2G of a node but also take into account that
|
|
|
* two large system hashes that can take up 1GB for 0.25TB/node.
|
|
|
*/
|
|
|
- max_initialise = max(2UL << (30 - PAGE_SHIFT),
|
|
|
- (pgdat->node_spanned_pages >> 8));
|
|
|
+ max_pgcnt = max(2UL << (30 - PAGE_SHIFT),
|
|
|
+ (pgdat->node_spanned_pages >> 8));
|
|
|
|
|
|
/*
|
|
|
* Compensate the all the memblock reservations (e.g. crash kernel)
|
|
|
* from the initial estimation to make sure we will initialize enough
|
|
|
* memory to boot.
|
|
|
*/
|
|
|
- reserved_lowmem = memblock_reserved_memory_within(pgdat->node_start_pfn,
|
|
|
- pgdat->node_start_pfn + max_initialise);
|
|
|
- max_initialise += reserved_lowmem;
|
|
|
+ start_addr = PFN_PHYS(pgdat->node_start_pfn);
|
|
|
+ end_addr = PFN_PHYS(pgdat->node_start_pfn + max_pgcnt);
|
|
|
+ reserved = memblock_reserved_memory_within(start_addr, end_addr);
|
|
|
+ max_pgcnt += PHYS_PFN(reserved);
|
|
|
|
|
|
- pgdat->static_init_size = min(max_initialise, pgdat->node_spanned_pages);
|
|
|
+ pgdat->static_init_pgcnt = min(max_pgcnt, pgdat->node_spanned_pages);
|
|
|
pgdat->first_deferred_pfn = ULONG_MAX;
|
|
|
}
|
|
|
|
|
@@ -339,7 +348,7 @@ static inline bool update_defer_init(pg_data_t *pgdat,
|
|
|
if (zone_end < pgdat_end_pfn(pgdat))
|
|
|
return true;
|
|
|
(*nr_initialised)++;
|
|
|
- if ((*nr_initialised > pgdat->static_init_size) &&
|
|
|
+ if ((*nr_initialised > pgdat->static_init_pgcnt) &&
|
|
|
(pfn & (PAGES_PER_SECTION - 1)) == 0) {
|
|
|
pgdat->first_deferred_pfn = pfn;
|
|
|
return false;
|