diff mbox

[1/2] vmx,svm: Add module parameter to ignore the 'in use' check

Message ID 1309820954-8629-1-git-send-email-levinsasha928@gmail.com (mailing list archive)
State New, archived
Headers show

Commit Message

Sasha Levin July 4, 2011, 11:09 p.m. UTC
Add a module parameter 'check_inuse' to allow disabling the check of whether
virtualization has already been enabled on the given cpu.

This is needed to deal with broken BIOS which set the SVM/VMX bit by default.

Cc: Avi Kivity <avi@redhat.com>
Cc: Marcelo Tosatti <mtosatti@redhat.com>
Suggested-by: Alexander Graf <agraf@suse.de>
Signed-off-by: Sasha Levin <levinsasha928@gmail.com>
---
 arch/x86/kvm/svm.c |    5 ++++-
 arch/x86/kvm/vmx.c |    5 ++++-
 2 files changed, 8 insertions(+), 2 deletions(-)

Comments

Avi Kivity July 5, 2011, 8:09 a.m. UTC | #1
On 07/05/2011 02:09 AM, Sasha Levin wrote:
> Add a module parameter 'check_inuse' to allow disabling the check of whether
> virtualization has already been enabled on the given cpu.
>
> This is needed to deal with broken BIOS which set the SVM/VMX bit by default.

Please split the vmx and svm parts.

What machine was this?  Did you try a BIOS update/complaint to 
manufacturer/etc?  Let's try the proper channels before workarounds.
Sasha Levin July 5, 2011, 8:14 a.m. UTC | #2
On Tue, 2011-07-05 at 11:09 +0300, Avi Kivity wrote:
> On 07/05/2011 02:09 AM, Sasha Levin wrote:
> > Add a module parameter 'check_inuse' to allow disabling the check of whether
> > virtualization has already been enabled on the given cpu.
> >
> > This is needed to deal with broken BIOS which set the SVM/VMX bit by default.
> 
> Please split the vmx and svm parts.
> 
> What machine was this?  Did you try a BIOS update/complaint to 
> manufacturer/etc?  Let's try the proper channels before workarounds.
> 

I have no information about the machine.
It was the result of trying to debug an issue reported on IRC where we
found that the SVM flag is being set after boot even before the kvm
module is loaded.
Joerg Roedel July 5, 2011, 9:11 a.m. UTC | #3
On Tue, Jul 05, 2011 at 11:14:43AM +0300, Sasha Levin wrote:
> I have no information about the machine.  It was the result of trying
> to debug an issue reported on IRC where we found that the SVM flag is
> being set after boot even before the kvm module is loaded.

Have you ruled out that any other third-party hypervisor module was
loaded before KVM? The virtual-box module for example?

	Joerg

--
To unsubscribe from this list: send the line "unsubscribe kvm" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Sasha Levin July 5, 2011, 9:32 a.m. UTC | #4
On Tue, 2011-07-05 at 11:11 +0200, Joerg Roedel wrote:
> On Tue, Jul 05, 2011 at 11:14:43AM +0300, Sasha Levin wrote:
> > I have no information about the machine.  It was the result of trying
> > to debug an issue reported on IRC where we found that the SVM flag is
> > being set after boot even before the kvm module is loaded.
> 
> Have you ruled out that any other third-party hypervisor module was
> loaded before KVM? The virtual-box module for example?

No other hypervisor was installed and lsmod output was clean.
Avi Kivity July 5, 2011, 9:37 a.m. UTC | #5
On 07/05/2011 12:32 PM, Sasha Levin wrote:
> On Tue, 2011-07-05 at 11:11 +0200, Joerg Roedel wrote:
> >  On Tue, Jul 05, 2011 at 11:14:43AM +0300, Sasha Levin wrote:
> >  >  I have no information about the machine.  It was the result of trying
> >  >  to debug an issue reported on IRC where we found that the SVM flag is
> >  >  being set after boot even before the kvm module is loaded.
> >
> >  Have you ruled out that any other third-party hypervisor module was
> >  loaded before KVM? The virtual-box module for example?
>
> No other hypervisor was installed and lsmod output was clean.

