diff options
author | Anton Blanchard <anton@samba.org> | 2005-11-10 22:22:35 -0500 |
---|---|---|
committer | Paul Mackerras <paulus@samba.org> | 2005-11-11 06:21:11 -0500 |
commit | 45fb6cea09443b2066016f895937f9c2647a1507 (patch) | |
tree | 8abd2e14c0e096d583e6dc5151d0669db9227359 /include/asm-ppc64/mmzone.h | |
parent | 3e66c4def14aa64ee6d1d4ef077d789abc30125d (diff) |
[PATCH] ppc64: Convert NUMA to sparsemem (3)
Convert to sparsemem and remove all the discontigmem code in the
process. This has a few advantages:
- The old numa_memory_lookup_table can go away
- All the arch specific discontigmem magic can go away
We also remove the triple pass of memory properties and instead create a
list of per node extents that we iterate through. A final cleanup would
be to change our lmb code to store extents per node, then we can reuse
that information in the numa code.
Signed-off-by: Anton Blanchard <anton@samba.org>
Signed-off-by: Paul Mackerras <paulus@samba.org>
Diffstat (limited to 'include/asm-ppc64/mmzone.h')
-rw-r--r-- | include/asm-ppc64/mmzone.h | 63 |
1 files changed, 3 insertions, 60 deletions
diff --git a/include/asm-ppc64/mmzone.h b/include/asm-ppc64/mmzone.h index 7f06afbfbabb..54958d6cae04 100644 --- a/include/asm-ppc64/mmzone.h +++ b/include/asm-ppc64/mmzone.h | |||
@@ -8,15 +8,14 @@ | |||
8 | #define _ASM_MMZONE_H_ | 8 | #define _ASM_MMZONE_H_ |
9 | 9 | ||
10 | #include <linux/config.h> | 10 | #include <linux/config.h> |
11 | #include <asm/smp.h> | ||
12 | 11 | ||
13 | /* generic non-linear memory support: | 12 | /* |
13 | * generic non-linear memory support: | ||
14 | * | 14 | * |
15 | * 1) we will not split memory into more chunks than will fit into the | 15 | * 1) we will not split memory into more chunks than will fit into the |
16 | * flags field of the struct page | 16 | * flags field of the struct page |
17 | */ | 17 | */ |
18 | 18 | ||
19 | |||
20 | #ifdef CONFIG_NEED_MULTIPLE_NODES | 19 | #ifdef CONFIG_NEED_MULTIPLE_NODES |
21 | 20 | ||
22 | extern struct pglist_data *node_data[]; | 21 | extern struct pglist_data *node_data[]; |
@@ -30,41 +29,11 @@ extern struct pglist_data *node_data[]; | |||
30 | */ | 29 | */ |
31 | 30 | ||
32 | extern int numa_cpu_lookup_table[]; | 31 | extern int numa_cpu_lookup_table[]; |
33 | extern char *numa_memory_lookup_table; | ||
34 | extern cpumask_t numa_cpumask_lookup_table[]; | 32 | extern cpumask_t numa_cpumask_lookup_table[]; |
35 | #ifdef CONFIG_MEMORY_HOTPLUG | 33 | #ifdef CONFIG_MEMORY_HOTPLUG |
36 | extern unsigned long max_pfn; | 34 | extern unsigned long max_pfn; |
37 | #endif | 35 | #endif |
38 | 36 | ||
39 | /* 16MB regions */ | ||
40 | #define MEMORY_INCREMENT_SHIFT 24 | ||
41 | #define MEMORY_INCREMENT (1UL << MEMORY_INCREMENT_SHIFT) | ||
42 | |||
43 | /* NUMA debugging, will not work on a DLPAR machine */ | ||
44 | #undef DEBUG_NUMA | ||
45 | |||
46 | static inline int pa_to_nid(unsigned long pa) | ||
47 | { | ||
48 | int nid; | ||
49 | |||
50 | #ifdef CONFIG_MEMORY_HOTPLUG | ||
51 | /* kludge hot added sections default to node 0 */ | ||
52 | if (pa >= (max_pfn << PAGE_SHIFT)) | ||
53 | return 0; | ||
54 | #endif | ||
55 | nid = numa_memory_lookup_table[pa >> MEMORY_INCREMENT_SHIFT]; | ||
56 | |||
57 | #ifdef DEBUG_NUMA | ||
58 | /* the physical address passed in is not in the map for the system */ | ||
59 | if (nid == -1) { | ||
60 | printk("bad address: %lx\n", pa); | ||
61 | BUG(); | ||
62 | } | ||
63 | #endif | ||
64 | |||
65 | return nid; | ||
66 | } | ||
67 | |||
68 | /* | 37 | /* |
69 | * Following are macros that each numa implmentation must define. | 38 | * Following are macros that each numa implmentation must define. |
70 | */ | 39 | */ |
@@ -72,36 +41,10 @@ static inline int pa_to_nid(unsigned long pa) | |||
72 | #define node_start_pfn(nid) (NODE_DATA(nid)->node_start_pfn) | 41 | #define node_start_pfn(nid) (NODE_DATA(nid)->node_start_pfn) |
73 | #define node_end_pfn(nid) (NODE_DATA(nid)->node_end_pfn) | 42 | #define node_end_pfn(nid) (NODE_DATA(nid)->node_end_pfn) |
74 | 43 | ||
75 | #ifdef CONFIG_DISCONTIGMEM | ||
76 | |||
77 | #define node_localnr(pfn, nid) ((pfn) - NODE_DATA(nid)->node_start_pfn) | ||
78 | |||
79 | #define pfn_to_nid(pfn) pa_to_nid((unsigned long)(pfn) << PAGE_SHIFT) | ||
80 | |||
81 | /* Written this way to avoid evaluating arguments twice */ | ||
82 | #define discontigmem_pfn_to_page(pfn) \ | ||
83 | ({ \ | ||
84 | unsigned long __tmp = pfn; \ | ||
85 | (NODE_DATA(pfn_to_nid(__tmp))->node_mem_map + \ | ||
86 | node_localnr(__tmp, pfn_to_nid(__tmp))); \ | ||
87 | }) | ||
88 | |||
89 | #define discontigmem_page_to_pfn(p) \ | ||
90 | ({ \ | ||
91 | struct page *__tmp = p; \ | ||
92 | (((__tmp) - page_zone(__tmp)->zone_mem_map) + \ | ||
93 | page_zone(__tmp)->zone_start_pfn); \ | ||
94 | }) | ||
95 | |||
96 | /* XXX fix for discontiguous physical memory */ | ||
97 | #define discontigmem_pfn_valid(pfn) ((pfn) < num_physpages) | ||
98 | |||
99 | #endif /* CONFIG_DISCONTIGMEM */ | ||
100 | |||
101 | #endif /* CONFIG_NEED_MULTIPLE_NODES */ | 44 | #endif /* CONFIG_NEED_MULTIPLE_NODES */ |
102 | 45 | ||
103 | #ifdef CONFIG_HAVE_ARCH_EARLY_PFN_TO_NID | 46 | #ifdef CONFIG_HAVE_ARCH_EARLY_PFN_TO_NID |
104 | #define early_pfn_to_nid(pfn) pa_to_nid(((unsigned long)pfn) << PAGE_SHIFT) | 47 | extern int __init early_pfn_to_nid(unsigned long pfn); |
105 | #endif | 48 | #endif |
106 | 49 | ||
107 | #endif /* _ASM_MMZONE_H_ */ | 50 | #endif /* _ASM_MMZONE_H_ */ |