aboutsummaryrefslogtreecommitdiffstats
path: root/mm/sparse.c
diff options
context:
space:
mode:
Diffstat (limited to 'mm/sparse.c')
-rw-r--r--mm/sparse.c26
1 files changed, 17 insertions, 9 deletions
diff --git a/mm/sparse.c b/mm/sparse.c
index b2b456bf0a5d..fa01292157a9 100644
--- a/mm/sparse.c
+++ b/mm/sparse.c
@@ -13,28 +13,36 @@
*
* 1) mem_section - memory sections, mem_map's for valid memory
*/
-#ifdef CONFIG_ARCH_SPARSEMEM_EXTREME
+#ifdef CONFIG_SPARSEMEM_EXTREME
struct mem_section *mem_section[NR_SECTION_ROOTS]
____cacheline_maxaligned_in_smp;
+#else
+struct mem_section mem_section[NR_SECTION_ROOTS][SECTIONS_PER_ROOT]
+ ____cacheline_maxaligned_in_smp;
+#endif
+EXPORT_SYMBOL(mem_section);
+
+static void sparse_alloc_root(unsigned long root, int nid)
+{
+#ifdef CONFIG_SPARSEMEM_EXTREME
+ mem_section[root] = alloc_bootmem_node(NODE_DATA(nid), PAGE_SIZE);
+#endif
+}
static void sparse_index_init(unsigned long section, int nid)
{
- unsigned long root = SECTION_TO_ROOT(section);
+ unsigned long root = SECTION_NR_TO_ROOT(section);
if (mem_section[root])
return;
- mem_section[root] = alloc_bootmem_node(NODE_DATA(nid), PAGE_SIZE);
+
+ sparse_alloc_root(root, nid);
+
if (mem_section[root])
memset(mem_section[root], 0, PAGE_SIZE);
else
panic("memory_present: NO MEMORY\n");
}
-#else
-struct mem_section mem_section[NR_MEM_SECTIONS]
- ____cacheline_maxaligned_in_smp;
-#endif
-EXPORT_SYMBOL(mem_section);
-
/* Record a memory area against a node. */
void memory_present(int nid, unsigned long start, unsigned long end)
{