Skip to content

Commit 9d7c6d0

Browse files
ouptonjannau
authored andcommitted
KVM: arm64: Drop kvm_arm_pmu_available static key
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. Signed-off-by: Oliver Upton <oliver.upton@linux.dev>
1 parent e7d2379 commit 9d7c6d0

4 files changed

Lines changed: 9 additions & 24 deletions

File tree

arch/arm64/kernel/image-vars.h

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -109,11 +109,6 @@ KVM_NVHE_ALIAS(vgic_v3_cpuif_trap);
109109
KVM_NVHE_ALIAS(__start___kvm_ex_table);
110110
KVM_NVHE_ALIAS(__stop___kvm_ex_table);
111111

112-
/* PMU available static key */
113-
#ifdef CONFIG_HW_PERF_EVENTS
114-
KVM_NVHE_ALIAS(kvm_arm_pmu_available);
115-
#endif
116-
117112
/* Position-independent library routines */
118113
KVM_NVHE_ALIAS_HYP(clear_page, __pi_clear_page);
119114
KVM_NVHE_ALIAS_HYP(copy_page, __pi_copy_page);

arch/arm64/kvm/arm.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -391,7 +391,7 @@ int kvm_vm_ioctl_check_extension(struct kvm *kvm, long ext)
391391
r = get_num_wrps();
392392
break;
393393
case KVM_CAP_ARM_PMU_V3:
394-
r = kvm_arm_support_pmu_v3();
394+
r = kvm_supports_guest_pmuv3();
395395
break;
396396
case KVM_CAP_ARM_INJECT_SERROR_ESR:
397397
r = cpus_have_final_cap(ARM64_HAS_RAS_EXTN);
@@ -1397,7 +1397,7 @@ static unsigned long system_supported_vcpu_features(void)
13971397
if (!cpus_have_final_cap(ARM64_HAS_32BIT_EL1))
13981398
clear_bit(KVM_ARM_VCPU_EL1_32BIT, &features);
13991399

1400-
if (!kvm_arm_support_pmu_v3())
1400+
if (!kvm_supports_guest_pmuv3())
14011401
clear_bit(KVM_ARM_VCPU_PMU_V3, &features);
14021402

14031403
if (!system_supports_sve())

arch/arm64/kvm/pmu-emul.c

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -17,15 +17,19 @@
1717

1818
#define PERF_ATTR_CFG1_COUNTER_64BIT BIT(0)
1919

20-
DEFINE_STATIC_KEY_FALSE(kvm_arm_pmu_available);
21-
2220
static LIST_HEAD(arm_pmus);
2321
static DEFINE_MUTEX(arm_pmus_lock);
2422

2523
static void kvm_pmu_create_perf_event(struct kvm_pmc *pmc);
2624
static void kvm_pmu_release_perf_event(struct kvm_pmc *pmc);
2725
static bool kvm_pmu_counter_is_enabled(struct kvm_pmc *pmc);
2826

27+
bool kvm_supports_guest_pmuv3(void)
28+
{
29+
guard(mutex)(&arm_pmus_lock);
30+
return !list_empty(&arm_pmus);
31+
}
32+
2933
static struct kvm_vcpu *kvm_pmc_to_vcpu(const struct kvm_pmc *pmc)
3034
{
3135
return container_of(pmc, struct kvm_vcpu, arch.pmu.pmc[pmc->idx]);
@@ -807,9 +811,6 @@ void kvm_host_pmu_init(struct arm_pmu *pmu)
807811
entry->arm_pmu = pmu;
808812
list_add_tail(&entry->entry, &arm_pmus);
809813

810-
if (list_is_singular(&arm_pmus))
811-
static_branch_enable(&kvm_arm_pmu_available);
812-
813814
out_unlock:
814815
mutex_unlock(&arm_pmus_lock);
815816
}

include/kvm/arm_pmu.h

Lines changed: 1 addition & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -37,13 +37,7 @@ struct arm_pmu_entry {
3737
struct arm_pmu *arm_pmu;
3838
};
3939

40-
DECLARE_STATIC_KEY_FALSE(kvm_arm_pmu_available);
41-
42-
static __always_inline bool kvm_arm_support_pmu_v3(void)
43-
{
44-
return static_branch_likely(&kvm_arm_pmu_available);
45-
}
46-
40+
bool kvm_supports_guest_pmuv3(void);
4741
#define kvm_arm_pmu_irq_initialized(v) ((v)->arch.pmu.irq_num >= VGIC_NR_SGIS)
4842
u64 kvm_pmu_get_counter_value(struct kvm_vcpu *vcpu, u64 select_idx);
4943
void kvm_pmu_set_counter_value(struct kvm_vcpu *vcpu, u64 select_idx, u64 val);
@@ -102,11 +96,6 @@ void kvm_pmu_nested_transition(struct kvm_vcpu *vcpu);
10296
struct kvm_pmu {
10397
};
10498

105-
static inline bool kvm_arm_support_pmu_v3(void)
106-
{
107-
return false;
108-
}
109-
11099
#define kvm_arm_pmu_irq_initialized(v) (false)
111100
static inline u64 kvm_pmu_get_counter_value(struct kvm_vcpu *vcpu,
112101
u64 select_idx)

0 commit comments

Comments
 (0)