diff options
Diffstat (limited to 'arch/powerpc/mm')
-rw-r--r-- | arch/powerpc/mm/numa.c | 58 |
1 files changed, 45 insertions, 13 deletions
diff --git a/arch/powerpc/mm/numa.c b/arch/powerpc/mm/numa.c index 64c00227b997..d68491b31e38 100644 --- a/arch/powerpc/mm/numa.c +++ b/arch/powerpc/mm/numa.c | |||
@@ -33,16 +33,41 @@ static int numa_debug; | |||
33 | #define dbg(args...) if (numa_debug) { printk(KERN_INFO args); } | 33 | #define dbg(args...) if (numa_debug) { printk(KERN_INFO args); } |
34 | 34 | ||
35 | int numa_cpu_lookup_table[NR_CPUS]; | 35 | int numa_cpu_lookup_table[NR_CPUS]; |
36 | cpumask_t numa_cpumask_lookup_table[MAX_NUMNODES]; | 36 | cpumask_var_t node_to_cpumask_map[MAX_NUMNODES]; |
37 | struct pglist_data *node_data[MAX_NUMNODES]; | 37 | struct pglist_data *node_data[MAX_NUMNODES]; |
38 | 38 | ||
39 | EXPORT_SYMBOL(numa_cpu_lookup_table); | 39 | EXPORT_SYMBOL(numa_cpu_lookup_table); |
40 | EXPORT_SYMBOL(numa_cpumask_lookup_table); | 40 | EXPORT_SYMBOL(node_to_cpumask_map); |
41 | EXPORT_SYMBOL(node_data); | 41 | EXPORT_SYMBOL(node_data); |
42 | 42 | ||
43 | static int min_common_depth; | 43 | static int min_common_depth; |
44 | static int n_mem_addr_cells, n_mem_size_cells; | 44 | static int n_mem_addr_cells, n_mem_size_cells; |
45 | 45 | ||
46 | /* | ||
47 | * Allocate node_to_cpumask_map based on number of available nodes | ||
48 | * Requires node_possible_map to be valid. | ||
49 | * | ||
50 | * Note: node_to_cpumask() is not valid until after this is done. | ||
51 | */ | ||
52 | static void __init setup_node_to_cpumask_map(void) | ||
53 | { | ||
54 | unsigned int node, num = 0; | ||
55 | |||
56 | /* setup nr_node_ids if not done yet */ | ||
57 | if (nr_node_ids == MAX_NUMNODES) { | ||
58 | for_each_node_mask(node, node_possible_map) | ||
59 | num = node; | ||
60 | nr_node_ids = num + 1; | ||
61 | } | ||
62 | |||
63 | /* allocate the map */ | ||
64 | for (node = 0; node < nr_node_ids; node++) | ||
65 | alloc_bootmem_cpumask_var(&node_to_cpumask_map[node]); | ||
66 | |||
67 | /* cpumask_of_node() will now work */ | ||
68 | dbg("Node to cpumask map for %d nodes\n", nr_node_ids); | ||
69 | } | ||
70 | |||
46 | static int __cpuinit fake_numa_create_new_node(unsigned long end_pfn, | 71 | static int __cpuinit fake_numa_create_new_node(unsigned long end_pfn, |
47 | unsigned int *nid) | 72 | unsigned int *nid) |
48 | { | 73 | { |
@@ -138,8 +163,8 @@ static void __cpuinit map_cpu_to_node(int cpu, int node) | |||
138 | 163 | ||
139 | dbg("adding cpu %d to node %d\n", cpu, node); | 164 | dbg("adding cpu %d to node %d\n", cpu, node); |
140 | 165 | ||
141 | if (!(cpu_isset(cpu, numa_cpumask_lookup_table[node]))) | 166 | if (!(cpumask_test_cpu(cpu, node_to_cpumask_map[node]))) |
142 | cpu_set(cpu, numa_cpumask_lookup_table[node]); | 167 | cpumask_set_cpu(cpu, node_to_cpumask_map[node]); |
143 | } | 168 | } |
144 | 169 | ||
145 | #ifdef CONFIG_HOTPLUG_CPU | 170 | #ifdef CONFIG_HOTPLUG_CPU |
@@ -149,8 +174,8 @@ static void unmap_cpu_from_node(unsigned long cpu) | |||
149 | 174 | ||
150 | dbg("removing cpu %lu from node %d\n", cpu, node); | 175 | dbg("removing cpu %lu from node %d\n", cpu, node); |
151 | 176 | ||
152 | if (cpu_isset(cpu, numa_cpumask_lookup_table[node])) { | 177 | if (cpumask_test_cpu(cpu, node_to_cpumask_map[node])) { |
153 | cpu_clear(cpu, numa_cpumask_lookup_table[node]); | 178 | cpumask_set_cpu(cpu, node_to_cpumask_map[node]); |
154 | } else { | 179 | } else { |
155 | printk(KERN_ERR "WARNING: cpu %lu not found in node %d\n", | 180 | printk(KERN_ERR "WARNING: cpu %lu not found in node %d\n", |
156 | cpu, node); | 181 | cpu, node); |
@@ -737,8 +762,9 @@ void __init dump_numa_cpu_topology(void) | |||
737 | * If we used a CPU iterator here we would miss printing | 762 | * If we used a CPU iterator here we would miss printing |
738 | * the holes in the cpumap. | 763 | * the holes in the cpumap. |
739 | */ | 764 | */ |
740 | for (cpu = 0; cpu < NR_CPUS; cpu++) { | 765 | for (cpu = 0; cpu < nr_cpu_ids; cpu++) { |
741 | if (cpu_isset(cpu, numa_cpumask_lookup_table[node])) { | 766 | if (cpumask_test_cpu(cpu, |
767 | node_to_cpumask_map[node])) { | ||
742 | if (count == 0) | 768 | if (count == 0) |
743 | printk(" %u", cpu); | 769 | printk(" %u", cpu); |
744 | ++count; | 770 | ++count; |
@@ -750,7 +776,7 @@ void __init dump_numa_cpu_topology(void) | |||
750 | } | 776 | } |
751 | 777 | ||
752 | if (count > 1) | 778 | if (count > 1) |
753 | printk("-%u", NR_CPUS - 1); | 779 | printk("-%u", nr_cpu_ids - 1); |
754 | printk("\n"); | 780 | printk("\n"); |
755 | } | 781 | } |
756 | } | 782 | } |
@@ -926,10 +952,6 @@ void __init do_init_bootmem(void) | |||
926 | else | 952 | else |
927 | dump_numa_memory_topology(); | 953 | dump_numa_memory_topology(); |
928 | 954 | ||
929 | register_cpu_notifier(&ppc64_numa_nb); | ||
930 | cpu_numa_callback(&ppc64_numa_nb, CPU_UP_PREPARE, | ||
931 | (void *)(unsigned long)boot_cpuid); | ||
932 | |||
933 | for_each_online_node(nid) { | 955 | for_each_online_node(nid) { |
934 | unsigned long start_pfn, end_pfn; | 956 | unsigned long start_pfn, end_pfn; |
935 | void *bootmem_vaddr; | 957 | void *bootmem_vaddr; |
@@ -983,6 +1005,16 @@ void __init do_init_bootmem(void) | |||
983 | } | 1005 | } |
984 | 1006 | ||
985 | init_bootmem_done = 1; | 1007 | init_bootmem_done = 1; |
1008 | |||
1009 | /* | ||
1010 | * Now bootmem is initialised we can create the node to cpumask | ||
1011 | * lookup tables and setup the cpu callback to populate them. | ||
1012 | */ | ||
1013 | setup_node_to_cpumask_map(); | ||
1014 | |||
1015 | register_cpu_notifier(&ppc64_numa_nb); | ||
1016 | cpu_numa_callback(&ppc64_numa_nb, CPU_UP_PREPARE, | ||
1017 | (void *)(unsigned long)boot_cpuid); | ||
986 | } | 1018 | } |
987 | 1019 | ||
988 | void __init paging_init(void) | 1020 | void __init paging_init(void) |