Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

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 <rusty@rustcorp.com.au>

+24 -28
+3 -3
arch/x86/include/asm/topology.h
··· 86 86 #endif /* CONFIG_X86_64 */ 87 87 88 88 /* 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]; 90 90 91 91 #ifdef CONFIG_DEBUG_PER_CPU_MAPS 92 92 extern const cpumask_t *cpumask_of_node(int node); 93 93 #else 94 94 /* 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) 96 96 { 97 - return &node_to_cpumask_map[node]; 97 + return node_to_cpumask_map[node]; 98 98 } 99 99 #endif 100 100
+2 -2
arch/x86/kernel/smpboot.c
··· 123 123 static void map_cpu_to_node(int cpu, int node) 124 124 { 125 125 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]); 127 127 cpu_to_node_map[cpu] = node; 128 128 } 129 129 ··· 134 134 135 135 printk(KERN_INFO "Unmapping cpu %d from all nodes\n", cpu); 136 136 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]); 138 138 cpu_to_node_map[cpu] = 0; 139 139 } 140 140 #else /* !(CONFIG_NUMA && CONFIG_X86_32) */
+12 -16
arch/x86/mm/numa.c
··· 12 12 /* 13 13 * Which logical CPUs are on which nodes 14 14 */ 15 - cpumask_t *node_to_cpumask_map; 15 + cpumask_var_t node_to_cpumask_map[MAX_NUMNODES]; 16 16 EXPORT_SYMBOL(node_to_cpumask_map); 17 17 18 18 /* ··· 25 25 void __init setup_node_to_cpumask_map(void) 26 26 { 27 27 unsigned int node, num = 0; 28 - cpumask_t *map; 29 28 30 29 /* setup nr_node_ids if not done yet */ 31 30 if (nr_node_ids == MAX_NUMNODES) { ··· 34 35 } 35 36 36 37 /* allocate the map */ 37 - map = alloc_bootmem_low(nr_node_ids * sizeof(cpumask_t)); 38 - DBG("node_to_cpumask_map at %p for %d nodes\n", map, nr_node_ids); 38 + for (node = 0; node < nr_node_ids; node++) 39 + alloc_bootmem_cpumask_var(&node_to_cpumask_map[node]); 39 40 40 - pr_debug("Node to cpumask map at %p for %d nodes\n", 41 - map, nr_node_ids); 42 - 43 - /* node_to_cpumask() will now work */ 44 - node_to_cpumask_map = map; 41 + /* cpumask_of_node() will now work */ 42 + pr_debug("Node to cpumask map for %d nodes\n", nr_node_ids); 45 43 } 46 44 47 45 #ifdef CONFIG_DEBUG_PER_CPU_MAPS ··· 47 51 */ 48 52 const cpumask_t *cpumask_of_node(int node) 49 53 { 50 - if (node_to_cpumask_map == NULL) { 51 - printk(KERN_WARNING 52 - "cpumask_of_node(%d): no node_to_cpumask_map!\n", 53 - node); 54 - dump_stack(); 55 - return cpu_online_mask; 56 - } 57 54 if (node >= nr_node_ids) { 58 55 printk(KERN_WARNING 59 56 "cpumask_of_node(%d): node > nr_node_ids(%d)\n", 60 57 node, nr_node_ids); 61 58 dump_stack(); 62 59 return cpu_none_mask; 60 + } 61 + if (node_to_cpumask_map[node] == NULL) { 62 + printk(KERN_WARNING 63 + "cpumask_of_node(%d): no node_to_cpumask_map!\n", 64 + node); 65 + dump_stack(); 66 + return cpu_online_mask; 63 67 } 64 68 return &node_to_cpumask_map[node]; 65 69 }
+7 -7
arch/x86/mm/numa_64.c
··· 681 681 682 682 void __cpuinit numa_add_cpu(int cpu) 683 683 { 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)]); 685 685 } 686 686 687 687 void __cpuinit numa_remove_cpu(int cpu) 688 688 { 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)]); 690 690 } 691 691 692 692 #else /* CONFIG_DEBUG_PER_CPU_MAPS */ ··· 700 700 cpumask_t *mask; 701 701 char buf[64]; 702 702 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); 705 706 dump_stack(); 706 707 return; 707 708 } 708 709 709 - mask = &node_to_cpumask_map[node]; 710 710 if (enable) 711 - cpu_set(cpu, *mask); 711 + cpumask_set_cpu(cpu, mask); 712 712 else 713 - cpu_clear(cpu, *mask); 713 + cpumask_clear_cpu(cpu, mask); 714 714 715 715 cpulist_scnprintf(buf, sizeof(buf), mask); 716 716 printk(KERN_DEBUG "%s cpu %d node %d: mask now %s\n",