From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1763383AbbA3XcC (ORCPT ); Fri, 30 Jan 2015 18:32:02 -0500 Received: from mail.skyhub.de ([78.46.96.112]:50724 "EHLO mail.skyhub.de" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1758533AbbA3XcA (ORCPT ); Fri, 30 Jan 2015 18:32:00 -0500 Date: Sat, 31 Jan 2015 00:31:42 +0100 From: Borislav Petkov To: Scotty Bauer Cc: tglx@linutronix.de, mingo@redheat.com, hpa@zytor.com, linux-kernel@vger.kernel.org, x86@kernel.org Subject: Re: [PATCH] x86/smpboot: check if CLFLUSH is actually necessary Message-ID: <20150130233142.GA1884@pd.tnic> References: <54CBF6F9.5040508@eng.utah.edu> MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Disposition: inline In-Reply-To: <54CBF6F9.5040508@eng.utah.edu> User-Agent: Mutt/1.5.23 (2014-03-12) Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org 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 > 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 > --- > 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.zwisler@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. --