Skip to content

Commit c032ef6

Browse files
committed
cpumask: convert node_to_cpumask_map[] to cpumask_var_t
Impact: reduce kernel memory usage when CONFIG_CPUMASK_OFFSTACK=y Straightforward conversion: done for 32 and 64 bit kernels. node_to_cpumask_map is now a cpumask_var_t array. 64-bit used to be a dynamic cpumask_t array, and 32-bit used to be a static cpumask_t array. Signed-off-by: Rusty Russell <[email protected]>
1 parent 71ee73e commit c032ef6

File tree

4 files changed

+24
-28
lines changed

4 files changed

+24
-28
lines changed

arch/x86/include/asm/topology.h

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -86,15 +86,15 @@ static inline int early_cpu_to_node(int cpu)
8686
#endif /* CONFIG_X86_64 */
8787

8888
/* Mappings between node number and cpus on that node. */
89-
extern cpumask_t *node_to_cpumask_map;
89+
extern cpumask_var_t node_to_cpumask_map[MAX_NUMNODES];
9090

9191
#ifdef CONFIG_DEBUG_PER_CPU_MAPS
9292
extern const cpumask_t *cpumask_of_node(int node);
9393
#else
9494
/* Returns a pointer to the cpumask of CPUs on Node 'node'. */
95-
static inline const cpumask_t *cpumask_of_node(int node)
95+
static inline const struct cpumask *cpumask_of_node(int node)
9696
{
97-
return &node_to_cpumask_map[node];
97+
return node_to_cpumask_map[node];
9898
}
9999
#endif
100100

arch/x86/kernel/smpboot.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -123,7 +123,7 @@ EXPORT_SYMBOL(cpu_to_node_map);
123123
static void map_cpu_to_node(int cpu, int node)
124124
{
125125
printk(KERN_INFO "Mapping cpu %d to node %d\n", cpu, node);
126-
cpumask_set_cpu(cpu, &node_to_cpumask_map[node]);
126+
cpumask_set_cpu(cpu, node_to_cpumask_map[node]);
127127
cpu_to_node_map[cpu] = node;
128128
}
129129

@@ -134,7 +134,7 @@ static void unmap_cpu_to_node(int cpu)
134134

135135
printk(KERN_INFO "Unmapping cpu %d from all nodes\n", cpu);
136136
for (node = 0; node < MAX_NUMNODES; node++)
137-
cpumask_clear_cpu(cpu, &node_to_cpumask_map[node]);
137+
cpumask_clear_cpu(cpu, node_to_cpumask_map[node]);
138138
cpu_to_node_map[cpu] = 0;
139139
}
140140
#else /* !(CONFIG_NUMA && CONFIG_X86_32) */

arch/x86/mm/numa.c

Lines changed: 12 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212
/*
1313
* Which logical CPUs are on which nodes
1414
*/
15-
cpumask_t *node_to_cpumask_map;
15+
cpumask_var_t node_to_cpumask_map[MAX_NUMNODES];
1616
EXPORT_SYMBOL(node_to_cpumask_map);
1717

1818
/*
@@ -25,7 +25,6 @@ EXPORT_SYMBOL(node_to_cpumask_map);
2525
void __init setup_node_to_cpumask_map(void)
2626
{
2727
unsigned int node, num = 0;
28-
cpumask_t *map;
2928

3029
/* setup nr_node_ids if not done yet */
3130
if (nr_node_ids == MAX_NUMNODES) {
@@ -35,14 +34,11 @@ void __init setup_node_to_cpumask_map(void)
3534
}
3635

3736
/* allocate the map */
38-
map = alloc_bootmem_low(nr_node_ids * sizeof(cpumask_t));
39-
DBG("node_to_cpumask_map at %p for %d nodes\n", map, nr_node_ids);
37+
for (node = 0; node < nr_node_ids; node++)
38+
alloc_bootmem_cpumask_var(&node_to_cpumask_map[node]);
4039

41-
pr_debug("Node to cpumask map at %p for %d nodes\n",
42-
map, nr_node_ids);
43-
44-
/* node_to_cpumask() will now work */
45-
node_to_cpumask_map = map;
40+
/* cpumask_of_node() will now work */
41+
pr_debug("Node to cpumask map for %d nodes\n", nr_node_ids);
4642
}
4743

4844
#ifdef CONFIG_DEBUG_PER_CPU_MAPS
@@ -51,20 +47,20 @@ void __init setup_node_to_cpumask_map(void)
5147
*/
5248
const cpumask_t *cpumask_of_node(int node)
5349
{
54-
if (node_to_cpumask_map == NULL) {
55-
printk(KERN_WARNING
56-
"cpumask_of_node(%d): no node_to_cpumask_map!\n",
57-
node);
58-
dump_stack();
59-
return cpu_online_mask;
60-
}
6150
if (node >= nr_node_ids) {
6251
printk(KERN_WARNING
6352
"cpumask_of_node(%d): node > nr_node_ids(%d)\n",
6453
node, nr_node_ids);
6554
dump_stack();
6655
return cpu_none_mask;
6756
}
57+
if (node_to_cpumask_map[node] == NULL) {
58+
printk(KERN_WARNING
59+
"cpumask_of_node(%d): no node_to_cpumask_map!\n",
60+
node);
61+
dump_stack();
62+
return cpu_online_mask;
63+
}
6864
return &node_to_cpumask_map[node];
6965
}
7066
EXPORT_SYMBOL(cpumask_of_node);

arch/x86/mm/numa_64.c

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -681,12 +681,12 @@ void __cpuinit numa_clear_node(int cpu)
681681

682682
void __cpuinit numa_add_cpu(int cpu)
683683
{
684-
cpu_set(cpu, node_to_cpumask_map[early_cpu_to_node(cpu)]);
684+
cpumask_set_cpu(cpu, node_to_cpumask_map[early_cpu_to_node(cpu)]);
685685
}
686686

687687
void __cpuinit numa_remove_cpu(int cpu)
688688
{
689-
cpu_clear(cpu, node_to_cpumask_map[early_cpu_to_node(cpu)]);
689+
cpumask_clear_cpu(cpu, node_to_cpumask_map[early_cpu_to_node(cpu)]);
690690
}
691691

692692
#else /* CONFIG_DEBUG_PER_CPU_MAPS */
@@ -700,17 +700,17 @@ static void __cpuinit numa_set_cpumask(int cpu, int enable)
700700
cpumask_t *mask;
701701
char buf[64];
702702

703-
if (node_to_cpumask_map == NULL) {
704-
printk(KERN_ERR "node_to_cpumask_map NULL\n");
703+
mask = node_to_cpumask_map[node];
704+
if (mask == NULL) {
705+
printk(KERN_ERR "node_to_cpumask_map[%i] NULL\n", node);
705706
dump_stack();
706707
return;
707708
}
708709

709-
mask = &node_to_cpumask_map[node];
710710
if (enable)
711-
cpu_set(cpu, *mask);
711+
cpumask_set_cpu(cpu, mask);
712712
else
713-
cpu_clear(cpu, *mask);
713+
cpumask_clear_cpu(cpu, mask);
714714

715715
cpulist_scnprintf(buf, sizeof(buf), mask);
716716
printk(KERN_DEBUG "%s cpu %d node %d: mask now %s\n",

0 commit comments

Comments
 (0)