Message ID | 20150402214912.GZ5622@wotan.suse.de (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
On Thu, 2015-04-02 at 23:49 +0200, Luis R. Rodriguez wrote: > 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: > > > On Fri, 2015-03-20 at 16:17 -0700, Luis R. Rodriguez wrote: > > > : > > > > @@ -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. > > > > > 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/1063 > > > > Great 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; This should be: return mtrr_state.enabled & MTRR_STATE_MTRR_ENABLED; because the MTRR_STATE_MTRR_FIXED_ENABLED flag is ignored when the MTRR_STATE_MTRR_ENABLED flag is clear. Thanks, -Toshi -- To unsubscribe from this list: send the line "unsubscribe linux-fbdev" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
On Thu, Apr 02, 2015 at 05:52:16PM -0600, Toshi Kani wrote: > On Thu, 2015-04-02 at 23:49 +0200, Luis R. Rodriguez wrote: > > 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: > > > > On Fri, 2015-03-20 at 16:17 -0700, Luis R. Rodriguez wrote: > > > > : > > > > > @@ -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. > > > > > > > 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/1063 > > > > > > Great 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; > > This should be: > return mtrr_state.enabled & MTRR_STATE_MTRR_ENABLED; > > because the MTRR_STATE_MTRR_FIXED_ENABLED flag is ignored when the > MTRR_STATE_MTRR_ENABLED flag is clear. Thanks, I've used return !!(mtrr_state.enabled & MTRR_STATE_MTRR_ENABLED); Amended. Luis -- To unsubscribe from this list: send the line "unsubscribe linux-fbdev" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
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);