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

cpumask: IA64: Introduce cpumask_of_{node,pcibus} to replace {node,pcibus}_to_cpumask

Impact: New APIs

The old node_to_cpumask/node_to_pcibus returned a cpumask_t: these
return a pointer to a struct cpumask. Part of removing cpumasks from
the stack.

We can also use the new for_each_cpu_and() to avoid a temporary cpumask,
and a gratuitous test in sn_topology_show.

(Includes fix from KOSAKI Motohiro <kosaki.motohiro@jp.fujitsu.com>)

Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
Cc: Tony Luck <tony.luck@intel.com>
Cc: KOSAKI Motohiro <kosaki.motohiro@jp.fujitsu.com>

+30 -29
+6 -1
arch/ia64/include/asm/topology.h
··· 34 34 * Returns a bitmask of CPUs on Node 'node'. 35 35 */ 36 36 #define node_to_cpumask(node) (node_to_cpu_mask[node]) 37 + #define cpumask_of_node(node) (&node_to_cpu_mask[node]) 37 38 38 39 /* 39 40 * Returns the number of the node containing Node 'nid'. ··· 46 45 /* 47 46 * Returns the number of the first CPU on Node 'node'. 48 47 */ 49 - #define node_to_first_cpu(node) (first_cpu(node_to_cpumask(node))) 48 + #define node_to_first_cpu(node) (cpumask_first(cpumask_of_node(node))) 50 49 51 50 /* 52 51 * Determines the node for a given pci bus ··· 121 120 CPU_MASK_ALL : \ 122 121 node_to_cpumask(pcibus_to_node(bus)) \ 123 122 ) 123 + 124 + #define cpumask_of_pcibus(bus) (pcibus_to_node(bus) == -1 ? \ 125 + cpu_all_mask : \ 126 + cpumask_from_node(pcibus_to_node(bus))) 124 127 125 128 #include <asm-generic/topology.h> 126 129
+1 -1
arch/ia64/kernel/acpi.c
··· 1001 1001 node = pxm_to_node(pxm); 1002 1002 1003 1003 if (node >= MAX_NUMNODES || !node_online(node) || 1004 - cpus_empty(node_to_cpumask(node))) 1004 + cpumask_empty(cpumask_of_node(node))) 1005 1005 return AE_OK; 1006 1006 1007 1007 /* We know a gsi to node mapping! */
+11 -12
arch/ia64/kernel/iosapic.c
··· 695 695 #ifdef CONFIG_NUMA 696 696 { 697 697 int num_cpus, cpu_index, iosapic_index, numa_cpu, i = 0; 698 - cpumask_t cpu_mask; 698 + const struct cpumask *cpu_mask; 699 699 700 700 iosapic_index = find_iosapic(gsi); 701 701 if (iosapic_index < 0 || 702 702 iosapic_lists[iosapic_index].node == MAX_NUMNODES) 703 703 goto skip_numa_setup; 704 704 705 - cpu_mask = node_to_cpumask(iosapic_lists[iosapic_index].node); 706 - cpus_and(cpu_mask, cpu_mask, domain); 707 - for_each_cpu_mask(numa_cpu, cpu_mask) { 708 - if (!cpu_online(numa_cpu)) 709 - cpu_clear(numa_cpu, cpu_mask); 705 + cpu_mask = cpumask_of_node(iosapic_lists[iosapic_index].node); 706 + num_cpus = 0; 707 + for_each_cpu_and(numa_cpu, cpu_mask, &domain) { 708 + if (cpu_online(numa_cpu)) 709 + num_cpus++; 710 710 } 711 - 712 - num_cpus = cpus_weight(cpu_mask); 713 711 714 712 if (!num_cpus) 715 713 goto skip_numa_setup; ··· 715 717 /* Use irq assignment to distribute across cpus in node */ 716 718 cpu_index = irq % num_cpus; 717 719 718 - for (numa_cpu = first_cpu(cpu_mask) ; i < cpu_index ; i++) 719 - numa_cpu = next_cpu(numa_cpu, cpu_mask); 720 + for_each_cpu_and(numa_cpu, cpu_mask, &domain) 721 + if (cpu_online(numa_cpu) && i++ >= cpu_index) 722 + break; 720 723 721 - if (numa_cpu != NR_CPUS) 724 + if (numa_cpu < nr_cpu_ids) 722 725 return cpu_physical_id(numa_cpu); 723 726 } 724 727 skip_numa_setup: ··· 730 731 * case of NUMA.) 731 732 */ 732 733 do { 733 - if (++cpu >= NR_CPUS) 734 + if (++cpu >= nr_cpu_ids) 734 735 cpu = 0; 735 736 } while (!cpu_online(cpu) || !cpu_isset(cpu, domain)); 736 737
+12 -15
arch/ia64/sn/kernel/sn2/sn_hwperf.c
··· 385 385 int j; 386 386 const char *slabname; 387 387 int ordinal; 388 - cpumask_t cpumask; 389 388 char slice; 390 389 struct cpuinfo_ia64 *c; 391 390 struct sn_hwperf_port_info *ptdata; ··· 472 473 * CPUs on this node, if any 473 474 */ 474 475 if (!SN_HWPERF_IS_IONODE(obj)) { 475 - cpumask = node_to_cpumask(ordinal); 476 - for_each_online_cpu(i) { 477 - if (cpu_isset(i, cpumask)) { 478 - slice = 'a' + cpuid_to_slice(i); 479 - c = cpu_data(i); 480 - seq_printf(s, "cpu %d %s%c local" 481 - " freq %luMHz, arch ia64", 482 - i, obj->location, slice, 483 - c->proc_freq / 1000000); 484 - for_each_online_cpu(j) { 485 - seq_printf(s, j ? ":%d" : ", dist %d", 486 - node_distance( 476 + for_each_cpu_and(i, cpu_online_mask, 477 + cpumask_of_node(ordinal)) { 478 + slice = 'a' + cpuid_to_slice(i); 479 + c = cpu_data(i); 480 + seq_printf(s, "cpu %d %s%c local" 481 + " freq %luMHz, arch ia64", 482 + i, obj->location, slice, 483 + c->proc_freq / 1000000); 484 + for_each_online_cpu(j) { 485 + seq_printf(s, j ? ":%d" : ", dist %d", 486 + node_distance( 487 487 cpu_to_node(i), 488 488 cpu_to_node(j))); 489 - } 490 - seq_putc(s, '\n'); 491 489 } 490 + seq_putc(s, '\n'); 492 491 } 493 492 } 494 493 }