Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1753255AbcCKJNE (ORCPT ); Fri, 11 Mar 2016 04:13:04 -0500 Received: from mail.skyhub.de ([78.46.96.112]:37723 "EHLO mail.skyhub.de" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751407AbcCKJMt (ORCPT ); Fri, 11 Mar 2016 04:12:49 -0500 Date: Fri, 11 Mar 2016 10:12:30 +0100 From: Borislav Petkov To: Toshi Kani Cc: mingo@kernel.org, bp@suse.de, hpa@zytor.com, tglx@linutronix.de, mcgrof@suse.com, jgross@suse.com, paul.gortmaker@windriver.com, x86@kernel.org, linux-kernel@vger.kernel.org Subject: Re: [PATCH 1/2] x86/mm/pat: Change pat_disable() to emulate PAT table Message-ID: <20160311091229.GA4347@pd.tnic> References: <1457671546-13486-1-git-send-email-toshi.kani@hpe.com> <1457671546-13486-2-git-send-email-toshi.kani@hpe.com> MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Disposition: inline In-Reply-To: <1457671546-13486-2-git-send-email-toshi.kani@hpe.com> User-Agent: Mutt/1.5.24 (2015-08-30) Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 2978 Lines: 85 On Thu, Mar 10, 2016 at 09:45:45PM -0700, Toshi Kani wrote: > Since 'commit 9cd25aac1f44 ("x86/mm/pat: Emulate PAT when it > is disabled")', we emulate a PAT table when PAT is disabled. > This requires pat_init() be called even if PAT is disabled, > which revealed a long standing issue that PAT is left enabled > without calling pat_init() at all. > > pat_init() is called from MTRR code since it relies on MTRR's > rendezvous handler to initialize PAT for all APs . However, > when CPU does not support MTRR, ex. qemu32's virtual CPU, MTRR > is set disabled and does not call pat_init(). There is no > interface available for MTRR to disable PAT, either. > > Change pat_disable() to a regular function (from an inline func) > so that MTRR can call it to disable PAT when MTRR is disabled. > pat_disable() sets PAT disabled, and calls pat_disable_init() > to emulate the PAT table. > > link: https://lkml.org/lkml/2016/3/10/402 > Reported-by: Paul Gortmaker > Signed-off-by: Toshi Kani > Cc: Borislav Petkov > Cc: Luis R. Rodriguez > Cc: Juergen Gross > Cc: Ingo Molnar > Cc: H. Peter Anvin > Cc: Thomas Gleixner > --- > arch/x86/include/asm/pat.h | 1 + > arch/x86/mm/pat.c | 84 +++++++++++++++++++++++++++----------------- > 2 files changed, 52 insertions(+), 33 deletions(-) > > diff --git a/arch/x86/include/asm/pat.h b/arch/x86/include/asm/pat.h > index ca6c228..016142b 100644 > --- a/arch/x86/include/asm/pat.h > +++ b/arch/x86/include/asm/pat.h > @@ -5,6 +5,7 @@ > #include > > bool pat_enabled(void); > +void pat_disable(const char *reason); > extern void pat_init(void); > void pat_init_cache_modes(u64); > > diff --git a/arch/x86/mm/pat.c b/arch/x86/mm/pat.c > index f4ae536..1ff8aa9 100644 > --- a/arch/x86/mm/pat.c > +++ b/arch/x86/mm/pat.c > @@ -40,11 +40,19 @@ > static bool boot_cpu_done; > > static int __read_mostly __pat_enabled = IS_ENABLED(CONFIG_X86_PAT); > +static void pat_disable_init(void); > > -static inline void pat_disable(const char *reason) > +void pat_disable(const char *reason) > { > + if (boot_cpu_done) { > + pr_info("x86/PAT: PAT cannot be disabled after initialized\n"); pr_err() > + return; > + } > + > __pat_enabled = 0; > pr_info("x86/PAT: %s\n", reason); > + > + pat_disable_init(); Why can't you call pat_init() here simply? It checks pat_enabled(). You can call it pat_setup() or so if it looks confusing to call an init function in a disable function... Then you don't have to add yet another static disable_init_done but rely on boot_cpu_done which gets set in pat_init(). Also, I don't see the static_cpu_has() check I suggested yesterday - we need to check the feature bits if PAT gets disabled early on some old Intels. -- Regards/Gruss, Boris. ECO tip #101: Trim your mails when you reply.