KVM: x86/pmu: Simplify intel_hw_event_available()
authorSean Christopherson <seanjc@google.com>
Wed, 7 Jun 2023 01:02:04 +0000 (18:02 -0700)
committerSean Christopherson <seanjc@google.com>
Wed, 2 Aug 2023 23:44:36 +0000 (16:44 -0700)
Walk only the "real", i.e. non-pseudo, architectural events when checking
if a hardware event is available, i.e. isn't disabled by guest CPUID.
Skipping pseudo-arch events in the loop body is unnecessarily convoluted,
especially now that KVM has enums that delineate between real and pseudo
events.

Link: https://lore.kernel.org/r/20230607010206.1425277-3-seanjc@google.com
Signed-off-by: Sean Christopherson <seanjc@google.com>
arch/x86/kvm/vmx/pmu_intel.c

index 1109cbd..db23697 100644 (file)
@@ -110,17 +110,16 @@ static bool intel_hw_event_available(struct kvm_pmc *pmc)
 
        BUILD_BUG_ON(ARRAY_SIZE(intel_arch_events) != NR_INTEL_ARCH_EVENTS);
 
-       for (i = 0; i < NR_INTEL_ARCH_EVENTS; i++) {
+       /*
+        * Disallow events reported as unavailable in guest CPUID.  Note, this
+        * doesn't apply to pseudo-architectural events.
+        */
+       for (i = 0; i < NR_REAL_INTEL_ARCH_EVENTS; i++) {
                if (intel_arch_events[i].eventsel != event_select ||
                    intel_arch_events[i].unit_mask != unit_mask)
                        continue;
 
-               /* disable event that reported as not present by cpuid */
-               if ((i < PSEUDO_ARCH_REFERENCE_CYCLES) &&
-                   !(pmu->available_event_types & (1 << i)))
-                       return false;
-
-               break;
+               return pmu->available_event_types & BIT(i);
        }
 
        return true;