|
@@ -1506,7 +1506,7 @@ static void __init deferred_free_pages(int nid, int zid, unsigned long pfn,
|
|
|
} else if (!(pfn & nr_pgmask)) {
|
|
|
deferred_free_range(pfn - nr_free, nr_free);
|
|
|
nr_free = 1;
|
|
|
- cond_resched();
|
|
|
+ touch_nmi_watchdog();
|
|
|
} else {
|
|
|
nr_free++;
|
|
|
}
|
|
@@ -1535,7 +1535,7 @@ static unsigned long __init deferred_init_pages(int nid, int zid,
|
|
|
continue;
|
|
|
} else if (!page || !(pfn & nr_pgmask)) {
|
|
|
page = pfn_to_page(pfn);
|
|
|
- cond_resched();
|
|
|
+ touch_nmi_watchdog();
|
|
|
} else {
|
|
|
page++;
|
|
|
}
|
|
@@ -1552,23 +1552,25 @@ static int __init deferred_init_memmap(void *data)
|
|
|
int nid = pgdat->node_id;
|
|
|
unsigned long start = jiffies;
|
|
|
unsigned long nr_pages = 0;
|
|
|
- unsigned long spfn, epfn;
|
|
|
+ unsigned long spfn, epfn, first_init_pfn, flags;
|
|
|
phys_addr_t spa, epa;
|
|
|
int zid;
|
|
|
struct zone *zone;
|
|
|
- unsigned long first_init_pfn = pgdat->first_deferred_pfn;
|
|
|
const struct cpumask *cpumask = cpumask_of_node(pgdat->node_id);
|
|
|
u64 i;
|
|
|
|
|
|
+ /* Bind memory initialisation thread to a local node if possible */
|
|
|
+ if (!cpumask_empty(cpumask))
|
|
|
+ set_cpus_allowed_ptr(current, cpumask);
|
|
|
+
|
|
|
+ pgdat_resize_lock(pgdat, &flags);
|
|
|
+ first_init_pfn = pgdat->first_deferred_pfn;
|
|
|
if (first_init_pfn == ULONG_MAX) {
|
|
|
+ pgdat_resize_unlock(pgdat, &flags);
|
|
|
pgdat_init_report_one_done();
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
- /* Bind memory initialisation thread to a local node if possible */
|
|
|
- if (!cpumask_empty(cpumask))
|
|
|
- set_cpus_allowed_ptr(current, cpumask);
|
|
|
-
|
|
|
/* Sanity check boundaries */
|
|
|
BUG_ON(pgdat->first_deferred_pfn < pgdat->node_start_pfn);
|
|
|
BUG_ON(pgdat->first_deferred_pfn > pgdat_end_pfn(pgdat));
|
|
@@ -1598,6 +1600,7 @@ static int __init deferred_init_memmap(void *data)
|
|
|
epfn = min_t(unsigned long, zone_end_pfn(zone), PFN_DOWN(epa));
|
|
|
deferred_free_pages(nid, zid, spfn, epfn);
|
|
|
}
|
|
|
+ pgdat_resize_unlock(pgdat, &flags);
|
|
|
|
|
|
/* Sanity check that the next zone really is unpopulated */
|
|
|
WARN_ON(++zid < MAX_NR_ZONES && populated_zone(++zone));
|