Juergen Gross 957a2a
Patch-mainline: v6.1-rc1
Juergen Gross 957a2a
Git-commit: 1cac8d9f6bd25df3713103e44e2d9ca0c2e03c33
Juergen Gross 957a2a
References: bsc#1206616
Juergen Gross 957a2a
From: Sean Christopherson <seanjc@google.com>
Juergen Gross 957a2a
Date: Tue, 30 Aug 2022 15:37:08 +0200
Juergen Gross 957a2a
Subject: [PATCH] KVM: x86: Check for existing Hyper-V vCPU in
Juergen Gross 957a2a
 kvm_hv_vcpu_init()
Juergen Gross 957a2a
Juergen Gross 957a2a
When potentially allocating/initializing the Hyper-V vCPU struct, check
Juergen Gross 957a2a
for an existing instance in kvm_hv_vcpu_init() instead of requiring
Juergen Gross 957a2a
callers to perform the check.  Relying on callers to do the check is
Juergen Gross 957a2a
risky as it's all too easy for KVM to overwrite vcpu->arch.hyperv and
Juergen Gross 957a2a
leak memory, and it adds additional burden on callers without much
Juergen Gross 957a2a
benefit.
Juergen Gross 957a2a
Juergen Gross 957a2a
No functional change intended.
Juergen Gross 957a2a
Juergen Gross 957a2a
Signed-off-by: Sean Christopherson <seanjc@google.com>
Juergen Gross 957a2a
Signed-off-by: Vitaly Kuznetsov <vkuznets@redhat.com>
Juergen Gross 957a2a
Signed-off-by: Sean Christopherson <seanjc@google.com>
Juergen Gross 957a2a
Reviewed-by: Wei Liu <wei.liu@kernel.org>
Juergen Gross 957a2a
Link: https://lore.kernel.org/r/20220830133737.1539624-5-vkuznets@redhat.com
Juergen Gross 957a2a
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
Juergen Gross 957a2a
Signed-off-by: Juergen Gross <jgross@suse.com>
Juergen Gross 957a2a
---
Juergen Gross 957a2a
 arch/x86/kvm/hyperv.c | 27 ++++++++++++---------------
Juergen Gross 957a2a
 1 file changed, 12 insertions(+), 15 deletions(-)
Juergen Gross 957a2a
Juergen Gross 957a2a
diff --git a/arch/x86/kvm/hyperv.c b/arch/x86/kvm/hyperv.c
Juergen Gross 957a2a
index 611c349a08bf..8aadd31ed058 100644
Juergen Gross 957a2a
--- a/arch/x86/kvm/hyperv.c
Juergen Gross 957a2a
+++ b/arch/x86/kvm/hyperv.c
Juergen Gross 957a2a
@@ -936,9 +936,12 @@ static void stimer_init(struct kvm_vcpu_hv_stimer *stimer, int timer_index)
Juergen Gross 957a2a
 
Juergen Gross 957a2a
 static int kvm_hv_vcpu_init(struct kvm_vcpu *vcpu)
Juergen Gross 957a2a
 {
Juergen Gross 957a2a
-	struct kvm_vcpu_hv *hv_vcpu;
Juergen Gross 957a2a
+	struct kvm_vcpu_hv *hv_vcpu = to_hv_vcpu(vcpu);
Juergen Gross 957a2a
 	int i;
Juergen Gross 957a2a
 
Juergen Gross 957a2a
+	if (hv_vcpu)
Juergen Gross 957a2a
+		return 0;
Juergen Gross 957a2a
+
Juergen Gross 957a2a
 	hv_vcpu = kzalloc(sizeof(struct kvm_vcpu_hv), GFP_KERNEL_ACCOUNT);
Juergen Gross 957a2a
 	if (!hv_vcpu)
Juergen Gross 957a2a
 		return -ENOMEM;
Juergen Gross 957a2a
@@ -962,11 +965,9 @@ int kvm_hv_activate_synic(struct kvm_vcpu *vcpu, bool dont_zero_synic_pages)
Juergen Gross 957a2a
 	struct kvm_vcpu_hv_synic *synic;
Juergen Gross 957a2a
 	int r;
Juergen Gross 957a2a
 
Juergen Gross 957a2a
-	if (!to_hv_vcpu(vcpu)) {
Juergen Gross 957a2a
-		r = kvm_hv_vcpu_init(vcpu);
Juergen Gross 957a2a
-		if (r)
Juergen Gross 957a2a
-			return r;
Juergen Gross 957a2a
-	}
Juergen Gross 957a2a
+	r = kvm_hv_vcpu_init(vcpu);
Juergen Gross 957a2a
+	if (r)
Juergen Gross 957a2a
+		return r;
Juergen Gross 957a2a
 
Juergen Gross 957a2a
 	synic = to_hv_synic(vcpu);
Juergen Gross 957a2a
 
Juergen Gross 957a2a
@@ -1660,10 +1661,8 @@ int kvm_hv_set_msr_common(struct kvm_vcpu *vcpu, u32 msr, u64 data, bool host)
Juergen Gross 957a2a
 	if (!host && !vcpu->arch.hyperv_enabled)
Juergen Gross 957a2a
 		return 1;
Juergen Gross 957a2a
 
Juergen Gross 957a2a
-	if (!to_hv_vcpu(vcpu)) {
Juergen Gross 957a2a
-		if (kvm_hv_vcpu_init(vcpu))
Juergen Gross 957a2a
-			return 1;
Juergen Gross 957a2a
-	}
Juergen Gross 957a2a
+	if (kvm_hv_vcpu_init(vcpu))
Juergen Gross 957a2a
+		return 1;
Juergen Gross 957a2a
 
Juergen Gross 957a2a
 	if (kvm_hv_msr_partition_wide(msr)) {
Juergen Gross 957a2a
 		int r;
Juergen Gross 957a2a
@@ -1683,10 +1682,8 @@ int kvm_hv_get_msr_common(struct kvm_vcpu *vcpu, u32 msr, u64 *pdata, bool host)
Juergen Gross 957a2a
 	if (!host && !vcpu->arch.hyperv_enabled)
Juergen Gross 957a2a
 		return 1;
Juergen Gross 957a2a
 
Juergen Gross 957a2a
-	if (!to_hv_vcpu(vcpu)) {
Juergen Gross 957a2a
-		if (kvm_hv_vcpu_init(vcpu))
Juergen Gross 957a2a
-			return 1;
Juergen Gross 957a2a
-	}
Juergen Gross 957a2a
+	if (kvm_hv_vcpu_init(vcpu))
Juergen Gross 957a2a
+		return 1;
Juergen Gross 957a2a
 
Juergen Gross 957a2a
 	if (kvm_hv_msr_partition_wide(msr)) {
Juergen Gross 957a2a
 		int r;
Juergen Gross 957a2a
@@ -2000,7 +1997,7 @@ void kvm_hv_set_cpuid(struct kvm_vcpu *vcpu)
Juergen Gross 957a2a
 		return;
Juergen Gross 957a2a
 	}
Juergen Gross 957a2a
 
Juergen Gross 957a2a
-	if (!to_hv_vcpu(vcpu) && kvm_hv_vcpu_init(vcpu))
Juergen Gross 957a2a
+	if (kvm_hv_vcpu_init(vcpu))
Juergen Gross 957a2a
 		return;
Juergen Gross 957a2a
 
Juergen Gross 957a2a
 	hv_vcpu = to_hv_vcpu(vcpu);
Juergen Gross 957a2a
-- 
Juergen Gross 957a2a
2.35.3
Juergen Gross 957a2a