提交 25863de0 编写于 作者: A Anton Blanchard 提交者: Benjamin Herrenschmidt

powerpc/cpumask: Convert NUMA code to new cpumask API

Convert NUMA code to new cpumask API. We shift the node to cpumask
setup code until after we complete bootmem allocation so we can
dynamically allocate the cpumasks.
Signed-off-by: NAnton Blanchard <anton@samba.org>
Signed-off-by: NBenjamin Herrenschmidt <benh@kernel.crashing.org>
上级 8729faaa
...@@ -30,7 +30,7 @@ extern struct pglist_data *node_data[]; ...@@ -30,7 +30,7 @@ extern struct pglist_data *node_data[];
*/ */
extern int numa_cpu_lookup_table[]; extern int numa_cpu_lookup_table[];
extern cpumask_t numa_cpumask_lookup_table[]; extern cpumask_var_t node_to_cpumask_map[];
#ifdef CONFIG_MEMORY_HOTPLUG #ifdef CONFIG_MEMORY_HOTPLUG
extern unsigned long max_pfn; extern unsigned long max_pfn;
#endif #endif
......
...@@ -29,7 +29,7 @@ static inline int cpu_to_node(int cpu) ...@@ -29,7 +29,7 @@ static inline int cpu_to_node(int cpu)
#define cpumask_of_node(node) ((node) == -1 ? \ #define cpumask_of_node(node) ((node) == -1 ? \
cpu_all_mask : \ cpu_all_mask : \
&numa_cpumask_lookup_table[node]) node_to_cpumask_map[node])
int of_node_to_nid(struct device_node *device); int of_node_to_nid(struct device_node *device);
......
...@@ -33,16 +33,41 @@ static int numa_debug; ...@@ -33,16 +33,41 @@ static int numa_debug;
#define dbg(args...) if (numa_debug) { printk(KERN_INFO args); } #define dbg(args...) if (numa_debug) { printk(KERN_INFO args); }
int numa_cpu_lookup_table[NR_CPUS]; int numa_cpu_lookup_table[NR_CPUS];
cpumask_t numa_cpumask_lookup_table[MAX_NUMNODES]; cpumask_var_t node_to_cpumask_map[MAX_NUMNODES];
struct pglist_data *node_data[MAX_NUMNODES]; struct pglist_data *node_data[MAX_NUMNODES];
EXPORT_SYMBOL(numa_cpu_lookup_table); EXPORT_SYMBOL(numa_cpu_lookup_table);
EXPORT_SYMBOL(numa_cpumask_lookup_table); EXPORT_SYMBOL(node_to_cpumask_map);
EXPORT_SYMBOL(node_data); EXPORT_SYMBOL(node_data);
static int min_common_depth; static int min_common_depth;
static int n_mem_addr_cells, n_mem_size_cells; static int n_mem_addr_cells, n_mem_size_cells;
/*
* Allocate node_to_cpumask_map based on number of available nodes
* Requires node_possible_map to be valid.
*
* Note: node_to_cpumask() is not valid until after this is done.
*/
static void __init setup_node_to_cpumask_map(void)
{
unsigned int node, num = 0;
/* setup nr_node_ids if not done yet */
if (nr_node_ids == MAX_NUMNODES) {
for_each_node_mask(node, node_possible_map)
num = node;
nr_node_ids = num + 1;
}
/* allocate the map */
for (node = 0; node < nr_node_ids; node++)
alloc_bootmem_cpumask_var(&node_to_cpumask_map[node]);
/* cpumask_of_node() will now work */
dbg("Node to cpumask map for %d nodes\n", nr_node_ids);
}
static int __cpuinit fake_numa_create_new_node(unsigned long end_pfn, static int __cpuinit fake_numa_create_new_node(unsigned long end_pfn,
unsigned int *nid) unsigned int *nid)
{ {
...@@ -138,8 +163,8 @@ static void __cpuinit map_cpu_to_node(int cpu, int node) ...@@ -138,8 +163,8 @@ static void __cpuinit map_cpu_to_node(int cpu, int node)
dbg("adding cpu %d to node %d\n", cpu, node); dbg("adding cpu %d to node %d\n", cpu, node);
if (!(cpu_isset(cpu, numa_cpumask_lookup_table[node]))) if (!(cpumask_test_cpu(cpu, node_to_cpumask_map[node])))
cpu_set(cpu, numa_cpumask_lookup_table[node]); cpumask_set_cpu(cpu, node_to_cpumask_map[node]);
} }
#ifdef CONFIG_HOTPLUG_CPU #ifdef CONFIG_HOTPLUG_CPU
...@@ -149,8 +174,8 @@ static void unmap_cpu_from_node(unsigned long cpu) ...@@ -149,8 +174,8 @@ static void unmap_cpu_from_node(unsigned long cpu)
dbg("removing cpu %lu from node %d\n", cpu, node); dbg("removing cpu %lu from node %d\n", cpu, node);
if (cpu_isset(cpu, numa_cpumask_lookup_table[node])) { if (cpumask_test_cpu(cpu, node_to_cpumask_map[node])) {
cpu_clear(cpu, numa_cpumask_lookup_table[node]); cpumask_set_cpu(cpu, node_to_cpumask_map[node]);
} else { } else {
printk(KERN_ERR "WARNING: cpu %lu not found in node %d\n", printk(KERN_ERR "WARNING: cpu %lu not found in node %d\n",
cpu, node); cpu, node);
...@@ -737,8 +762,9 @@ void __init dump_numa_cpu_topology(void) ...@@ -737,8 +762,9 @@ void __init dump_numa_cpu_topology(void)
* If we used a CPU iterator here we would miss printing * If we used a CPU iterator here we would miss printing
* the holes in the cpumap. * the holes in the cpumap.
*/ */
for (cpu = 0; cpu < NR_CPUS; cpu++) { for (cpu = 0; cpu < nr_cpu_ids; cpu++) {
if (cpu_isset(cpu, numa_cpumask_lookup_table[node])) { if (cpumask_test_cpu(cpu,
node_to_cpumask_map[node])) {
if (count == 0) if (count == 0)
printk(" %u", cpu); printk(" %u", cpu);
++count; ++count;
...@@ -750,7 +776,7 @@ void __init dump_numa_cpu_topology(void) ...@@ -750,7 +776,7 @@ void __init dump_numa_cpu_topology(void)
} }
if (count > 1) if (count > 1)
printk("-%u", NR_CPUS - 1); printk("-%u", nr_cpu_ids - 1);
printk("\n"); printk("\n");
} }
} }
...@@ -926,10 +952,6 @@ void __init do_init_bootmem(void) ...@@ -926,10 +952,6 @@ void __init do_init_bootmem(void)
else else
dump_numa_memory_topology(); dump_numa_memory_topology();
register_cpu_notifier(&ppc64_numa_nb);
cpu_numa_callback(&ppc64_numa_nb, CPU_UP_PREPARE,
(void *)(unsigned long)boot_cpuid);
for_each_online_node(nid) { for_each_online_node(nid) {
unsigned long start_pfn, end_pfn; unsigned long start_pfn, end_pfn;
void *bootmem_vaddr; void *bootmem_vaddr;
...@@ -983,6 +1005,16 @@ void __init do_init_bootmem(void) ...@@ -983,6 +1005,16 @@ void __init do_init_bootmem(void)
} }
init_bootmem_done = 1; init_bootmem_done = 1;
/*
* Now bootmem is initialised we can create the node to cpumask
* lookup tables and setup the cpu callback to populate them.
*/
setup_node_to_cpumask_map();
register_cpu_notifier(&ppc64_numa_nb);
cpu_numa_callback(&ppc64_numa_nb, CPU_UP_PREPARE,
(void *)(unsigned long)boot_cpuid);
} }
void __init paging_init(void) void __init paging_init(void)
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册