7/8 Move NUMA-Q support into subarch
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
@@ -10,30 +10,15 @@ static inline void send_IPI_mask(int masstatic 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
@@ -10,30 +10,15 @@ static inline void send_IPI_mask(int masstatic 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 */