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 | |
| 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')
| -rw-r--r-- | include/asm-powerpc/topology.h | 10 | ||||
| -rw-r--r-- | include/asm-ppc64/mmzone.h | 63 | ||||
| -rw-r--r-- | include/asm-ppc64/page.h | 5 |
3 files changed, 4 insertions, 74 deletions
diff --git a/include/asm-powerpc/topology.h b/include/asm-powerpc/topology.h index 388cc9f1277f..015d28746e1b 100644 --- a/include/asm-powerpc/topology.h +++ b/include/asm-powerpc/topology.h | |||
| @@ -9,15 +9,7 @@ | |||
| 9 | 9 | ||
| 10 | static inline int cpu_to_node(int cpu) | 10 | static inline int cpu_to_node(int cpu) |
| 11 | { | 11 | { |
| 12 | int node; | 12 | return numa_cpu_lookup_table[cpu]; |
| 13 | |||
| 14 | node = numa_cpu_lookup_table[cpu]; | ||
| 15 | |||
| 16 | #ifdef DEBUG_NUMA | ||
| 17 | BUG_ON(node == -1); | ||
| 18 | #endif | ||
| 19 | |||
| 20 | return node; | ||
| 21 | } | 13 | } |
| 22 | 14 | ||
| 23 | #define parent_node(node) (node) | 15 | #define parent_node(node) (node) |
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_ */ |
diff --git a/include/asm-ppc64/page.h b/include/asm-ppc64/page.h index e32f1187aa29..3efc3288f7e9 100644 --- a/include/asm-ppc64/page.h +++ b/include/asm-ppc64/page.h | |||
| @@ -279,11 +279,6 @@ extern u64 ppc64_pft_size; /* Log 2 of page table size */ | |||
| 279 | 279 | ||
| 280 | #define __va(x) ((void *)((unsigned long)(x) + KERNELBASE)) | 280 | #define __va(x) ((void *)((unsigned long)(x) + KERNELBASE)) |
| 281 | 281 | ||
| 282 | #ifdef CONFIG_DISCONTIGMEM | ||
| 283 | #define page_to_pfn(page) discontigmem_page_to_pfn(page) | ||
| 284 | #define pfn_to_page(pfn) discontigmem_pfn_to_page(pfn) | ||
| 285 | #define pfn_valid(pfn) discontigmem_pfn_valid(pfn) | ||
| 286 | #endif | ||
| 287 | #ifdef CONFIG_FLATMEM | 282 | #ifdef CONFIG_FLATMEM |
| 288 | #define pfn_to_page(pfn) (mem_map + (pfn)) | 283 | #define pfn_to_page(pfn) (mem_map + (pfn)) |
| 289 | #define page_to_pfn(page) ((unsigned long)((page) - mem_map)) | 284 | #define page_to_pfn(page) ((unsigned long)((page) - mem_map)) |
