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)
committerPaolo Bonzini <pbonzini@redhat.com>
Thu, 11 Nov 2021 15:56:21 +0000 (10:56 -0500)
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>
arch/x86/kvm/cpuid.c

index 2d70edb..41529c1 100644 (file)
@@ -239,6 +239,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,
@@ -275,18 +294,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);
@@ -310,20 +320,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,