KVM: x86: Consolidate CPUID array max num entries checking
authorSean Christopherson <sean.j.christopherson@intel.com>
Mon, 2 Mar 2020 23:56:16 +0000 (15:56 -0800)
committerPaolo Bonzini <pbonzini@redhat.com>
Mon, 16 Mar 2020 16:58:03 +0000 (17:58 +0100)
Move the nent vs. maxnent check and nent increment into do_host_cpuid()
to consolidate what is now identical code.  To signal success vs.
failure, return the entry and NULL respectively.  A future patch will
build on this to also move the entry retrieval into do_host_cpuid().

No functional change intended.

Reviewed-by: Vitaly Kuznetsov <vkuznets@redhat.com>
Signed-off-by: Sean Christopherson <sean.j.christopherson@intel.com>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
arch/x86/kvm/cpuid.c

index 52f0af4..1ae3b25 100644 (file)
@@ -287,9 +287,14 @@ static __always_inline void cpuid_mask(u32 *word, int wordnum)
        *word &= boot_cpu_data.x86_capability[wordnum];
 }
 
-static void do_host_cpuid(struct kvm_cpuid_entry2 *entry, u32 function,
-                          u32 index)
+static struct kvm_cpuid_entry2 *do_host_cpuid(struct kvm_cpuid_entry2 *entry,
+                                             int *nent, int maxnent,
+                                             u32 function, u32 index)
 {
+       if (*nent >= maxnent)
+               return NULL;
+       ++*nent;
+
        entry->function = function;
        entry->index = index;
        entry->flags = 0;
@@ -316,6 +321,8 @@ static void do_host_cpuid(struct kvm_cpuid_entry2 *entry, u32 function,
                entry->flags |= KVM_CPUID_FLAG_SIGNIFCANT_INDEX;
                break;
        }
+
+       return entry;
 }
 
 static int __do_cpuid_func_emulated(struct kvm_cpuid_entry2 *entry,
@@ -507,12 +514,9 @@ static inline int __do_cpuid_func(struct kvm_cpuid_entry2 *entry, u32 function,
 
        r = -E2BIG;
 
-       if (WARN_ON(*nent >= maxnent))
+       if (WARN_ON(!do_host_cpuid(entry, nent, maxnent, function, 0)))
                goto out;
 
-       do_host_cpuid(entry, function, 0);
-       ++*nent;
-
        switch (function) {
        case 0:
                /* Limited to the highest leaf implemented in KVM. */
@@ -536,11 +540,8 @@ static inline int __do_cpuid_func(struct kvm_cpuid_entry2 *entry, u32 function,
 
                entry->flags |= KVM_CPUID_FLAG_STATE_READ_NEXT;
                for (t = 1; t < times; ++t) {
-                       if (*nent >= maxnent)
+                       if (!do_host_cpuid(&entry[t], nent, maxnent, function, 0))
                                goto out;
-
-                       do_host_cpuid(&entry[t], function, 0);
-                       ++*nent;
                }
                break;
        }
@@ -555,10 +556,8 @@ static inline int __do_cpuid_func(struct kvm_cpuid_entry2 *entry, u32 function,
                        if (!cache_type)
                                break;
 
-                       if (*nent >= maxnent)
+                       if (!do_host_cpuid(&entry[i], nent, maxnent, function, i))
                                goto out;
-                       do_host_cpuid(&entry[i], function, i);
-                       ++*nent;
                }
                break;
        }
@@ -575,12 +574,9 @@ static inline int __do_cpuid_func(struct kvm_cpuid_entry2 *entry, u32 function,
                do_cpuid_7_mask(entry);
 
                for (i = 1; i <= entry->eax; i++) {
-                       if (*nent >= maxnent)
+                       if (!do_host_cpuid(&entry[i], nent, maxnent, function, i))
                                goto out;
 
-                       do_host_cpuid(&entry[i], function, i);
-                       ++*nent;
-
                        do_cpuid_7_mask(&entry[i]);
                }
                break;
@@ -633,11 +629,8 @@ static inline int __do_cpuid_func(struct kvm_cpuid_entry2 *entry, u32 function,
                 * added entry is zero.
                 */
                for (i = 1; entry[i - 1].ecx & 0xff00; ++i) {
-                       if (*nent >= maxnent)
+                       if (!do_host_cpuid(&entry[i], nent, maxnent, function, i))
                                goto out;
-
-                       do_host_cpuid(&entry[i], function, i);
-                       ++*nent;
                }
                break;
        }
@@ -652,12 +645,9 @@ static inline int __do_cpuid_func(struct kvm_cpuid_entry2 *entry, u32 function,
                if (!supported)
                        break;
 
-               if (*nent >= maxnent)
+               if (!do_host_cpuid(&entry[1], nent, maxnent, function, 1))
                        goto out;
 
-               do_host_cpuid(&entry[1], function, 1);
-               ++*nent;
-
                entry[1].eax &= kvm_cpuid_D_1_eax_x86_features;
                cpuid_mask(&entry[1].eax, CPUID_D_1_EAX);
                if (entry[1].eax & (F(XSAVES)|F(XSAVEC)))
@@ -672,12 +662,9 @@ static inline int __do_cpuid_func(struct kvm_cpuid_entry2 *entry, u32 function,
                        if (!(supported & BIT_ULL(idx)))
                                continue;
 
-                       if (*nent >= maxnent)
+                       if (!do_host_cpuid(&entry[i], nent, maxnent, function, idx))
                                goto out;
 
-                       do_host_cpuid(&entry[i], function, idx);
-                       ++*nent;
-
                        /*
                         * The @supported check above should have filtered out
                         * invalid sub-leafs as well as sub-leafs managed by
@@ -704,10 +691,8 @@ static inline int __do_cpuid_func(struct kvm_cpuid_entry2 *entry, u32 function,
                        break;
 
                for (t = 1; t <= times; ++t) {
-                       if (*nent >= maxnent)
+                       if (!do_host_cpuid(&entry[t], nent, maxnent, function, t))
                                goto out;
-                       do_host_cpuid(&entry[t], function, t);
-                       ++*nent;
                }
                break;
        }