[PATCH] Remove CPU_32v6K dependencies in asm/spinlock.h

Russell King - ARM Linux linux at arm.linux.org.uk
Mon Jan 17 05:37:39 EST 2011


On Mon, Jan 17, 2011 at 10:15:25AM +0000, Catalin Marinas wrote:
> On 15 January 2011 16:11, Russell King - ARM Linux
> <linux at arm.linux.org.uk> wrote:
> > SMP requires at least the ARMv6K extensions to be present, so if we're
> > running on SMP, the WFE and SEV instructions must be available.
> >
> > However, when we run on UP, the v6K extensions may not be available,
> > and so we don't want WFE/SEV to be in the instruction stream.  Use the
> > SMP alternatives infrastructure to replace these instructions with NOPs
> > if we build for SMP but run on UP.
> [...]
> > --- a/arch/arm/include/asm/spinlock.h
> > +++ b/arch/arm/include/asm/spinlock.h
> > @@ -5,17 +5,36 @@
> >  #error SMP not supported on pre-ARMv6 CPUs
> >  #endif
> >
> > +/*
> > + * sev and wfe are ARMv6K extensions.  Uniprocessor ARMv6 may not have the K
> > + * extensions, so when running on UP, we have to patch these instructions away.
> > + */
> > +#define ALT_SMP(smp, up)                                       \
> > +       "9998:  " smp "\n"                                      \
> > +       "       .pushsection \".alt.smp.init\", \"a\"\n"        \
> > +       "       .long   9998b\n"                                \
> > +       "       " up "\n"                                       \
> > +       "       .popsection\n"
> > +
> > +#ifdef CONFIG_THUMB2_KERNEL
> > +#define SEV            ALT_SMP("sev.w", "nop.w")
> > +#define WFE(cond)      ALT_SMP("wfe" cond ".w", "nop.w")
> > +#else
> > +#define SEV            ALT_SMP("sev", "nop")
> > +#define WFE(cond)      ALT_SMP("wfe" cond, "nop")
> > +#endif
> 
> In the SEV macro definition, can you also include the dsb?

No, you can't do preprocessor conditionals in the middle of a macro
definition, and I don't want to have 4 versions of the SEV stuff.

> This barrier is only there because of sev, otherwise we don't need it
> (we have a dmb prior to releasing the lock).

1. Does it make sense to have sev and wfe instructions in non-SMP kernels?
We now have in asm/system.h:
#if __LINUX_ARM_ARCH__ >= 7 ||          \
        (__LINUX_ARM_ARCH__ == 6 && defined(CONFIG_CPU_32v6K))
#define sev()   __asm__ __volatile__ ("sev" : : : "memory")
#define wfe()   __asm__ __volatile__ ("wfe" : : : "memory")
#define wfi()   __asm__ __volatile__ ("wfi" : : : "memory")
#endif

2. Should we have a smp_dsb() which makes the dsb conditional elsewhere?

3. Do we always need a dsb prior to a sev?  Maybe the SPEAR patches need
another review to determine how they're using sev()?



More information about the linux-arm-kernel mailing list