KVM: x86: Add helper to consolidate core logic of SET_CPUID{2} flows
authorSean Christopherson <seanjc@google.com>
Fri, 5 Nov 2021 09:51:00 +0000 (09:51 +0000)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Thu, 18 Nov 2021 18:16:02 +0000 (19:16 +0100)
commit 8b44b174f6aca815fc84c2038e4523ef8e32fabb upstream.

Move the core logic of SET_CPUID and SET_CPUID2 to a common helper, the
only difference between the two ioctls() is the format of the userspace
struct.  A future fix will add yet more code to the core logic.

No functional change intended.

Cc: stable@vger.kernel.org
Signed-off-by: Sean Christopherson <seanjc@google.com>
Message-Id: <20211105095101.5384-2-pdurrant@amazon.com>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
arch/x86/kvm/cpuid.c

index 751aa85..f666fd7 100644 (file)
@@ -232,6 +232,25 @@ u64 kvm_vcpu_reserved_gpa_bits_raw(struct kvm_vcpu *vcpu)
        return rsvd_bits(cpuid_maxphyaddr(vcpu), 63);
 }
 
+static int kvm_set_cpuid(struct kvm_vcpu *vcpu, struct kvm_cpuid_entry2 *e2,
+                        int nent)
+{
+    int r;
+
+    r = kvm_check_cpuid(e2, nent);
+    if (r)
+        return r;
+
+    kvfree(vcpu->arch.cpuid_entries);
+    vcpu->arch.cpuid_entries = e2;
+    vcpu->arch.cpuid_nent = nent;
+
+    kvm_update_cpuid_runtime(vcpu);
+    kvm_vcpu_after_set_cpuid(vcpu);
+
+    return 0;
+}
+
 /* when an old userspace process fills a new kernel module */
 int kvm_vcpu_ioctl_set_cpuid(struct kvm_vcpu *vcpu,
                             struct kvm_cpuid *cpuid,
@@ -268,18 +287,9 @@ int kvm_vcpu_ioctl_set_cpuid(struct kvm_vcpu *vcpu,
                e2[i].padding[2] = 0;
        }
 
-       r = kvm_check_cpuid(e2, cpuid->nent);
-       if (r) {
+       r = kvm_set_cpuid(vcpu, e2, cpuid->nent);
+       if (r)
                kvfree(e2);
-               goto out_free_cpuid;
-       }
-
-       kvfree(vcpu->arch.cpuid_entries);
-       vcpu->arch.cpuid_entries = e2;
-       vcpu->arch.cpuid_nent = cpuid->nent;
-
-       kvm_update_cpuid_runtime(vcpu);
-       kvm_vcpu_after_set_cpuid(vcpu);
 
 out_free_cpuid:
        kvfree(e);
@@ -303,20 +313,11 @@ int kvm_vcpu_ioctl_set_cpuid2(struct kvm_vcpu *vcpu,
                        return PTR_ERR(e2);
        }
 
-       r = kvm_check_cpuid(e2, cpuid->nent);
-       if (r) {
+       r = kvm_set_cpuid(vcpu, e2, cpuid->nent);
+       if (r)
                kvfree(e2);
-               return r;
-       }
 
-       kvfree(vcpu->arch.cpuid_entries);
-       vcpu->arch.cpuid_entries = e2;
-       vcpu->arch.cpuid_nent = cpuid->nent;
-
-       kvm_update_cpuid_runtime(vcpu);
-       kvm_vcpu_after_set_cpuid(vcpu);
-
-       return 0;
+       return r;
 }
 
 int kvm_vcpu_ioctl_get_cpuid2(struct kvm_vcpu *vcpu,