Skip to content

Commit e5a65d4

Browse files
committed
KVM: x86/pmu: Add macros to iterate over all PMCs given a bitmap
Add and use kvm_for_each_pmc() to dedup a variety of open coded for-loops that iterate over valid PMCs given a bitmap (and because seeing checkpatch whine about bad macro style is always amusing). No functional change intended. Link: https://lore.kernel.org/r/20231110022857.1273836-6-seanjc@google.com Signed-off-by: Sean Christopherson <seanjc@google.com>
1 parent 004a0aa commit e5a65d4

File tree

3 files changed

+15
-24
lines changed

3 files changed

+15
-24
lines changed

arch/x86/kvm/pmu.c

Lines changed: 7 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -493,6 +493,7 @@ void kvm_pmu_handle_event(struct kvm_vcpu *vcpu)
493493
{
494494
DECLARE_BITMAP(bitmap, X86_PMC_IDX_MAX);
495495
struct kvm_pmu *pmu = vcpu_to_pmu(vcpu);
496+
struct kvm_pmc *pmc;
496497
int bit;
497498

498499
bitmap_copy(bitmap, pmu->reprogram_pmi, X86_PMC_IDX_MAX);
@@ -505,12 +506,7 @@ void kvm_pmu_handle_event(struct kvm_vcpu *vcpu)
505506
BUILD_BUG_ON(sizeof(bitmap) != sizeof(atomic64_t));
506507
atomic64_andnot(*(s64 *)bitmap, &pmu->__reprogram_pmi);
507508

508-
for_each_set_bit(bit, bitmap, X86_PMC_IDX_MAX) {
509-
struct kvm_pmc *pmc = kvm_pmc_idx_to_pmc(pmu, bit);
510-
511-
if (unlikely(!pmc))
512-
continue;
513-
509+
kvm_for_each_pmc(pmu, pmc, bit, bitmap) {
514510
/*
515511
* If reprogramming fails, e.g. due to contention, re-set the
516512
* regprogram bit set, i.e. opportunistically try again on the
@@ -730,11 +726,7 @@ static void kvm_pmu_reset(struct kvm_vcpu *vcpu)
730726

731727
bitmap_zero(pmu->reprogram_pmi, X86_PMC_IDX_MAX);
732728

733-
for_each_set_bit(i, pmu->all_valid_pmc_idx, X86_PMC_IDX_MAX) {
734-
pmc = kvm_pmc_idx_to_pmc(pmu, i);
735-
if (!pmc)
736-
continue;
737-
729+
kvm_for_each_pmc(pmu, pmc, i, pmu->all_valid_pmc_idx) {
738730
pmc_stop_counter(pmc);
739731
pmc->counter = 0;
740732
pmc->emulated_counter = 0;
@@ -806,10 +798,8 @@ void kvm_pmu_cleanup(struct kvm_vcpu *vcpu)
806798
bitmap_andnot(bitmask, pmu->all_valid_pmc_idx,
807799
pmu->pmc_in_use, X86_PMC_IDX_MAX);
808800

809-
for_each_set_bit(i, bitmask, X86_PMC_IDX_MAX) {
810-
pmc = kvm_pmc_idx_to_pmc(pmu, i);
811-
812-
if (pmc && pmc->perf_event && !pmc_speculative_in_use(pmc))
801+
kvm_for_each_pmc(pmu, pmc, i, bitmask) {
802+
if (pmc->perf_event && !pmc_speculative_in_use(pmc))
813803
pmc_stop_counter(pmc);
814804
}
815805

@@ -861,10 +851,8 @@ void kvm_pmu_trigger_event(struct kvm_vcpu *vcpu, u64 perf_hw_id)
861851
struct kvm_pmc *pmc;
862852
int i;
863853

864-
for_each_set_bit(i, pmu->all_valid_pmc_idx, X86_PMC_IDX_MAX) {
865-
pmc = kvm_pmc_idx_to_pmc(pmu, i);
866-
867-
if (!pmc || !pmc_event_is_allowed(pmc))
854+
kvm_for_each_pmc(pmu, pmc, i, pmu->all_valid_pmc_idx) {
855+
if (!pmc_event_is_allowed(pmc))
868856
continue;
869857

870858
/* Ignore checks for edge detect, pin control, invert and CMASK bits */

arch/x86/kvm/pmu.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,12 @@ static inline struct kvm_pmc *kvm_pmc_idx_to_pmc(struct kvm_pmu *pmu, int idx)
8383
return NULL;
8484
}
8585

86+
#define kvm_for_each_pmc(pmu, pmc, i, bitmap) \
87+
for_each_set_bit(i, bitmap, X86_PMC_IDX_MAX) \
88+
if (!(pmc = kvm_pmc_idx_to_pmc(pmu, i))) \
89+
continue; \
90+
else \
91+
8692
static inline u64 pmc_bitmask(struct kvm_pmc *pmc)
8793
{
8894
struct kvm_pmu *pmu = pmc_to_pmu(pmc);

arch/x86/kvm/vmx/pmu_intel.c

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -704,11 +704,8 @@ void intel_pmu_cross_mapped_check(struct kvm_pmu *pmu)
704704
struct kvm_pmc *pmc = NULL;
705705
int bit, hw_idx;
706706

707-
for_each_set_bit(bit, (unsigned long *)&pmu->global_ctrl,
708-
X86_PMC_IDX_MAX) {
709-
pmc = kvm_pmc_idx_to_pmc(pmu, bit);
710-
711-
if (!pmc || !pmc_speculative_in_use(pmc) ||
707+
kvm_for_each_pmc(pmu, pmc, bit, (unsigned long *)&pmu->global_ctrl) {
708+
if (!pmc_speculative_in_use(pmc) ||
712709
!pmc_is_globally_enabled(pmc) || !pmc->perf_event)
713710
continue;
714711

0 commit comments

Comments
 (0)