summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorIngo Molnar2007-02-12 09:54:42 +0100
committerLinus Torvalds2007-02-12 18:48:40 +0100
commit1e8ba6fba5050ec11bba90c8622aa2ed95ff711f (patch)
tree4dfc7c1c8a6119648978f25c1065b344123638cb
parent[PATCH] kvm: Fix mismatch between 32-bit and 64-bit abi (diff)
downloadkernel-qcow2-linux-1e8ba6fba5050ec11bba90c8622aa2ed95ff711f.tar.gz
kernel-qcow2-linux-1e8ba6fba5050ec11bba90c8622aa2ed95ff711f.tar.xz
kernel-qcow2-linux-1e8ba6fba5050ec11bba90c8622aa2ed95ff711f.zip
[PATCH] kvm: fix vcpu freeing bug
vcpu_load() can return NULL and it sometimes does in failure paths (for example when the userspace ABI version is too old) - causing a preemption count underflow in the ->vcpu_free() later on. So check for NULL. Signed-off-by: Ingo Molnar <mingo@elte.hu> Signed-off-by: Avi Kivity <avi@qumranet.com> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
-rw-r--r--drivers/kvm/kvm_main.c4
1 files changed, 3 insertions, 1 deletions
diff --git a/drivers/kvm/kvm_main.c b/drivers/kvm/kvm_main.c
index eb3931ca680a..9b79d3451f6f 100644
--- a/drivers/kvm/kvm_main.c
+++ b/drivers/kvm/kvm_main.c
@@ -272,7 +272,9 @@ static void kvm_free_physmem(struct kvm *kvm)
static void kvm_free_vcpu(struct kvm_vcpu *vcpu)
{
- vcpu_load(vcpu->kvm, vcpu_slot(vcpu));
+ if (!vcpu_load(vcpu->kvm, vcpu_slot(vcpu)))
+ return;
+
kvm_mmu_destroy(vcpu);
vcpu_put(vcpu);
kvm_arch_ops->vcpu_free(vcpu);