Message ID | 20211213104634.199141-3-mlevitsk@redhat.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | RFC: KVM: SVM: Allow L1's AVIC to co-exist with nesting | expand |
On Mon, Dec 13, 2021, Maxim Levitsky wrote: > Apparently on some systems AVIC is disabled in CPUID but still usable. > > Allow the user to override the CPUID if the user is willing to > take the risk. > > Signed-off-by: Maxim Levitsky <mlevitsk@redhat.com> > --- > arch/x86/kvm/svm/svm.c | 11 +++++++++-- > 1 file changed, 9 insertions(+), 2 deletions(-) > > diff --git a/arch/x86/kvm/svm/svm.c b/arch/x86/kvm/svm/svm.c > index c9668a3b51011..468cc385c35f0 100644 > --- a/arch/x86/kvm/svm/svm.c > +++ b/arch/x86/kvm/svm/svm.c > @@ -206,6 +206,9 @@ module_param(tsc_scaling, int, 0444); > static bool avic; > module_param(avic, bool, 0444); > > +static bool force_avic; > +module_param_unsafe(force_avic, bool, 0444); > + > bool __read_mostly dump_invalid_vmcb; > module_param(dump_invalid_vmcb, bool, 0644); > > @@ -4656,10 +4659,14 @@ static __init int svm_hardware_setup(void) > nrips = false; > } > > - enable_apicv = avic = avic && npt_enabled && boot_cpu_has(X86_FEATURE_AVIC); > + enable_apicv = avic = avic && npt_enabled && (boot_cpu_has(X86_FEATURE_AVIC) || force_avic); > > if (enable_apicv) { > - pr_info("AVIC enabled\n"); > + if (!boot_cpu_has(X86_FEATURE_AVIC)) { > + pr_warn("AVIC is not supported in CPUID but force enabled"); > + pr_warn("Your system might crash and burn"); > + } else Needs curly braces, though arguably the "AVIC enabled" part should be printed regardless of boot_cpu_has(X86_FEATURE_AVIC). > + pr_info("AVIC enabled\n"); This is all more than a bit terrifying, though I can see the usefuless for a developer. At the very least, this should taint the kernel. This should also probably be buried behind a Kconfig that is itself buried behind EXPERT.
On Tue, 2022-01-04 at 22:25 +0000, Sean Christopherson wrote: > On Mon, Dec 13, 2021, Maxim Levitsky wrote: > > Apparently on some systems AVIC is disabled in CPUID but still usable. > > > > Allow the user to override the CPUID if the user is willing to > > take the risk. > > > > Signed-off-by: Maxim Levitsky <mlevitsk@redhat.com> > > --- > > arch/x86/kvm/svm/svm.c | 11 +++++++++-- > > 1 file changed, 9 insertions(+), 2 deletions(-) > > > > diff --git a/arch/x86/kvm/svm/svm.c b/arch/x86/kvm/svm/svm.c > > index c9668a3b51011..468cc385c35f0 100644 > > --- a/arch/x86/kvm/svm/svm.c > > +++ b/arch/x86/kvm/svm/svm.c > > @@ -206,6 +206,9 @@ module_param(tsc_scaling, int, 0444); > > static bool avic; > > module_param(avic, bool, 0444); > > > > +static bool force_avic; > > +module_param_unsafe(force_avic, bool, 0444); > > + > > bool __read_mostly dump_invalid_vmcb; > > module_param(dump_invalid_vmcb, bool, 0644); > > > > @@ -4656,10 +4659,14 @@ static __init int svm_hardware_setup(void) > > nrips = false; > > } > > > > - enable_apicv = avic = avic && npt_enabled && boot_cpu_has(X86_FEATURE_AVIC); > > + enable_apicv = avic = avic && npt_enabled && (boot_cpu_has(X86_FEATURE_AVIC) || force_avic); > > > > if (enable_apicv) { > > - pr_info("AVIC enabled\n"); > > + if (!boot_cpu_has(X86_FEATURE_AVIC)) { > > + pr_warn("AVIC is not supported in CPUID but force enabled"); > > + pr_warn("Your system might crash and burn"); > > + } else > > Needs curly braces, though arguably the "AVIC enabled" part should be printed > regardless of boot_cpu_has(X86_FEATURE_AVIC). > > > + pr_info("AVIC enabled\n"); > > This is all more than a bit terrifying, though I can see the usefuless for a > developer. At the very least, this should taint the kernel. This should also > probably be buried behind a Kconfig that is itself buried behind EXPERT. > I used 'module_param_unsafe' which does taint the kernel. Best regards, Maxim Levitsky
On Wed, Jan 05, 2022, Maxim Levitsky wrote: > On Tue, 2022-01-04 at 22:25 +0000, Sean Christopherson wrote: > > This is all more than a bit terrifying, though I can see the usefuless for a > > developer. At the very least, this should taint the kernel. This should also > > probably be buried behind a Kconfig that is itself buried behind EXPERT. > > > I used 'module_param_unsafe' which does taint the kernel. Ah, neat, TIL. Thanks!
diff --git a/arch/x86/kvm/svm/svm.c b/arch/x86/kvm/svm/svm.c index c9668a3b51011..468cc385c35f0 100644 --- a/arch/x86/kvm/svm/svm.c +++ b/arch/x86/kvm/svm/svm.c @@ -206,6 +206,9 @@ module_param(tsc_scaling, int, 0444); static bool avic; module_param(avic, bool, 0444); +static bool force_avic; +module_param_unsafe(force_avic, bool, 0444); + bool __read_mostly dump_invalid_vmcb; module_param(dump_invalid_vmcb, bool, 0644); @@ -4656,10 +4659,14 @@ static __init int svm_hardware_setup(void) nrips = false; } - enable_apicv = avic = avic && npt_enabled && boot_cpu_has(X86_FEATURE_AVIC); + enable_apicv = avic = avic && npt_enabled && (boot_cpu_has(X86_FEATURE_AVIC) || force_avic); if (enable_apicv) { - pr_info("AVIC enabled\n"); + if (!boot_cpu_has(X86_FEATURE_AVIC)) { + pr_warn("AVIC is not supported in CPUID but force enabled"); + pr_warn("Your system might crash and burn"); + } else + pr_info("AVIC enabled\n"); amd_iommu_register_ga_log_notifier(&avic_ga_log_notifier); } else {
Apparently on some systems AVIC is disabled in CPUID but still usable. Allow the user to override the CPUID if the user is willing to take the risk. Signed-off-by: Maxim Levitsky <mlevitsk@redhat.com> --- arch/x86/kvm/svm/svm.c | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-)