Message ID | 20120817034854.GE24242@S2101-09.ap.freescale.net (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
On Fri, Aug 17, 2012 at 11:48:56AM +0800, Shawn Guo wrote: > > I think what needs to happen here (while we wait) is someone _with_ the > > problem needs to experiment, and find out how many nops are needed for > > the DMB not to have much effect in cpu_relax(). If it turns out we just > > need to put one nop in, then that's not _too_ bad. > > At least, I need to have 5 nops to get rid of the issue, something like > below. > Russell, What's your take on this then?
diff --git a/arch/arm/include/asm/processor.h b/arch/arm/include/asm/processor.h index 99afa74..3e1b099 100644 --- a/arch/arm/include/asm/processor.h +++ b/arch/arm/include/asm/processor.h @@ -80,7 +80,14 @@ extern void release_thread(struct task_struct *); unsigned long get_wchan(struct task_struct *p); #if __LINUX_ARM_ARCH__ == 6 || defined(CONFIG_ARM_ERRATA_754327) -#define cpu_relax() smp_mb() +#define cpu_relax() do { \ + asm("nop"); \ + asm("nop"); \ + asm("nop"); \ + asm("nop"); \ + asm("nop"); \ + smp_mb(); \ + } while (0) #else #define cpu_relax() barrier() #endif