On Saturday, August 26, 2017 2:27:49 PM CEST Ralf Baechle wrote: > Hi, > > Paul didn't cc the other maintainers. Tglx gave me his Ack on IRC so I > now only still need one of a drivers/cpuidle/ maintainer. ACK > On Sat, Aug 12, 2017 at 07:49:37PM -0700, Paul Burton wrote: > > Date: Sat, 12 Aug 2017 19:49:37 -0700 > > From: Paul Burton <paul.burton@xxxxxxxxxx> > > To: linux-mips@xxxxxxxxxxxxxx > > CC: Ralf Baechle <ralf@xxxxxxxxxxxxxx>, Paul Burton <paul.burton@xxxxxxxxxx> > > Subject: [PATCH 13/19] MIPS: Unify checks for sibling CPUs > > Content-Type: text/plain > > > > Up until now we have open-coded checks for whether CPUs are siblings, > > with slight variations on whether we consider the package ID or not. > > > > This will only get more complex when we introduce cluster support, so in > > preparation for that this patch introduces a cpus_are_siblings() > > function which can be used to check whether or not 2 CPUs are siblings > > in a consistent manner. > > > > By checking globalnumber with the VP ID masked out this also has the > > neat side effect of being ready for multi-cluster systems already. > > > > Signed-off-by: Paul Burton <paul.burton@xxxxxxxxxx> > > Cc: Ralf Baechle <ralf@xxxxxxxxxxxxxx> > > Cc: linux-mips@xxxxxxxxxxxxxx > > --- > > > > arch/mips/include/asm/cpu-info.h | 17 +++++++++++++++++ > > arch/mips/kernel/smp-cps.c | 8 ++++---- > > arch/mips/kernel/smp.c | 12 +++++------- > > drivers/cpuidle/cpuidle-cps.c | 2 +- > > drivers/irqchip/irq-mips-cpu.c | 2 +- > > 5 files changed, 28 insertions(+), 13 deletions(-) > > > > diff --git a/arch/mips/include/asm/cpu-info.h b/arch/mips/include/asm/cpu-info.h > > index 9ae927282b12..0c61bdc82a53 100644 > > --- a/arch/mips/include/asm/cpu-info.h > > +++ b/arch/mips/include/asm/cpu-info.h > > @@ -158,6 +158,23 @@ static inline unsigned int cpu_vpe_id(struct cpuinfo_mips *cpuinfo) > > extern void cpu_set_core(struct cpuinfo_mips *cpuinfo, unsigned int core); > > extern void cpu_set_vpe_id(struct cpuinfo_mips *cpuinfo, unsigned int vpe); > > > > +static inline bool cpus_are_siblings(int cpua, int cpub) > > +{ > > + struct cpuinfo_mips *infoa = &cpu_data[cpua]; > > + struct cpuinfo_mips *infob = &cpu_data[cpub]; > > + unsigned int gnuma, gnumb; > > + > > + if (infoa->package != infob->package) > > + return false; > > + > > + gnuma = infoa->globalnumber & ~MIPS_GLOBALNUMBER_VP; > > + gnumb = infob->globalnumber & ~MIPS_GLOBALNUMBER_VP; > > + if (gnuma != gnumb) > > + return false; > > + > > + return true; > > +} > > + > > static inline unsigned long cpu_asid_inc(void) > > { > > return 1 << CONFIG_MIPS_ASID_SHIFT; > > diff --git a/arch/mips/kernel/smp-cps.c b/arch/mips/kernel/smp-cps.c > > index 699459ed293b..8cc508809466 100644 > > --- a/arch/mips/kernel/smp-cps.c > > +++ b/arch/mips/kernel/smp-cps.c > > @@ -147,7 +147,7 @@ static void __init cps_prepare_cpus(unsigned int max_cpus) > > cpu_has_dc_aliases ? "dcache aliasing" : ""); > > > > for_each_present_cpu(c) { > > - if (cpu_core(&cpu_data[c])) > > + if (!cpus_are_siblings(smp_processor_id(), c)) > > set_cpu_present(c, false); > > } > > } > > @@ -319,10 +319,10 @@ static void cps_boot_secondary(int cpu, struct task_struct *idle) > > mips_cm_unlock_other(); > > } > > > > - if (core != cpu_core(¤t_cpu_data)) { > > + if (!cpus_are_siblings(cpu, smp_processor_id())) { > > /* Boot a VPE on another powered up core */ > > for (remote = 0; remote < NR_CPUS; remote++) { > > - if (cpu_core(&cpu_data[remote]) != core) > > + if (!cpus_are_siblings(cpu, remote)) > > continue; > > if (cpu_online(remote)) > > break; > > @@ -431,7 +431,7 @@ void play_dead(void) > > > > /* Look for another online VPE within the core */ > > for_each_online_cpu(cpu_death_sibling) { > > - if (cpu_core(&cpu_data[cpu_death_sibling]) != core) > > + if (!cpus_are_siblings(cpu, cpu_death_sibling)) > > continue; > > > > /* > > diff --git a/arch/mips/kernel/smp.c b/arch/mips/kernel/smp.c > > index a54e5857c227..4cc43892b959 100644 > > --- a/arch/mips/kernel/smp.c > > +++ b/arch/mips/kernel/smp.c > > @@ -96,8 +96,7 @@ static inline void set_cpu_sibling_map(int cpu) > > > > if (smp_num_siblings > 1) { > > for_each_cpu(i, &cpu_sibling_setup_map) { > > - if (cpu_data[cpu].package == cpu_data[i].package && > > - cpu_core(&cpu_data[cpu]) == cpu_core(&cpu_data[i])) { > > + if (cpus_are_siblings(cpu, i)) { > > cpumask_set_cpu(i, &cpu_sibling_map[cpu]); > > cpumask_set_cpu(cpu, &cpu_sibling_map[i]); > > } > > @@ -134,8 +133,7 @@ void calculate_cpu_foreign_map(void) > > for_each_online_cpu(i) { > > core_present = 0; > > for_each_cpu(k, &temp_foreign_map) > > - if (cpu_data[i].package == cpu_data[k].package && > > - cpu_core(&cpu_data[i]) == cpu_core(&cpu_data[k])) > > + if (cpus_are_siblings(i, k)) > > core_present = 1; > > if (!core_present) > > cpumask_set_cpu(i, &temp_foreign_map); > > @@ -186,11 +184,11 @@ void mips_smp_send_ipi_mask(const struct cpumask *mask, unsigned int action) > > > > if (mips_cpc_present()) { > > for_each_cpu(cpu, mask) { > > - core = cpu_core(&cpu_data[cpu]); > > - > > - if (core == cpu_core(¤t_cpu_data)) > > + if (cpus_are_siblings(cpu, smp_processor_id())) > > continue; > > > > + core = cpu_core(&cpu_data[cpu]); > > + > > while (!cpumask_test_cpu(cpu, &cpu_coherent_mask)) { > > mips_cm_lock_other(core, 0); > > mips_cpc_lock_other(core); > > diff --git a/drivers/cpuidle/cpuidle-cps.c b/drivers/cpuidle/cpuidle-cps.c > > index 6041b6104f3d..72b5e47286b4 100644 > > --- a/drivers/cpuidle/cpuidle-cps.c > > +++ b/drivers/cpuidle/cpuidle-cps.c > > @@ -37,7 +37,7 @@ static int cps_nc_enter(struct cpuidle_device *dev, > > * TODO: don't treat core 0 specially, just prevent the final core > > * TODO: remap interrupt affinity temporarily > > */ > > - if (!cpu_core(&cpu_data[dev->cpu]) && (index > STATE_NC_WAIT)) > > + if (cpus_are_siblings(0, dev->cpu) && (index > STATE_NC_WAIT)) > > index = STATE_NC_WAIT; > > > > /* Select the appropriate cps_pm_state */ > > diff --git a/drivers/irqchip/irq-mips-cpu.c b/drivers/irqchip/irq-mips-cpu.c > > index 14461cbfab2f..66f97fde13d8 100644 > > --- a/drivers/irqchip/irq-mips-cpu.c > > +++ b/drivers/irqchip/irq-mips-cpu.c > > @@ -101,7 +101,7 @@ static void mips_mt_send_ipi(struct irq_data *d, unsigned int cpu) > > local_irq_save(flags); > > > > /* We can only send IPIs to VPEs within the local core */ > > - WARN_ON(cpu_data[cpu].core != current_cpu_data.core); > > + WARN_ON(!cpus_are_siblings(smp_processor_id(), cpu)); > > > > vpflags = dvpe(); > > settc(cpu_vpe_id(&cpu_data[cpu])); >