Re: [PATCH] MIPS: smp.c: Fix uninitialised temp_foreign_map

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

 



Hi Matt,

On Fri, Mar 04, 2016 at 01:43:37PM +0000, Matt Redfearn wrote:
> Hi James,
> 
> On 04/03/16 10:10, James Hogan wrote:
> > When calculate_cpu_foreign_map() recalculates the cpu_foreign_map
> > cpumask it uses the local variable temp_foreign_map without initialising
> > it to zero. Since the calculation only ever sets bits in this cpumask
> > any existing bits at that memory location will remain set and find their
> > way into cpu_foreign_map too. This could potentially lead to cache
> > operations suboptimally doing smp calls to multiple VPEs in the same
> > core, even though the VPEs share primary caches.
> >
> > Therefore initialise temp_foreign_map using cpumask_clear() before use.
> >
> > Fixes: cccf34e9411c ("MIPS: c-r4k: Fix cache flushing for MT cores")
> 
> cccf34e9411c was CC'd to stable 3.15+, should this fix do the same?

I originally didn't think it was needed for stable, since it only causes
a few unnecessary IPIs. However having thought some more about it, I
think it could result in cpu_foreign_map containing VPEs that are
offline, and not ones online, which could result in the IPI *not* being
called on a given core at all when it should.

E.g.
if the initial undefined value is 0x2 (CPU 1) and 2nd VPE of 1st core is
offline, then CPU 0 wouldn't be set (since CPU 1 is a sibling) and
neither VPE in core 0 would get the IPI.

So yeh, maybe it should.

Cheers
James

> 
> Thanks,
> Matt
> 
> 
> > Signed-off-by: James Hogan <james.hogan@xxxxxxxxxx>
> > Cc: Ralf Baechle <ralf@xxxxxxxxxxxxxx>
> > Cc: Paul Burton <paul.burton@xxxxxxxxxx>
> > Cc: linux-mips@xxxxxxxxxxxxxx
> > ---
> >   arch/mips/kernel/smp.c | 1 +
> >   1 file changed, 1 insertion(+)
> >
> > diff --git a/arch/mips/kernel/smp.c b/arch/mips/kernel/smp.c
> > index bd4385a8e6e8..2b521e07b860 100644
> > --- a/arch/mips/kernel/smp.c
> > +++ b/arch/mips/kernel/smp.c
> > @@ -121,6 +121,7 @@ static inline void calculate_cpu_foreign_map(void)
> >   	cpumask_t temp_foreign_map;
> >   
> >   	/* Re-calculate the mask */
> > +	cpumask_clear(&temp_foreign_map);
> >   	for_each_online_cpu(i) {
> >   		core_present = 0;
> >   		for_each_cpu(k, &temp_foreign_map)
> 

Attachment: signature.asc
Description: Digital signature


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

  Powered by Linux