lkml.org 
[lkml]   [2021]   [Jul]   [4]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH AUTOSEL 5.12 64/80] KVM: arm64: Restore PMU configuration on first run
    Date
    From: Marc Zyngier <maz@kernel.org>

    [ Upstream commit d0c94c49792cf780cbfefe29f81bb8c3b73bc76b ]

    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
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    ---
    arch/arm64/include/asm/kvm_host.h | 1 +
    arch/arm64/kvm/arm.c | 4 ++++
    arch/arm64/kvm/pmu-emul.c | 3 +++
    3 files changed, 8 insertions(+)

    diff --git a/arch/arm64/include/asm/kvm_host.h b/arch/arm64/include/asm/kvm_host.h
    index 858c2fcfc043..4e4356add46e 100644
    --- a/arch/arm64/include/asm/kvm_host.h
    +++ b/arch/arm64/include/asm/kvm_host.h
    @@ -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)
    diff --git a/arch/arm64/kvm/arm.c b/arch/arm64/kvm/arm.c
    index 7730b81aad6d..8455c5c30116 100644
    --- a/arch/arm64/kvm/arm.c
    +++ b/arch/arm64/kvm/arm.c
    @@ -684,6 +684,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));
    }
    }

    diff --git a/arch/arm64/kvm/pmu-emul.c b/arch/arm64/kvm/pmu-emul.c
    index e32c6e139a09..e9699d10d2bd 100644
    --- a/arch/arm64/kvm/pmu-emul.c
    +++ b/arch/arm64/kvm/pmu-emul.c
    @@ -850,6 +850,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;
    }

    --
    2.30.2
    \
     
     \ /
      Last update: 2021-07-05 01:10    [W:4.090 / U:0.104 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site