|
@@ -1144,9 +1144,10 @@ extern unsigned long usemap_size(void);
|
|
|
*/
|
|
|
#define SECTION_MARKED_PRESENT (1UL<<0)
|
|
|
#define SECTION_HAS_MEM_MAP (1UL<<1)
|
|
|
-#define SECTION_MAP_LAST_BIT (1UL<<2)
|
|
|
+#define SECTION_IS_ONLINE (1UL<<2)
|
|
|
+#define SECTION_MAP_LAST_BIT (1UL<<3)
|
|
|
#define SECTION_MAP_MASK (~(SECTION_MAP_LAST_BIT-1))
|
|
|
-#define SECTION_NID_SHIFT 2
|
|
|
+#define SECTION_NID_SHIFT 3
|
|
|
|
|
|
static inline struct page *__section_mem_map_addr(struct mem_section *section)
|
|
|
{
|
|
@@ -1175,6 +1176,23 @@ static inline int valid_section_nr(unsigned long nr)
|
|
|
return valid_section(__nr_to_section(nr));
|
|
|
}
|
|
|
|
|
|
+static inline int online_section(struct mem_section *section)
|
|
|
+{
|
|
|
+ return (section && (section->section_mem_map & SECTION_IS_ONLINE));
|
|
|
+}
|
|
|
+
|
|
|
+static inline int online_section_nr(unsigned long nr)
|
|
|
+{
|
|
|
+ return online_section(__nr_to_section(nr));
|
|
|
+}
|
|
|
+
|
|
|
+#ifdef CONFIG_MEMORY_HOTPLUG
|
|
|
+void online_mem_sections(unsigned long start_pfn, unsigned long end_pfn);
|
|
|
+#ifdef CONFIG_MEMORY_HOTREMOVE
|
|
|
+void offline_mem_sections(unsigned long start_pfn, unsigned long end_pfn);
|
|
|
+#endif
|
|
|
+#endif
|
|
|
+
|
|
|
static inline struct mem_section *__pfn_to_section(unsigned long pfn)
|
|
|
{
|
|
|
return __nr_to_section(pfn_to_section_nr(pfn));
|
|
@@ -1253,10 +1271,15 @@ unsigned long __init node_memmap_size_bytes(int, unsigned long, unsigned long);
|
|
|
#ifdef CONFIG_ARCH_HAS_HOLES_MEMORYMODEL
|
|
|
/*
|
|
|
* pfn_valid() is meant to be able to tell if a given PFN has valid memmap
|
|
|
- * associated with it or not. In FLATMEM, it is expected that holes always
|
|
|
- * have valid memmap as long as there is valid PFNs either side of the hole.
|
|
|
- * In SPARSEMEM, it is assumed that a valid section has a memmap for the
|
|
|
- * entire section.
|
|
|
+ * associated with it or not. This means that a struct page exists for this
|
|
|
+ * pfn. The caller cannot assume the page is fully initialized in general.
|
|
|
+ * Hotplugable pages might not have been onlined yet. pfn_to_online_page()
|
|
|
+ * will ensure the struct page is fully online and initialized. Special pages
|
|
|
+ * (e.g. ZONE_DEVICE) are never onlined and should be treated accordingly.
|
|
|
+ *
|
|
|
+ * In FLATMEM, it is expected that holes always have valid memmap as long as
|
|
|
+ * there is valid PFNs either side of the hole. In SPARSEMEM, it is assumed
|
|
|
+ * that a valid section has a memmap for the entire section.
|
|
|
*
|
|
|
* However, an ARM, and maybe other embedded architectures in the future
|
|
|
* free memmap backing holes to save memory on the assumption the memmap is
|