KVM: x86/pmu: Don't truncate the PerfEvtSeln MSR when creating a perf event
authorJim Mattson <jmattson@google.com>
Thu, 3 Feb 2022 01:48:12 +0000 (17:48 -0800)
committerPaolo Bonzini <pbonzini@redhat.com>
Mon, 14 Feb 2022 12:43:46 +0000 (07:43 -0500)
AMD's event select is 3 nybbles, with the high nybble in bits 35:32 of
a PerfEvtSeln MSR. Don't drop the high nybble when setting up the
config field of a perf_event_attr structure for a call to
perf_event_create_kernel_counter().

Fixes: ca724305a2b0 ("KVM: x86/vPMU: Implement AMD vPMU code for KVM")
Reported-by: Stephane Eranian <eranian@google.com>
Signed-off-by: Jim Mattson <jmattson@google.com>
Message-Id: <20220203014813.2130559-1-jmattson@google.com>
Reviewed-by: David Dunn <daviddunn@google.com>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
arch/x86/kvm/pmu.c

index f614f95..cd923ba 100644 (file)
@@ -95,7 +95,7 @@ static void kvm_perf_overflow(struct perf_event *perf_event,
 }
 
 static void pmc_reprogram_counter(struct kvm_pmc *pmc, u32 type,
-                                 unsigned config, bool exclude_user,
+                                 u64 config, bool exclude_user,
                                  bool exclude_kernel, bool intr,
                                  bool in_tx, bool in_tx_cp)
 {
@@ -181,7 +181,8 @@ static int cmp_u64(const void *a, const void *b)
 
 void reprogram_gp_counter(struct kvm_pmc *pmc, u64 eventsel)
 {
-       unsigned config, type = PERF_TYPE_RAW;
+       u64 config;
+       u32 type = PERF_TYPE_RAW;
        struct kvm *kvm = pmc->vcpu->kvm;
        struct kvm_pmu_event_filter *filter;
        bool allow_event = true;