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 | { |
