Re: [PATCH v1 02/47] x86: mtrr: generalize run time disabling of MTRR
From: Luis R. Rodriguez <hidden>
Date: 2015-04-02 21:49:20
Also in:
lkml, xen-devel
Subsystem:
the rest, x86 architecture (32-bit and 64-bit) · Maintainers:
Linus Torvalds, Thomas Gleixner, Ingo Molnar, Borislav Petkov, Dave Hansen
On Sat, Mar 28, 2015 at 12:56:30AM +0100, Luis R. Rodriguez wrote:
On Fri, Mar 27, 2015 at 02:40:17PM -0600, Toshi Kani wrote:quoted
On Fri, 2015-03-20 at 16:17 -0700, Luis R. Rodriguez wrote: :quoted
@@ -734,6 +742,7 @@ void __init mtrr_bp_init(void) } if (mtrr_if) { + mtrr_enabled = true; set_num_var_ranges(); init_table(); if (use_intel()) {get_mtrr_state(); After setting mtrr_enabled to true, get_mtrr_state() reads MSR_MTRRdefType and sets 'mtrr_state.enabled', which also indicates if MTRRs are enabled or not on the system. So, potentially, we could have a case that mtrr_enabled is set to true, but mtrr_state.enabled is set to disabled when MTRRs are disabled by BIOS.Thanks for the review, in this case then we should update mtrr_enabled to false.quoted
ps. I recently cleaned up this part of the MTRR code in the patch below, which is currently available in the -mm & -next trees. https://lkml.org/lkml/2015/3/24/1063Great I will rebase and work with that and try to address this consideration you have raised.
OK I'll mesh in this change as well in my next respin:
diff --git a/arch/x86/kernel/cpu/mtrr/generic.c b/arch/x86/kernel/cpu/mtrr/generic.c
index a83f27a..ecf7cb9 100644
--- a/arch/x86/kernel/cpu/mtrr/generic.c
+++ b/arch/x86/kernel/cpu/mtrr/generic.c@@ -438,7 +438,7 @@ static void __init print_mtrr_state(void) } /* Grab all of the MTRR state for this CPU into *state */ -void __init get_mtrr_state(void) +bool __init get_mtrr_state(void) { struct mtrr_var_range *vrs; unsigned long flags;
@@ -482,6 +482,8 @@ void __init get_mtrr_state(void) post_set(); local_irq_restore(flags); + + return !!mtrr_state.enabled; } /* Some BIOS's are messed up and don't set all MTRRs the same! */
diff --git a/arch/x86/kernel/cpu/mtrr/main.c b/arch/x86/kernel/cpu/mtrr/main.c
index ea5f363..f96195e 100644
--- a/arch/x86/kernel/cpu/mtrr/main.c
+++ b/arch/x86/kernel/cpu/mtrr/main.c@@ -734,22 +742,25 @@ void __init mtrr_bp_init(void) } if (mtrr_if) { + mtrr_enabled = true; set_num_var_ranges(); init_table(); if (use_intel()) { - get_mtrr_state(); + /* BIOS may override */ + mtrr_enabled = get_mtrr_state(); if (mtrr_cleanup(phys_addr)) { changed_by_mtrr_cleanup = 1;
@@ -745,11 +755,14 @@ void __init mtrr_bp_init(void) } } } + + if (!mtrr_enabled) + pr_info("mtrr: system does not support MTRR\n"); }
diff --git a/arch/x86/kernel/cpu/mtrr/mtrr.h b/arch/x86/kernel/cpu/mtrr/mtrr.h
index df5e41f..951884d 100644
--- a/arch/x86/kernel/cpu/mtrr/mtrr.h
+++ b/arch/x86/kernel/cpu/mtrr/mtrr.h@@ -51,7 +51,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); -void get_mtrr_state(void); +bool get_mtrr_state(void); extern void set_mtrr_ops(const struct mtrr_ops *ops);