lkml.org 
[lkml]   [2018]   [Nov]   [12]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 4.19 256/361] KVM: arm64: Fix caching of host MDCR_EL2 value
    Date
    4.19-stable review patch.  If anyone has any objections, please let me know.

    ------------------

    From: Mark Rutland <mark.rutland@arm.com>

    commit da5a3ce66b8bb51b0ea8a89f42aac153903f90fb upstream.

    At boot time, KVM stashes the host MDCR_EL2 value, but only does this
    when the kernel is not running in hyp mode (i.e. is non-VHE). In these
    cases, the stashed value of MDCR_EL2.HPMN happens to be zero, which can
    lead to CONSTRAINED UNPREDICTABLE behaviour.

    Since we use this value to derive the MDCR_EL2 value when switching
    to/from a guest, after a guest have been run, the performance counters
    do not behave as expected. This has been observed to result in accesses
    via PMXEVTYPER_EL0 and PMXEVCNTR_EL0 not affecting the relevant
    counters, resulting in events not being counted. In these cases, only
    the fixed-purpose cycle counter appears to work as expected.

    Fix this by always stashing the host MDCR_EL2 value, regardless of VHE.

    Cc: Christopher Dall <christoffer.dall@arm.com>
    Cc: James Morse <james.morse@arm.com>
    Cc: Will Deacon <will.deacon@arm.com>
    Cc: stable@vger.kernel.org
    Fixes: 1e947bad0b63b351 ("arm64: KVM: Skip HYP setup when already running in HYP")
    Tested-by: Robin Murphy <robin.murphy@arm.com>
    Signed-off-by: Mark Rutland <mark.rutland@arm.com>
    Signed-off-by: Marc Zyngier <marc.zyngier@arm.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

    ---
    virt/kvm/arm/arm.c | 4 ++--
    1 file changed, 2 insertions(+), 2 deletions(-)

    --- a/virt/kvm/arm/arm.c
    +++ b/virt/kvm/arm/arm.c
    @@ -1295,8 +1295,6 @@ static void cpu_init_hyp_mode(void *dumm

    __cpu_init_hyp_mode(pgd_ptr, hyp_stack_ptr, vector_ptr);
    __cpu_init_stage2();
    -
    - kvm_arm_init_debug();
    }

    static void cpu_hyp_reset(void)
    @@ -1320,6 +1318,8 @@ static void cpu_hyp_reinit(void)
    cpu_init_hyp_mode(NULL);
    }

    + kvm_arm_init_debug();
    +
    if (vgic_present)
    kvm_vgic_init_cpu_hardware();
    }

    \
     
     \ /
      Last update: 2018-11-12 00:56    [W:4.094 / U:0.440 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site