aboutsummaryrefslogtreecommitdiffstats
path: root/mm/sparse.c
diff options
context:
space:
mode:
authorBob Picco <bob.picco@hp.com>2005-09-03 18:54:28 -0400
committerLinus Torvalds <torvalds@evo.osdl.org>2005-09-05 03:05:38 -0400
commit3e347261a80b57df792ab9464b5f0ed59add53a8 (patch)
tree047b35e0f9ec82b3beeff882a9af6292a500097c /mm/sparse.c
parent802f192e4a600f7ef84ca25c8b818c8830acef5a (diff)
[PATCH] sparsemem extreme implementation
With cleanups from Dave Hansen <haveblue@us.ibm.com> SPARSEMEM_EXTREME makes mem_section a one dimensional array of pointers to mem_sections. This two level layout scheme is able to achieve smaller memory requirements for SPARSEMEM with the tradeoff of an additional shift and load when fetching the memory section. The current SPARSEMEM implementation is a one dimensional array of mem_sections which is the default SPARSEMEM configuration. The patch attempts isolates the implementation details of the physical layout of the sparsemem section array. SPARSEMEM_EXTREME requires bootmem to be functioning at the time of memory_present() calls. This is not always feasible, so architectures which do not need it may allocate everything statically by using SPARSEMEM_STATIC. Signed-off-by: Andy Whitcroft <apw@shadowen.org> Signed-off-by: Bob Picco <bob.picco@hp.com> Signed-off-by: Dave Hansen <haveblue@us.ibm.com> Signed-off-by: Andrew Morton <akpm@osdl.org> Signed-off-by: Linus Torvalds <torvalds@osdl.org>
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 @@
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
17struct mem_section *mem_section[NR_SECTION_ROOTS] 17struct mem_section *mem_section[NR_SECTION_ROOTS]
18 ____cacheline_maxaligned_in_smp; 18 ____cacheline_maxaligned_in_smp;
19#else
20struct mem_section mem_section[NR_SECTION_ROOTS][SECTIONS_PER_ROOT]
21 ____cacheline_maxaligned_in_smp;
22#endif
23EXPORT_SYMBOL(mem_section);
24
25static 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
20static void sparse_index_init(unsigned long section, int nid) 32static 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
33struct mem_section mem_section[NR_MEM_SECTIONS]
34 ____cacheline_maxaligned_in_smp;
35#endif
36EXPORT_SYMBOL(mem_section);
37
38/* Record a memory area against a node. */ 46/* Record a memory area against a node. */
39void memory_present(int nid, unsigned long start, unsigned long end) 47void memory_present(int nid, unsigned long start, unsigned long end)
40{ 48{