[PATCH V2] arm64: add DSB after icache flush in __flush_icache_all()
Will Deacon
will.deacon at arm.com
Thu Jan 30 19:16:48 EST 2014
Hi Nico,
On Thu, Jan 30, 2014 at 09:42:29PM +0000, Nicolas Pitre wrote:
> On Thu, 30 Jan 2014, Will Deacon wrote:
> > On Thu, Jan 30, 2014 at 06:04:43AM +0000, Vinayak Kale wrote:
> > > Can you please elaborate whether you are referring to lack of memory
> > > clobber or missing barriers?
> >
> > The clobbers. For example:
> >
> > arch/arm64/kvm/sys_regs.c:
> >
> > /* Make sure noone else changes CSSELR during this! */
> > local_irq_disable();
> > /* Put value into CSSELR */
> > asm volatile("msr csselr_el1, %x0" : : "r" (csselr));
> > isb();
> > /* Read result out of CCSIDR */
> > asm volatile("mrs %0, ccsidr_el1" : "=r" (ccsidr));
> > local_irq_enable();
> >
> > Just about everything can be re-ordered in that block, because the asm
> > volatile statements don't have "memory" clobbers.
>
> I don't think they would be reordered at all with the
> volatile qualifiers.
Whilst that may be the case in current compilers (i.e. I've not actually
seen the above sequence get re-ordered), the GCC documentation states that:
Similarly, you can't expect a sequence of volatile asm instructions to remain
perfectly consecutive. If you want consecutive output, use a single asm. Also,
GCC performs some optimizations across a volatile asm instruction; GCC does not
`forget everything' when it encounters a volatile asm instruction the way some
other compilers do.
so I really think that the "memory" clobbers are needed to ensure strict
ordering. This matches my understanding from discussions with the compiler
engineers at ARM.
Will
More information about the linux-arm-kernel
mailing list