From: Ingo Molnar <mingo@elte.hu>
Date: Mon, 12 Feb 2007 08:54:42 +0000 (-0800)
Subject: [PATCH] kvm: fix vcpu freeing bug
X-Git-Tag: firefly_0821_release~31122^2~60
X-Git-Url: http://demsky.eecs.uci.edu/git/?a=commitdiff_plain;h=1e8ba6fba5050ec11bba90c8622aa2ed95ff711f;p=firefly-linux-kernel-4.4.55.git

[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>
---

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);