]> www.infradead.org Git - users/hch/misc.git/commitdiff
KVM: arm64: Drop kvm_arm_pmu_available static key
authorOliver Upton <oliver.upton@linux.dev>
Wed, 5 Mar 2025 20:26:33 +0000 (12:26 -0800)
committerOliver Upton <oliver.upton@linux.dev>
Tue, 11 Mar 2025 19:54:29 +0000 (12:54 -0700)
With the PMUv3 cpucap, kvm_arm_pmu_available is no longer used in the
hot path of guest entry/exit. On top of that, guest support for PMUv3
may not correlate with host support for the feature, e.g. on IMPDEF
hardware.

Throw out the static key and just inspect the list of PMUs to determine
if PMUv3 is supported for KVM guests.

Tested-by: Janne Grunau <j@jannau.net>
Reviewed-by: Marc Zyngier <maz@kernel.org>
Link: https://lore.kernel.org/r/20250305202641.428114-7-oliver.upton@linux.dev
Signed-off-by: Oliver Upton <oliver.upton@linux.dev>
arch/arm64/kernel/image-vars.h
arch/arm64/kvm/arm.c
arch/arm64/kvm/pmu-emul.c
include/kvm/arm_pmu.h

index ef3a69cc398e5182e2b81478d8f2bf41b093c214..e705c64138ce313c55efa061ce324ae7d308b8b2 100644 (file)
@@ -112,11 +112,6 @@ KVM_NVHE_ALIAS(broken_cntvoff_key);
 KVM_NVHE_ALIAS(__start___kvm_ex_table);
 KVM_NVHE_ALIAS(__stop___kvm_ex_table);
 
-/* PMU available static key */
-#ifdef CONFIG_HW_PERF_EVENTS
-KVM_NVHE_ALIAS(kvm_arm_pmu_available);
-#endif
-
 /* Position-independent library routines */
 KVM_NVHE_ALIAS_HYP(clear_page, __pi_clear_page);
 KVM_NVHE_ALIAS_HYP(copy_page, __pi_copy_page);
index b8e55a441282f57cb2d4bc55a43b41d5b774dfdd..dc27d4eb503a4d0a28dbccec5fe1587bf09a5a0b 100644 (file)
@@ -366,7 +366,7 @@ int kvm_vm_ioctl_check_extension(struct kvm *kvm, long ext)
                r = get_num_wrps();
                break;
        case KVM_CAP_ARM_PMU_V3:
-               r = kvm_arm_support_pmu_v3();
+               r = kvm_supports_guest_pmuv3();
                break;
        case KVM_CAP_ARM_INJECT_SERROR_ESR:
                r = cpus_have_final_cap(ARM64_HAS_RAS_EXTN);
@@ -1388,7 +1388,7 @@ static unsigned long system_supported_vcpu_features(void)
        if (!cpus_have_final_cap(ARM64_HAS_32BIT_EL1))
                clear_bit(KVM_ARM_VCPU_EL1_32BIT, &features);
 
-       if (!kvm_arm_support_pmu_v3())
+       if (!kvm_supports_guest_pmuv3())
                clear_bit(KVM_ARM_VCPU_PMU_V3, &features);
 
        if (!system_supports_sve())
index 62349b670cf92b849bb14868e275002b17cd239b..120f48136a0f3091402c8c15c95e0863c9c23a98 100644 (file)
@@ -17,8 +17,6 @@
 
 #define PERF_ATTR_CFG1_COUNTER_64BIT   BIT(0)
 
-DEFINE_STATIC_KEY_FALSE(kvm_arm_pmu_available);
-
 static LIST_HEAD(arm_pmus);
 static DEFINE_MUTEX(arm_pmus_lock);
 
@@ -26,6 +24,12 @@ static void kvm_pmu_create_perf_event(struct kvm_pmc *pmc);
 static void kvm_pmu_release_perf_event(struct kvm_pmc *pmc);
 static bool kvm_pmu_counter_is_enabled(struct kvm_pmc *pmc);
 
+bool kvm_supports_guest_pmuv3(void)
+{
+       guard(mutex)(&arm_pmus_lock);
+       return !list_empty(&arm_pmus);
+}
+
 static struct kvm_vcpu *kvm_pmc_to_vcpu(const struct kvm_pmc *pmc)
 {
        return container_of(pmc, struct kvm_vcpu, arch.pmu.pmc[pmc->idx]);
@@ -795,9 +799,6 @@ void kvm_host_pmu_init(struct arm_pmu *pmu)
        entry->arm_pmu = pmu;
        list_add_tail(&entry->entry, &arm_pmus);
 
-       if (list_is_singular(&arm_pmus))
-               static_branch_enable(&kvm_arm_pmu_available);
-
 out_unlock:
        mutex_unlock(&arm_pmus_lock);
 }
index 3a8edd78240f72c920420f8ae0d8d58a0256655a..58fc7f932b3fc5115fe6bf1438fda3cedec20b55 100644 (file)
@@ -37,13 +37,7 @@ struct arm_pmu_entry {
        struct arm_pmu *arm_pmu;
 };
 
-DECLARE_STATIC_KEY_FALSE(kvm_arm_pmu_available);
-
-static __always_inline bool kvm_arm_support_pmu_v3(void)
-{
-       return static_branch_likely(&kvm_arm_pmu_available);
-}
-
+bool kvm_supports_guest_pmuv3(void);
 #define kvm_arm_pmu_irq_initialized(v) ((v)->arch.pmu.irq_num >= VGIC_NR_SGIS)
 u64 kvm_pmu_get_counter_value(struct kvm_vcpu *vcpu, u64 select_idx);
 void kvm_pmu_set_counter_value(struct kvm_vcpu *vcpu, u64 select_idx, u64 val);
@@ -102,7 +96,7 @@ void kvm_pmu_nested_transition(struct kvm_vcpu *vcpu);
 struct kvm_pmu {
 };
 
-static inline bool kvm_arm_support_pmu_v3(void)
+static inline bool kvm_supports_guest_pmuv3(void)
 {
        return false;
 }