|
@@ -981,21 +981,21 @@ static void __init __free_pages_boot_core(struct page *page,
|
|
|
|
|
|
#if defined(CONFIG_HAVE_ARCH_EARLY_PFN_TO_NID) || \
|
|
|
defined(CONFIG_HAVE_MEMBLOCK_NODE_MAP)
|
|
|
-/* Only safe to use early in boot when initialisation is single-threaded */
|
|
|
+
|
|
|
static struct mminit_pfnnid_cache early_pfnnid_cache __meminitdata;
|
|
|
|
|
|
int __meminit early_pfn_to_nid(unsigned long pfn)
|
|
|
{
|
|
|
+ static DEFINE_SPINLOCK(early_pfn_lock);
|
|
|
int nid;
|
|
|
|
|
|
- /* The system will behave unpredictably otherwise */
|
|
|
- BUG_ON(system_state != SYSTEM_BOOTING);
|
|
|
-
|
|
|
+ spin_lock(&early_pfn_lock);
|
|
|
nid = __early_pfn_to_nid(pfn, &early_pfnnid_cache);
|
|
|
- if (nid >= 0)
|
|
|
- return nid;
|
|
|
- /* just returns 0 */
|
|
|
- return 0;
|
|
|
+ if (nid < 0)
|
|
|
+ nid = 0;
|
|
|
+ spin_unlock(&early_pfn_lock);
|
|
|
+
|
|
|
+ return nid;
|
|
|
}
|
|
|
#endif
|
|
|
|