diff options
Diffstat (limited to 'mm/sparse.c')
-rw-r--r-- | mm/sparse.c | 26 |
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 @@ | |||
13 | * | 13 | * |
14 | * 1) mem_section - memory sections, mem_map's for valid memory | 14 | * 1) mem_section - memory sections, mem_map's for valid memory |
15 | */ | 15 | */ |
16 | #ifdef CONFIG_ARCH_SPARSEMEM_EXTREME | 16 | #ifdef CONFIG_SPARSEMEM_EXTREME |
17 | struct mem_section *mem_section[NR_SECTION_ROOTS] | 17 | struct mem_section *mem_section[NR_SECTION_ROOTS] |
18 | ____cacheline_maxaligned_in_smp; | 18 | ____cacheline_maxaligned_in_smp; |
19 | #else | ||
20 | struct mem_section mem_section[NR_SECTION_ROOTS][SECTIONS_PER_ROOT] | ||
21 | ____cacheline_maxaligned_in_smp; | ||
22 | #endif | ||
23 | EXPORT_SYMBOL(mem_section); | ||
24 | |||
25 | static void sparse_alloc_root(unsigned long root, int nid) | ||
26 | { | ||
27 | #ifdef CONFIG_SPARSEMEM_EXTREME | ||
28 | mem_section[root] = alloc_bootmem_node(NODE_DATA(nid), PAGE_SIZE); | ||
29 | #endif | ||
30 | } | ||
19 | 31 | ||
20 | static void sparse_index_init(unsigned long section, int nid) | 32 | static void sparse_index_init(unsigned long section, int nid) |
21 | { | 33 | { |
22 | unsigned long root = SECTION_TO_ROOT(section); | 34 | unsigned long root = SECTION_NR_TO_ROOT(section); |
23 | 35 | ||
24 | if (mem_section[root]) | 36 | if (mem_section[root]) |
25 | return; | 37 | return; |
26 | mem_section[root] = alloc_bootmem_node(NODE_DATA(nid), PAGE_SIZE); | 38 | |
39 | sparse_alloc_root(root, nid); | ||
40 | |||
27 | if (mem_section[root]) | 41 | if (mem_section[root]) |
28 | memset(mem_section[root], 0, PAGE_SIZE); | 42 | memset(mem_section[root], 0, PAGE_SIZE); |
29 | else | 43 | else |
30 | panic("memory_present: NO MEMORY\n"); | 44 | panic("memory_present: NO MEMORY\n"); |
31 | } | 45 | } |
32 | #else | ||
33 | struct mem_section mem_section[NR_MEM_SECTIONS] | ||
34 | ____cacheline_maxaligned_in_smp; | ||
35 | #endif | ||
36 | EXPORT_SYMBOL(mem_section); | ||
37 | |||
38 | /* Record a memory area against a node. */ | 46 | /* Record a memory area against a node. */ |
39 | void memory_present(int nid, unsigned long start, unsigned long end) | 47 | void memory_present(int nid, unsigned long start, unsigned long end) |
40 | { | 48 | { |