| From a80c4ec10ed9632c44c829452dc40a0443ff4e85 Mon Sep 17 00:00:00 2001 |
| From: Borislav Petkov <bp@suse.de> |
| Date: Wed, 8 May 2019 19:02:48 +0200 |
| Subject: x86/kvm/pmu: Set AMD's virt PMU version to 1 |
| MIME-Version: 1.0 |
| Content-Type: text/plain; charset=UTF-8 |
| Content-Transfer-Encoding: 8bit |
| |
| From: Borislav Petkov <bp@suse.de> |
| |
| commit a80c4ec10ed9632c44c829452dc40a0443ff4e85 upstream. |
| |
| After commit: |
| |
| 672ff6cff80c ("KVM: x86: Raise #GP when guest vCPU do not support PMU") |
| |
| my AMD guests started #GPing like this: |
| |
| general protection fault: 0000 [#1] PREEMPT SMP |
| CPU: 1 PID: 4355 Comm: bash Not tainted 5.1.0-rc6+ #3 |
| Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS 1.12.0-1 04/01/2014 |
| RIP: 0010:x86_perf_event_update+0x3b/0xa0 |
| |
| with Code: pointing to RDPMC. It is RDPMC because the guest has the |
| hardware watchdog CONFIG_HARDLOCKUP_DETECTOR_PERF enabled which uses |
| perf. Instrumenting kvm_pmu_rdpmc() some, showed that it fails due to: |
| |
| if (!pmu->version) |
| return 1; |
| |
| which the above commit added. Since AMD's PMU leaves the version at 0, |
| that causes the #GP injection into the guest. |
| |
| Set pmu->version arbitrarily to 1 and move it above the non-applicable |
| struct kvm_pmu members. |
| |
| Signed-off-by: Borislav Petkov <bp@suse.de> |
| Cc: "H. Peter Anvin" <hpa@zytor.com> |
| Cc: Ingo Molnar <mingo@redhat.com> |
| Cc: Janakarajan Natarajan <Janakarajan.Natarajan@amd.com> |
| Cc: kvm@vger.kernel.org |
| Cc: Liran Alon <liran.alon@oracle.com> |
| Cc: Mihai Carabas <mihai.carabas@oracle.com> |
| Cc: Paolo Bonzini <pbonzini@redhat.com> |
| Cc: Peter Zijlstra <peterz@infradead.org> |
| Cc: "Radim Krčmář" <rkrcmar@redhat.com> |
| Cc: Thomas Gleixner <tglx@linutronix.de> |
| Cc: Tom Lendacky <thomas.lendacky@amd.com> |
| Cc: x86@kernel.org |
| Cc: stable@vger.kernel.org |
| Fixes: 672ff6cff80c ("KVM: x86: Raise #GP when guest vCPU do not support PMU") |
| Signed-off-by: Paolo Bonzini <pbonzini@redhat.com> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| |
| --- |
| arch/x86/kvm/pmu_amd.c | 2 +- |
| 1 file changed, 1 insertion(+), 1 deletion(-) |
| |
| --- a/arch/x86/kvm/pmu_amd.c |
| +++ b/arch/x86/kvm/pmu_amd.c |
| @@ -269,10 +269,10 @@ static void amd_pmu_refresh(struct kvm_v |
| |
| pmu->counter_bitmask[KVM_PMC_GP] = ((u64)1 << 48) - 1; |
| pmu->reserved_bits = 0xffffffff00200000ull; |
| + pmu->version = 1; |
| /* not applicable to AMD; but clean them to prevent any fall out */ |
| pmu->counter_bitmask[KVM_PMC_FIXED] = 0; |
| pmu->nr_arch_fixed_counters = 0; |
| - pmu->version = 0; |
| pmu->global_status = 0; |
| } |
| |