On Fri, Jan 30, 2015 at 02:26:17PM -0700, Scotty Bauer wrote: > mwait_play_dead previously issued a CLFLUSH to work around a bug on some xeon > processors. We can now determine if the CPU is a buggy CPU. This patch checks > if if we're on a buggy CPU which allows non-buggy cpu's to eliminate the > CLFLUSH. > > > > >
> From 3da1be5c998a8d51f98fdba09b3cb477526c5ff3 Mon Sep 17 00:00:00 2001 > From: Scott Bauer <sba...@eng.utah.edu> > Date: Fri, 30 Jan 2015 14:10:37 -0700 > Subject: [PATCH] Add check to determine if CLFLUSH is actually necessary > before monitor/wait > > Signed-off-by: Scott Bauer <sba...@eng.utah.edu> > --- > arch/x86/kernel/smpboot.c | 13 ++++++++++--- > 1 file changed, 10 insertions(+), 3 deletions(-) > > diff --git a/arch/x86/kernel/smpboot.c b/arch/x86/kernel/smpboot.c > index 6d7022c..552ff48 100644 > --- a/arch/x86/kernel/smpboot.c > +++ b/arch/x86/kernel/smpboot.c > @@ -1384,6 +1384,7 @@ static inline void mwait_play_dead(void) > unsigned int highest_subcstate = 0; > void *mwait_ptr; > int i; > + int cpu; > > if (!this_cpu_has(X86_FEATURE_MWAIT)) > return; > @@ -1420,6 +1421,7 @@ static inline void mwait_play_dead(void) > * content is immaterial as it is not actually modified in any way. > */ > mwait_ptr = ¤t_thread_info()->flags; > + cpu = smp_processor_id(); > > wbinvd(); > > @@ -1430,10 +1432,15 @@ static inline void mwait_play_dead(void) > * needed, but it should be harmless in either case. > * The WBINVD is insufficient due to the spurious-wakeup > * case where we return around the loop. > + * > + * Check if the CLFLUSH is actually necessary before calling > */ > - mb(); > - clflush(mwait_ptr); > - mb(); > + if (cpu_has_bug(&cpu_data(cpu), X86_BUG_CLFLUSH_MONITOR)) { > + mb(); > + clflush(mwait_ptr); > + mb(); Or you can so something even better: alternative(ASM_NOP3, "clflush", X86_BUG_CLFLUSH_MONITOR); Well, almost, you'd also need to pass in mwait_ptr, i.e. something like that: https://lkml.kernel.org/r/1422377631-8986-3-git-send-email-ross.zwis...@linux.intel.com but simpler. Maybe this: asm volatile(ALTERNATIVE(ASM_NOP3, "clflush %[p]", X86_BUG_CLFLUSH_MONITOR) : [p] "+m" (*mwait_ptr)); Totally untested though - it is supposed to show the idea only. -- Regards/Gruss, Boris. ECO tip #101: Trim your mails when you reply. -- -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/