Message ID | 1458175619-32206-3-git-send-email-toshi.kani@hpe.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Subject: [PATCH v2 4/6] x86/mtrr: Fix PAT init handling when MTRR MSR is disabled s/ MSR// On Wed, Mar 16, 2016 at 06:46:57PM -0600, Toshi Kani wrote: > get_mtrr_state() calls pat_init() on BSP even if MTRR is disabled > by its MSR. s/by its MSR// > This causes pat_init() to be called on BSP only since APs do not call This doesn't cause that - get_mtrr_state() is called only on the BSP by mtrr_bp_init(). > pat_init() when MTRR is disabled. This inconsistency between BSP and > APs leads undefined behavior. leads to > Move BSP's PAT init code from get_mtrr_state() to mtrr_bp_pat_init(). > Change mtrr_bp_init() to call mtrr_bp_pat_init() if MTRR is enabled. No need for those. > This keeps BSP's calling condition to pat_init() consistent with AP's, > mtrr_ap_init() and mtrr_aps_init(). This one is fine.
On Tue, 2016-03-22 at 18:01 +0100, Borislav Petkov wrote: > Subject: [PATCH v2 4/6] x86/mtrr: Fix PAT init handling when MTRR MSR is > disabled > > s/ MSR// Will do. > On Wed, Mar 16, 2016 at 06:46:57PM -0600, Toshi Kani wrote: > > get_mtrr_state() calls pat_init() on BSP even if MTRR is disabled > > by its MSR. > > s/by its MSR// Will do. > > This causes pat_init() to be called on BSP only since APs do not call > > This doesn't cause that - get_mtrr_state() is called only on the BSP by > mtrr_bp_init(). Right, I will change it to "results" or something. > > pat_init() when MTRR is disabled. This inconsistency between BSP and > > APs leads undefined behavior. > > leads to Will do. > > Move BSP's PAT init code from get_mtrr_state() to mtrr_bp_pat_init(). > > Change mtrr_bp_init() to call mtrr_bp_pat_init() if MTRR is enabled. > > No need for those. OK. > > This keeps BSP's calling condition to pat_init() consistent with AP's, > > mtrr_ap_init() and mtrr_aps_init(). > > This one is fine. :-) Thanks, -Toshi
diff --git a/arch/x86/kernel/cpu/mtrr/generic.c b/arch/x86/kernel/cpu/mtrr/generic.c index fcbcb2f..a9d2e54 100644 --- a/arch/x86/kernel/cpu/mtrr/generic.c +++ b/arch/x86/kernel/cpu/mtrr/generic.c @@ -444,11 +444,24 @@ static void __init print_mtrr_state(void) pr_debug("TOM2: %016llx aka %lldM\n", mtrr_tom2, mtrr_tom2>>20); } +/* PAT setup for BP. We need to go through sync steps here */ +void __init mtrr_bp_pat_init(void) +{ + unsigned long flags; + + local_irq_save(flags); + prepare_set(); + + pat_init(); + + post_set(); + local_irq_restore(flags); +} + /* Grab all of the MTRR state for this CPU into *state */ bool __init get_mtrr_state(void) { struct mtrr_var_range *vrs; - unsigned long flags; unsigned lo, dummy; unsigned int i; @@ -481,15 +494,6 @@ bool __init get_mtrr_state(void) mtrr_state_set = 1; - /* PAT setup for BP. We need to go through sync steps here */ - local_irq_save(flags); - prepare_set(); - - pat_init(); - - post_set(); - local_irq_restore(flags); - return !!(mtrr_state.enabled & MTRR_STATE_MTRR_ENABLED); } diff --git a/arch/x86/kernel/cpu/mtrr/main.c b/arch/x86/kernel/cpu/mtrr/main.c index 2d7d8d7..6186ff4 100644 --- a/arch/x86/kernel/cpu/mtrr/main.c +++ b/arch/x86/kernel/cpu/mtrr/main.c @@ -752,6 +752,9 @@ void __init mtrr_bp_init(void) /* BIOS may override */ __mtrr_enabled = get_mtrr_state(); + if (mtrr_enabled()) + mtrr_bp_pat_init(); + if (mtrr_cleanup(phys_addr)) { changed_by_mtrr_cleanup = 1; mtrr_if->set_all(); diff --git a/arch/x86/kernel/cpu/mtrr/mtrr.h b/arch/x86/kernel/cpu/mtrr/mtrr.h index 951884d..6c7ced0 100644 --- a/arch/x86/kernel/cpu/mtrr/mtrr.h +++ b/arch/x86/kernel/cpu/mtrr/mtrr.h @@ -52,6 +52,7 @@ void set_mtrr_prepare_save(struct set_mtrr_context *ctxt); void fill_mtrr_var_range(unsigned int index, u32 base_lo, u32 base_hi, u32 mask_lo, u32 mask_hi); bool get_mtrr_state(void); +void mtrr_bp_pat_init(void); extern void set_mtrr_ops(const struct mtrr_ops *ops);
get_mtrr_state() calls pat_init() on BSP even if MTRR is disabled by its MSR. This causes pat_init() to be called on BSP only since APs do not call pat_init() when MTRR is disabled. This inconsistency between BSP and APs leads undefined behavior. Move BSP's PAT init code from get_mtrr_state() to mtrr_bp_pat_init(). Change mtrr_bp_init() to call mtrr_bp_pat_init() if MTRR is enabled. This keeps BSP's calling condition to pat_init() consistent with AP's, mtrr_ap_init() and mtrr_aps_init(). Signed-off-by: Toshi Kani <toshi.kani@hpe.com> Cc: Borislav Petkov <bp@suse.de> Cc: Luis R. Rodriguez <mcgrof@suse.com> Cc: Juergen Gross <jgross@suse.com> Cc: Ingo Molnar <mingo@kernel.org> Cc: H. Peter Anvin <hpa@zytor.com> Cc: Thomas Gleixner <tglx@linutronix.de> --- arch/x86/kernel/cpu/mtrr/generic.c | 24 ++++++++++++++---------- arch/x86/kernel/cpu/mtrr/main.c | 3 +++ arch/x86/kernel/cpu/mtrr/mtrr.h | 1 + 3 files changed, 18 insertions(+), 10 deletions(-)