|
@@ -899,6 +899,58 @@ void __init __free_pages_bootmem(struct page *page, unsigned long pfn,
|
|
|
__free_pages(page, order);
|
|
|
}
|
|
|
|
|
|
+#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)
|
|
|
+{
|
|
|
+ int nid;
|
|
|
+
|
|
|
+ /* The system will behave unpredictably otherwise */
|
|
|
+ BUG_ON(system_state != SYSTEM_BOOTING);
|
|
|
+
|
|
|
+ nid = __early_pfn_to_nid(pfn, &early_pfnnid_cache);
|
|
|
+ if (nid >= 0)
|
|
|
+ return nid;
|
|
|
+ /* just returns 0 */
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+#endif
|
|
|
+
|
|
|
+#ifdef CONFIG_NODES_SPAN_OTHER_NODES
|
|
|
+static inline bool __meminit meminit_pfn_in_nid(unsigned long pfn, int node,
|
|
|
+ struct mminit_pfnnid_cache *state)
|
|
|
+{
|
|
|
+ int nid;
|
|
|
+
|
|
|
+ nid = __early_pfn_to_nid(pfn, state);
|
|
|
+ if (nid >= 0 && nid != node)
|
|
|
+ return false;
|
|
|
+ return true;
|
|
|
+}
|
|
|
+
|
|
|
+/* Only safe to use early in boot when initialisation is single-threaded */
|
|
|
+static inline bool __meminit early_pfn_in_nid(unsigned long pfn, int node)
|
|
|
+{
|
|
|
+ return meminit_pfn_in_nid(pfn, node, &early_pfnnid_cache);
|
|
|
+}
|
|
|
+
|
|
|
+#else
|
|
|
+
|
|
|
+static inline bool __meminit early_pfn_in_nid(unsigned long pfn, int node)
|
|
|
+{
|
|
|
+ return true;
|
|
|
+}
|
|
|
+static inline bool __meminit meminit_pfn_in_nid(unsigned long pfn, int node,
|
|
|
+ struct mminit_pfnnid_cache *state)
|
|
|
+{
|
|
|
+ return true;
|
|
|
+}
|
|
|
+#endif
|
|
|
+
|
|
|
+
|
|
|
#ifdef CONFIG_CMA
|
|
|
/* Free whole pageblock and set its migration type to MIGRATE_CMA. */
|
|
|
void __init init_cma_reserved_pageblock(struct page *page)
|
|
@@ -4575,43 +4627,6 @@ int __meminit __early_pfn_to_nid(unsigned long pfn,
|
|
|
}
|
|
|
#endif /* CONFIG_HAVE_ARCH_EARLY_PFN_TO_NID */
|
|
|
|
|
|
-static struct mminit_pfnnid_cache early_pfnnid_cache __meminitdata;
|
|
|
-
|
|
|
-/* Only safe to use early in boot when initialisation is single-threaded */
|
|
|
-int __meminit early_pfn_to_nid(unsigned long pfn)
|
|
|
-{
|
|
|
- int nid;
|
|
|
-
|
|
|
- /* The system will behave unpredictably otherwise */
|
|
|
- BUG_ON(system_state != SYSTEM_BOOTING);
|
|
|
-
|
|
|
- nid = __early_pfn_to_nid(pfn, &early_pfnnid_cache);
|
|
|
- if (nid >= 0)
|
|
|
- return nid;
|
|
|
- /* just returns 0 */
|
|
|
- return 0;
|
|
|
-}
|
|
|
-
|
|
|
-#ifdef CONFIG_NODES_SPAN_OTHER_NODES
|
|
|
-bool __meminit meminit_pfn_in_nid(unsigned long pfn, int node,
|
|
|
- struct mminit_pfnnid_cache *state)
|
|
|
-{
|
|
|
- int nid;
|
|
|
-
|
|
|
- nid = __early_pfn_to_nid(pfn, state);
|
|
|
- if (nid >= 0 && nid != node)
|
|
|
- return false;
|
|
|
- return true;
|
|
|
-}
|
|
|
-
|
|
|
-/* Only safe to use early in boot when initialisation is single-threaded */
|
|
|
-bool __meminit early_pfn_in_nid(unsigned long pfn, int node)
|
|
|
-{
|
|
|
- return meminit_pfn_in_nid(pfn, node, &early_pfnnid_cache);
|
|
|
-}
|
|
|
-
|
|
|
-#endif
|
|
|
-
|
|
|
/**
|
|
|
* free_bootmem_with_active_regions - Call memblock_free_early_nid for each active range
|
|
|
* @nid: The node to free memory on. If MAX_NUMNODES, all nodes are freed.
|