
From: Rusty Russell <rusty@rustcorp.com.au>

The for_each_cpu() and for_each_online_cpu() iterators take a mask, and noone
uses them that way (except for arch/i386/mach-voyager, which uses
for_each_cpu(cpu_online_mask).  Make them more useful iterators, by dropping
the "mask" arg.

This requires that archs provide a cpu_possible_mask: most do, but PPC64
doesn't so it is broken by this patch.

Most places doing loops over cpus testing for cpu_online() should use
for_each_cpu: it is synonymous at the moment, but with the CPU hotplug patch
the difference becomes important.

Followup patch will convert users.



 25-akpm/arch/i386/mach-voyager/voyager_smp.c |   12 ++++-----
 25-akpm/include/asm-alpha/smp.h              |    2 -
 25-akpm/include/asm-i386/smp.h               |    3 --
 25-akpm/include/asm-ia64/smp.h               |    2 -
 25-akpm/include/asm-mips/smp.h               |    2 -
 25-akpm/include/asm-parisc/smp.h             |    2 -
 25-akpm/include/asm-ppc/smp.h                |    1 
 25-akpm/include/asm-s390/smp.h               |    1 
 25-akpm/include/asm-sh/smp.h                 |    1 
 25-akpm/include/asm-sparc64/smp.h            |    2 -
 25-akpm/include/asm-um/smp.h                 |    2 -
 25-akpm/include/asm-x86_64/smp.h             |    3 --
 25-akpm/include/linux/cpumask.h              |   34 ++++++++++++---------------
 25-akpm/include/linux/smp.h                  |    1 
 14 files changed, 30 insertions(+), 38 deletions(-)

diff -puN arch/i386/mach-voyager/voyager_smp.c~make-for_each_cpu-useful arch/i386/mach-voyager/voyager_smp.c
--- 25/arch/i386/mach-voyager/voyager_smp.c~make-for_each_cpu-useful	Wed Nov 19 11:33:42 2003
+++ 25-akpm/arch/i386/mach-voyager/voyager_smp.c	Wed Nov 19 11:33:42 2003
@@ -130,7 +130,7 @@ send_QIC_CPI(__u32 cpuset, __u8 cpi)
 {
 	int cpu;
 
-	for_each_cpu(cpu, cpu_online_map) {
+	for_each_online_cpu(cpu) {
 		if(cpuset & (1<<cpu)) {
 #ifdef VOYAGER_DEBUG
 			if(!cpu_isset(cpu, cpu_online_map))
@@ -1465,7 +1465,7 @@ send_CPI(__u32 cpuset, __u8 cpi)
 	cpuset &= 0xff;		/* only first 8 CPUs vaild for VIC CPI */
 	if(cpuset == 0)
 		return;
-	for_each_cpu(cpu, cpu_online_map) {
+	for_each_online_cpu(cpu) {
 		if(cpuset & (1<<cpu))
 			set_bit(cpi, &vic_cpi_mailbox[cpu]);
 	}
@@ -1579,7 +1579,7 @@ enable_vic_irq(unsigned int irq)
 	VDEBUG(("VOYAGER: enable_vic_irq(%d) CPU%d affinity 0x%lx\n",
 		irq, cpu, cpu_irq_affinity[cpu]));
 	spin_lock_irqsave(&vic_irq_lock, flags);
-	for_each_cpu(real_cpu, cpu_online_map) {
+	for_each_online_cpu(real_cpu) {
 		if(!(voyager_extended_vic_processors & (1<<real_cpu)))
 			continue;
 		if(!(cpu_irq_affinity[real_cpu] & mask)) {
@@ -1720,7 +1720,7 @@ after_handle_vic_irq(unsigned int irq)
 			int i;
 			__u8 cpu = smp_processor_id();
 			__u8 real_cpu;
-			int mask;
+			int mask; /* Um... initialize me??? --RR */
 
 			printk("VOYAGER SMP: CPU%d lost interrupt %d\n",
 			       cpu, irq);
@@ -1809,7 +1809,7 @@ set_vic_irq_affinity(unsigned int irq, c
 		 * bus) */
 		return;
 
-	for_each_cpu(cpu, cpu_online_map) {
+	for_each_online_cpu(cpu) {
 		unsigned long cpu_mask = 1 << cpu;
 		
 		if(cpu_mask & real_mask) {
@@ -1875,7 +1875,7 @@ voyager_smp_dump()
 	int old_cpu = smp_processor_id(), cpu;
 
 	/* dump the interrupt masks of each processor */
-	for_each_cpu(cpu, cpu_online_map) {
+	for_each_online_cpu(cpu) {
 		__u16 imr, isr, irr;
 		unsigned long flags;
 
diff -puN include/asm-alpha/smp.h~make-for_each_cpu-useful include/asm-alpha/smp.h
--- 25/include/asm-alpha/smp.h~make-for_each_cpu-useful	Wed Nov 19 11:33:42 2003
+++ 25-akpm/include/asm-alpha/smp.h	Wed Nov 19 11:33:42 2003
@@ -48,8 +48,8 @@ extern struct cpuinfo_alpha cpu_data[NR_
 extern cpumask_t cpu_present_mask;
 extern cpumask_t cpu_online_map;
 extern int smp_num_cpus;
+#define cpu_possible_map	cpu_present_map
 
-#define cpu_possible(cpu)	cpu_isset(cpu, cpu_present_mask)
 #define cpu_online(cpu)		cpu_isset(cpu, cpu_online_map)
 
 extern int smp_call_function_on_cpu(void (*func) (void *info), void *info,int retry, int wait, unsigned long cpu);
diff -puN include/asm-i386/smp.h~make-for_each_cpu-useful include/asm-i386/smp.h
--- 25/include/asm-i386/smp.h~make-for_each_cpu-useful	Wed Nov 19 11:33:42 2003
+++ 25-akpm/include/asm-i386/smp.h	Wed Nov 19 11:33:42 2003
@@ -53,8 +53,7 @@ extern void zap_low_mappings (void);
 #define smp_processor_id() (current_thread_info()->cpu)
 
 extern cpumask_t cpu_callout_map;
-
-#define cpu_possible(cpu) cpu_isset(cpu, cpu_callout_map)
+#define cpu_possible_map cpu_callout_map
 
 /* We don't mark CPUs online until __cpu_up(), so we need another measure */
 static inline int num_booting_cpus(void)
diff -puN include/asm-ia64/smp.h~make-for_each_cpu-useful include/asm-ia64/smp.h
--- 25/include/asm-ia64/smp.h~make-for_each_cpu-useful	Wed Nov 19 11:33:42 2003
+++ 25-akpm/include/asm-ia64/smp.h	Wed Nov 19 11:33:42 2003
@@ -48,7 +48,7 @@ extern volatile int ia64_cpu_to_sapicid[
 
 extern unsigned long ap_wakeup_vector;
 
-#define cpu_possible(cpu)	cpu_isset(cpu, phys_cpu_present_map)
+#define cpu_possible_map phys_cpu_present_map
 
 /*
  * Function to map hard smp processor id to logical id.  Slow, so don't use this in
diff -puN include/asm-mips/smp.h~make-for_each_cpu-useful include/asm-mips/smp.h
--- 25/include/asm-mips/smp.h~make-for_each_cpu-useful	Wed Nov 19 11:33:42 2003
+++ 25-akpm/include/asm-mips/smp.h	Wed Nov 19 11:33:42 2003
@@ -48,8 +48,8 @@ extern struct call_data_struct *call_dat
 
 extern cpumask_t phys_cpu_present_map;
 extern cpumask_t cpu_online_map;
+#define cpu_possible_map	phys_cpu_present_map
 
-#define cpu_possible(cpu)	cpu_isset(cpu, phys_cpu_present_map)
 #define cpu_online(cpu)		cpu_isset(cpu, cpu_online_map)
 
 static inline unsigned int num_online_cpus(void)
diff -puN include/asm-parisc/smp.h~make-for_each_cpu-useful include/asm-parisc/smp.h
--- 25/include/asm-parisc/smp.h~make-for_each_cpu-useful	Wed Nov 19 11:33:42 2003
+++ 25-akpm/include/asm-parisc/smp.h	Wed Nov 19 11:33:42 2003
@@ -54,7 +54,7 @@ extern unsigned long cpu_present_mask;
 #define smp_processor_id()	(current_thread_info()->cpu)
 #define cpu_online(cpu) cpu_isset(cpu, cpu_online_map)
 
-#define cpu_possible(cpu)       cpu_isset(cpu, cpu_present_mask)
+#define cpu_possible_map	cpu_present_map
 
 #endif /* CONFIG_SMP */
 
diff -puN include/asm-ppc/smp.h~make-for_each_cpu-useful include/asm-ppc/smp.h
--- 25/include/asm-ppc/smp.h~make-for_each_cpu-useful	Wed Nov 19 11:33:42 2003
+++ 25-akpm/include/asm-ppc/smp.h	Wed Nov 19 11:33:42 2003
@@ -48,7 +48,6 @@ extern void smp_local_timer_interrupt(st
 #define smp_processor_id() (current_thread_info()->cpu)
 
 #define cpu_online(cpu) cpu_isset(cpu, cpu_online_map)
-#define cpu_possible(cpu) cpu_isset(cpu, cpu_possible_map)
 
 extern int __cpu_up(unsigned int cpu);
 
diff -puN include/asm-s390/smp.h~make-for_each_cpu-useful include/asm-s390/smp.h
--- 25/include/asm-s390/smp.h~make-for_each_cpu-useful	Wed Nov 19 11:33:42 2003
+++ 25-akpm/include/asm-s390/smp.h	Wed Nov 19 11:33:42 2003
@@ -49,7 +49,6 @@ extern cpumask_t cpu_possible_map;
 #define smp_processor_id() (S390_lowcore.cpu_data.cpu_nr)
 
 #define cpu_online(cpu) cpu_isset(cpu, cpu_online_map)
-#define cpu_possible(cpu) cpu_isset(cpu, cpu_possible_map)
 
 extern __inline__ __u16 hard_smp_processor_id(void)
 {
diff -puN include/asm-sh/smp.h~make-for_each_cpu-useful include/asm-sh/smp.h
--- 25/include/asm-sh/smp.h~make-for_each_cpu-useful	Wed Nov 19 11:33:42 2003
+++ 25-akpm/include/asm-sh/smp.h	Wed Nov 19 11:33:42 2003
@@ -16,7 +16,6 @@
 extern unsigned long cpu_online_map;
 
 #define cpu_online(cpu)		(cpu_online_map & (1 << (cpu)))
-#define cpu_possible(cpu)	(cpu_online(cpu))
 
 #define smp_processor_id()	(current_thread_info()->cpu)
 
diff -puN include/asm-sparc64/smp.h~make-for_each_cpu-useful include/asm-sparc64/smp.h
--- 25/include/asm-sparc64/smp.h~make-for_each_cpu-useful	Wed Nov 19 11:33:42 2003
+++ 25-akpm/include/asm-sparc64/smp.h	Wed Nov 19 11:33:42 2003
@@ -33,7 +33,7 @@
 extern unsigned char boot_cpu_id;
 
 extern cpumask_t phys_cpu_present_map;
-#define cpu_possible(cpu)	cpu_isset(cpu, phys_cpu_present_map)
+#define cpu_possible_map phys_cpu_present_map
 
 #define cpu_online(cpu)		cpu_isset(cpu, cpu_online_map)
 
diff -puN include/asm-um/smp.h~make-for_each_cpu-useful include/asm-um/smp.h
--- 25/include/asm-um/smp.h~make-for_each_cpu-useful	Wed Nov 19 11:33:42 2003
+++ 25-akpm/include/asm-um/smp.h	Wed Nov 19 11:33:42 2003
@@ -20,7 +20,7 @@ extern int hard_smp_processor_id(void);
 #define cpu_online(cpu) cpu_isset(cpu, cpu_online_map)
 
 extern int ncpus;
-#define cpu_possible(cpu) (cpu < ncpus)
+
 
 extern inline void smp_cpus_done(unsigned int maxcpus)
 {
diff -puN include/asm-x86_64/smp.h~make-for_each_cpu-useful include/asm-x86_64/smp.h
--- 25/include/asm-x86_64/smp.h~make-for_each_cpu-useful	Wed Nov 19 11:33:42 2003
+++ 25-akpm/include/asm-x86_64/smp.h	Wed Nov 19 11:33:42 2003
@@ -57,8 +57,7 @@ void smp_stop_cpu(void);
  */
 
 extern cpumask_t cpu_callout_map;
-
-#define cpu_possible(cpu) cpu_isset(cpu, cpu_callout_map)
+#define cpu_possible_map cpu_callout_map
 #define cpu_online(cpu) cpu_isset(cpu, cpu_online_map)
 
 static inline int num_booting_cpus(void)
diff -puN include/linux/cpumask.h~make-for_each_cpu-useful include/linux/cpumask.h
--- 25/include/linux/cpumask.h~make-for_each_cpu-useful	Wed Nov 19 11:33:42 2003
+++ 25-akpm/include/linux/cpumask.h	Wed Nov 19 11:35:45 2003
@@ -41,32 +41,30 @@ typedef unsigned long cpumask_t;
 #ifdef CONFIG_SMP
 
 extern cpumask_t cpu_online_map;
+extern cpumask_t cpu_possible_map;
 
 #define num_online_cpus()		cpus_weight(cpu_online_map)
 #define cpu_online(cpu)			cpu_isset(cpu, cpu_online_map)
-#else
-#define	cpu_online_map			cpumask_of_cpu(0)
-#define num_online_cpus()		1
-#define cpu_online(cpu)			({ BUG_ON((cpu) != 0); 1; })
-#endif
+#define cpu_possible(cpu)		cpu_isset(cpu, cpu_possible_map)
 
-static inline int next_online_cpu(int cpu, cpumask_t map)
-{
-	do
-		cpu = next_cpu_const(cpu, mk_cpumask_const(map));
-	while (cpu < NR_CPUS && !cpu_online(cpu));
-	return cpu;
-}
-
-#define for_each_cpu(cpu, map)						\
+#define for_each_cpu_mask(cpu, map)					\
 	for (cpu = first_cpu_const(mk_cpumask_const(map));		\
 		cpu < NR_CPUS;						\
 		cpu = next_cpu_const(cpu,mk_cpumask_const(map)))
 
-#define for_each_online_cpu(cpu, map)					\
-	for (cpu = first_cpu_const(mk_cpumask_const(map));		\
-		cpu < NR_CPUS;						\
-		cpu = next_online_cpu(cpu,map))
+#define for_each_cpu(cpu) for_each_cpu_mask(cpu, cpu_possible_map)
+#define for_each_online_cpu(cpu) for_each_cpu_mask(cpu, cpu_online_map)
+
+#else		/* CONFIG_SMP */
+
+#define	cpu_online_map			cpumask_of_cpu(0)
+#define num_online_cpus()		1
+#define cpu_online(cpu)			({ BUG_ON((cpu) != 0); 1; })
+#define cpu_possible(cpu)		({ BUG_ON((cpu) != 0); 1; })
+
+#define for_each_cpu(cpu) for (cpu = 0; cpu < 1; cpu++)
+#define for_each_online_cpu(cpu) for (cpu = 0; cpu < 1; cpu++)
+#endif		/* CONFIG_SMP */
 
 static inline int format_cpumask(char *buf, cpumask_t cpus)
 {
diff -puN include/linux/smp.h~make-for_each_cpu-useful include/linux/smp.h
--- 25/include/linux/smp.h~make-for_each_cpu-useful	Wed Nov 19 11:33:42 2003
+++ 25-akpm/include/linux/smp.h	Wed Nov 19 11:33:42 2003
@@ -103,7 +103,6 @@ void smp_prepare_boot_cpu(void);
 #define on_each_cpu(func,info,retry,wait)	({ func(info); 0; })
 static inline void smp_send_reschedule(int cpu) { }
 #define num_booting_cpus()			1
-#define cpu_possible(cpu)			({ BUG_ON((cpu) != 0); 1; })
 #define smp_prepare_boot_cpu()			do {} while (0)
 
 #endif /* !SMP */

_
