Skip to contentSkip to conversation

7/8 Move NUMA-Q support into subarch

PATCH New Martin J. Bligh 1 participant 1 message Dec 23, 2002

lore
Share & tools
lore
#0 lore raw

PATCH 1/1 7/8 Move NUMA-Q support into subarch

This one fixes up the IPI code to do something more sensible. Sorry, was just too ugly to leave it alone ... but I did keep it seperated out ;-) Though this is not an equivalent transform it will only affect NUMA-Q & summit - same op twice because some twit just split it out in the last patch for both NUMA-Q & Summit.

Because clustered apic logical mode can't do arbitrary broadcasts of addressing (it's not just a bitmap), I have to do send IPI instructions as a sequence of unicasts. However, there's already a loop in the generic send_IPI_mask code to do that ... there's no need to call send_IPI_mask once for each CPU. The comment I wrote at the time even noted that this was silly.

include/asm-i386/mach-numaq/mach_ipi.h +4 -19
diff -urpN -X /home/fletch/.diff.exclude 15-numaq5/include/asm-i386/mach-numaq/mach_ipi.h 16-numaq6/include/asm-i386/mach-numaq/mach_ipi.h
@@ -10,30 +10,15 @@ static inline void send_IPI_mask(int mas
 
 static inline void send_IPI_allbutself(int vector)
 {
-	int cpu;
-	/*
-	 * if there are no other CPUs in the system then we get an APIC send 
-	 * error if we try to broadcast, thus avoid sending IPIs in this case.
-	 */
-	if (!(num_online_cpus() > 1))
-		return;
+	unsigned long mask = cpu_online_map & ~(1 << smp_processor_id());
 
-	/* Pointless. Use send_IPI_mask to do this instead */
-	for (cpu = 0; cpu < NR_CPUS; ++cpu)
-		if (cpu_online(cpu) && cpu != smp_processor_id())
-			send_IPI_mask(1 << cpu, vector);
-
-	return;
+	if (mask)
+		send_IPI_mask(mask, vector);
 }
 
 static inline void send_IPI_all(int vector)
 {
-	int cpu;
-
-	/* Pointless. Use send_IPI_mask to do this instead */
-	for (cpu = 0; cpu < NR_CPUS; ++cpu)
-		if (cpu_online(cpu))
-			send_IPI_mask(1 << cpu, vector);
+	send_IPI_mask(cpu_online_map, vector);
 }
 
 #endif /* __ASM_MACH_IPI_H */
include/asm-i386/mach-summit/mach_ipi.h +4 -19
diff -urpN -X /home/fletch/.diff.exclude 15-numaq5/include/asm-i386/mach-summit/mach_ipi.h 16-numaq6/include/asm-i386/mach-summit/mach_ipi.h
@@ -10,30 +10,15 @@ static inline void send_IPI_mask(int mas
 
 static inline void send_IPI_allbutself(int vector)
 {
-	int cpu;
-	/*
-	 * if there are no other CPUs in the system then we get an APIC send 
-	 * error if we try to broadcast, thus avoid sending IPIs in this case.
-	 */
-	if (!(num_online_cpus() > 1))
-		return;
+	unsigned long mask = cpu_online_map & ~(1 << smp_processor_id());
 
-	/* Pointless. Use send_IPI_mask to do this instead */
-	for (cpu = 0; cpu < NR_CPUS; ++cpu)
-		if (cpu_online(cpu) && cpu != smp_processor_id())
-			send_IPI_mask(1 << cpu, vector);
-
-	return;
+	if (mask)
+		send_IPI_mask(mask, vector);
 }
 
 static inline void send_IPI_all(int vector)
 {
-	int cpu;
-
-	/* Pointless. Use send_IPI_mask to do this instead */
-	for (cpu = 0; cpu < NR_CPUS; ++cpu)
-		if (cpu_online(cpu))
-			send_IPI_mask(1 << cpu, vector);
+	send_IPI_mask(cpu_online_map, vector);
 }
 
 #endif /* __ASM_MACH_IPI_H */