]> www.infradead.org Git - users/hch/misc.git/commitdiff
KVM: arm64: Restore PMU configuration on first run
authorMarc Zyngier <maz@kernel.org>
Thu, 3 Jun 2021 15:50:02 +0000 (16:50 +0100)
committerMarc Zyngier <maz@kernel.org>
Fri, 18 Jun 2021 13:18:37 +0000 (14:18 +0100)
Restoring a guest with an active virtual PMU results in no perf
counters being instanciated on the host side. Not quite what
you'd expect from a restore.

In order to fix this, force a writeback of PMCR_EL0 on the first
run of a vcpu (using a new request so that it happens once the
vcpu has been loaded). This will in turn create all the host-side
counters that were missing.

Reported-by: Jinank Jain <jinankj@amazon.de>
Tested-by: Jinank Jain <jinankj@amazon.de>
Signed-off-by: Marc Zyngier <maz@kernel.org>
Link: https://lore.kernel.org/r/87wnrbylxv.wl-maz@kernel.org
Link: https://lore.kernel.org/r/b53dfcf9bbc4db7f96154b1cd5188d72b9766358.camel@amazon.de
arch/arm64/include/asm/kvm_host.h
arch/arm64/kvm/arm.c
arch/arm64/kvm/pmu-emul.c

index 7cd7d5c8c4bc229d6db09d21716cd94908938073..6336b4309114b92e4c2e86e70f0beb06b1db2e07 100644 (file)
@@ -46,6 +46,7 @@
 #define KVM_REQ_VCPU_RESET     KVM_ARCH_REQ(2)
 #define KVM_REQ_RECORD_STEAL   KVM_ARCH_REQ(3)
 #define KVM_REQ_RELOAD_GICv4   KVM_ARCH_REQ(4)
+#define KVM_REQ_RELOAD_PMU     KVM_ARCH_REQ(5)
 
 #define KVM_DIRTY_LOG_MANUAL_CAPS   (KVM_DIRTY_LOG_MANUAL_PROTECT_ENABLE | \
                                     KVM_DIRTY_LOG_INITIALLY_SET)
index e720148232a06c887c3035f3a4f790d235ec6744..facf4d41d32a2384ce8676a3ed7a66777885ad03 100644 (file)
@@ -689,6 +689,10 @@ static void check_vcpu_requests(struct kvm_vcpu *vcpu)
                        vgic_v4_load(vcpu);
                        preempt_enable();
                }
+
+               if (kvm_check_request(KVM_REQ_RELOAD_PMU, vcpu))
+                       kvm_pmu_handle_pmcr(vcpu,
+                                           __vcpu_sys_reg(vcpu, PMCR_EL0));
        }
 }
 
index ecc0d19c8cc14db2b8bc784fa02375b02d6d92ab..f33825c995cbbe215d603aa0e3ca659f8245c6ea 100644 (file)
@@ -851,6 +851,9 @@ int kvm_arm_pmu_v3_enable(struct kvm_vcpu *vcpu)
                   return -EINVAL;
        }
 
+       /* One-off reload of the PMU on first run */
+       kvm_make_request(KVM_REQ_RELOAD_PMU, vcpu);
+
        return 0;
 }