This needs to be understood further.
Sasha Levin July 5, 2011, 9:56 a.m. UTC | #6
On Tue, 2011-07-05 at 12:37 +0300, Avi Kivity wrote:
> On 07/05/2011 12:32 PM, Sasha Levin wrote:
> > On Tue, 2011-07-05 at 11:11 +0200, Joerg Roedel wrote:
> > >  On Tue, Jul 05, 2011 at 11:14:43AM +0300, Sasha Levin wrote:
> > >  >  I have no information about the machine.  It was the result of trying
> > >  >  to debug an issue reported on IRC where we found that the SVM flag is
> > >  >  being set after boot even before the kvm module is loaded.
> > >
> > >  Have you ruled out that any other third-party hypervisor module was
> > >  loaded before KVM? The virtual-box module for example?
> >
> > No other hypervisor was installed and lsmod output was clean.
> 
> This needs to be understood further.
> 

Please note that I don't have access to the hardware in question, this
was done over IRC.

Here are the steps taken in debugging this issue:

1. Looking at the dmesg ( http://pastebin.com/eM7bDY8r ) we saw that
when trying to load the kvm module, the following error shows up: 'kvm:
enabling virtualization on CPU0 failed'.

2. We went through the lsmod output (unfortunately I don't have the link
as it's gone from my IRC buffer) and didn't see any modules belonging to
other hypervisors.

3. At that point, looking at the code - we figured that a set SVM flag
is the possible culprit since it's the only code path which fails
loading the module with that error message without printing anything
else.

4. Installed msr-tools and injected the msr module so that we could read
msr values from userspace.

5. Ran 'rdmsr 0xc0000080' to read the extended feature register. The
output had bit 12 set - which means that SVM bit was enabled.

6. Ran 'wrmsr 0xc0000080 0xd01' which disabled the SVM bit.

7. kvm module loaded ok.
Avi Kivity July 5, 2011, 10:37 a.m. UTC | #7
On 07/05/2011 12:56 PM, Sasha Levin wrote:
> Please note that I don't have access to the hardware in question, this
> was done over IRC.
>

I understand that.  Can you get in contact with the reporter again?

> Here are the steps taken in debugging this issue:
>
> 1. Looking at the dmesg ( http://pastebin.com/eM7bDY8r ) we saw that
> when trying to load the kvm module, the following error shows up: 'kvm:
> enabling virtualization on CPU0 failed'.
>
> 2. We went through the lsmod output (unfortunately I don't have the link
> as it's gone from my IRC buffer) and didn't see any modules belonging to
> other hypervisors.
>
> 3. At that point, looking at the code - we figured that a set SVM flag
> is the possible culprit since it's the only code path which fails
> loading the module with that error message without printing anything
> else.
>
> 4. Installed msr-tools and injected the msr module so that we could read
> msr values from userspace.
>
> 5. Ran 'rdmsr 0xc0000080' to read the extended feature register. The
> output had bit 12 set - which means that SVM bit was enabled.
>
> 6. Ran 'wrmsr 0xc0000080 0xd01' which disabled the SVM bit.
>
> 7. kvm module loaded ok.

My questions are:

- was a BIOS update attempted?  at least VMware uses the same check as 
kvm, and probably virtualbox as well, so this problem should have been 
seen before.
- was the vendor contacted?  Not that I think we'll see a lot of good 
from that.
- was this after a reset or cold boot?
- maybe a stealth rootkit is involved?
Sasha Levin July 5, 2011, 11:07 a.m. UTC | #8
On Tue, 2011-07-05 at 13:37 +0300, Avi Kivity wrote:
> On 07/05/2011 12:56 PM, Sasha Levin wrote:
> > Please note that I don't have access to the hardware in question, this
> > was done over IRC.
> >
> 
> I understand that.  Can you get in contact with the reporter again?
> 

Hopefully, If he comes back on IRC (or reads these mails :) ).

> > Here are the steps taken in debugging this issue:
> >
> > 1. Looking at the dmesg ( http://pastebin.com/eM7bDY8r ) we saw that
> > when trying to load the kvm module, the following error shows up: 'kvm:
> > enabling virtualization on CPU0 failed'.
> >
> > 2. We went through the lsmod output (unfortunately I don't have the link
> > as it's gone from my IRC buffer) and didn't see any modules belonging to
> > other hypervisors.
> >
> > 3. At that point, looking at the code - we figured that a set SVM flag
> > is the possible culprit since it's the only code path which fails
> > loading the module with that error message without printing anything
> > else.
> >
> > 4. Installed msr-tools and injected the msr module so that we could read
> > msr values from userspace.
> >
> > 5. Ran 'rdmsr 0xc0000080' to read the extended feature register. The
> > output had bit 12 set - which means that SVM bit was enabled.
> >
> > 6. Ran 'wrmsr 0xc0000080 0xd01' which disabled the SVM bit.
> >
> > 7. kvm module loaded ok.
> 
> My questions are:
> 
> - was a BIOS update attempted?  at least VMware uses the same check as 
> kvm, and probably virtualbox as well, so this problem should have been 
> seen before.

We didn't update the BIOS.

virtualbox was installed previously and didn't work properly either -
thats why he tried kvm afaik.

We made sure to remove virtualbox properly and did a reset afterwards.
After removal, no virtualbox modules were loaded at any point.

> - was the vendor contacted?  Not that I think we'll see a lot of good 
> from that.

Nope.

> - was this after a reset or cold boot?

This was a reset, we didn't try a cold boot.

> - maybe a stealth rootkit is involved?
> 

A rootkit that messed up the MSRs or runs a hidden guest sounds like a
possibility too.

Alexander Graf suggested it's a simple case of a BIOS vendor not
implementing specs properly as he has seen a similar case of BIOS only
allowing to start virtualization on the first CPU.
Avi Kivity July 5, 2011, 11:14 a.m. UTC | #9
On 07/05/2011 02:07 PM, Sasha Levin wrote:
> >
> >  - was a BIOS update attempted?  at least VMware uses the same check as
> >  kvm, and probably virtualbox as well, so this problem should have been
> >  seen before.
>
> We didn't update the BIOS.
>
> virtualbox was installed previously and didn't work properly either -
> thats why he tried kvm afaik.

That's a good data point.

> >  - was this after a reset or cold boot?
>
> This was a reset, we didn't try a cold boot.

Unlikely to help, since it was a preexisting problem.

> >  - maybe a stealth rootkit is involved?
> >
>
> A rootkit that messed up the MSRs or runs a hidden guest sounds like a
> possibility too.
>
> Alexander Graf suggested it's a simple case of a BIOS vendor not
> implementing specs properly as he has seen a similar case of BIOS only
> allowing to start virtualization on the first CPU.

I agree.  But let's try a BIOS update first, if possible.

If that fails, please repost the patches, but for svm only, since we 
haven't seen these issues on Intel.
diff mbox

Patch

diff --git a/arch/x86/kvm/svm.c b/arch/x86/kvm/svm.c
index 475d1c9..5ca76e3 100644
--- a/arch/x86/kvm/svm.c
+++ b/arch/x86/kvm/svm.c
@@ -183,6 +183,9 @@  module_param(npt, int, S_IRUGO);
 static int nested = 1;
 module_param(nested, int, S_IRUGO);
 
+static bool check_inuse = 1;
+module_param(check_inuse, bool, S_IRUGO);
+
 static void svm_flush_tlb(struct kvm_vcpu *vcpu);
 static void svm_complete_interrupts(struct vcpu_svm *svm);
 
@@ -587,7 +590,7 @@  static int svm_hardware_enable(void *garbage)
 	int me = raw_smp_processor_id();
 
 	rdmsrl(MSR_EFER, efer);
-	if (efer & EFER_SVME)
+	if (check_inuse && (efer & EFER_SVME))
 		return -EBUSY;
 
 	if (!has_svm()) {
diff --git a/arch/x86/kvm/vmx.c b/arch/x86/kvm/vmx.c
index f5b49c7..3046b07 100644
--- a/arch/x86/kvm/vmx.c
+++ b/arch/x86/kvm/vmx.c
@@ -74,6 +74,9 @@  module_param(vmm_exclusive, bool, S_IRUGO);
 static int __read_mostly yield_on_hlt = 1;
 module_param(yield_on_hlt, bool, S_IRUGO);
 
+static bool check_inuse = 1;
+module_param(check_inuse, bool, S_IRUGO);
+
 /*
  * If nested=1, nested virtualization is supported, i.e., guests may use
  * VMX and be a hypervisor for its own guests. If nested=0, guests may not
@@ -2230,7 +2233,7 @@  static int hardware_enable(void *garbage)
 	u64 phys_addr = __pa(per_cpu(vmxarea, cpu));
 	u64 old, test_bits;
 
-	if (read_cr4() & X86_CR4_VMXE)
+	if (check_inuse && (read_cr4() & X86_CR4_VMXE))
 		return -EBUSY;
 
 	INIT_LIST_HEAD(&per_cpu(loaded_vmcss_on_cpu, cpu));