Re: [PATCH 13/19] MIPS: Unify checks for sibling CPUs

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



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(&current_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(&current_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]));
> 




[Index of Archives]     [Linux MIPS Home]     [LKML Archive]     [Linux ARM Kernel]     [Linux ARM]     [Linux]     [Git]     [Yosemite News]     [Linux SCSI]     [Linux Hams]

  Powered by Linux