lkml.org 
[lkml]   [2022]   [Jan]   [31]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 5.16 059/200] KVM: PPC: Book3S HV Nested: Fix nested HFSCR being clobbered with multiple vCPUs
    Date
    From: Nicholas Piggin <npiggin@gmail.com>

    commit 22f7ff0dea9491e90b6fe808ed40c30bd791e5c2 upstream.

    The L0 is storing HFSCR requested by the L1 for the L2 in struct
    kvm_nested_guest when the L1 requests a vCPU enter L2. kvm_nested_guest
    is not a per-vCPU structure. Hilarity ensues.

    Fix it by moving the nested hfscr into the vCPU structure together with
    the other per-vCPU nested fields.

    Fixes: 8b210a880b35 ("KVM: PPC: Book3S HV Nested: Make nested HFSCR state accessible")
    Cc: stable@vger.kernel.org # v5.15+
    Signed-off-by: Nicholas Piggin <npiggin@gmail.com>
    Reviewed-by: Fabiano Rosas <farosas@linux.ibm.com>
    Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
    Link: https://lore.kernel.org/r/20220122105530.3477250-1-npiggin@gmail.com
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    ---
    arch/powerpc/include/asm/kvm_book3s_64.h | 1 -
    arch/powerpc/include/asm/kvm_host.h | 1 +
    arch/powerpc/kvm/book3s_hv.c | 3 +--
    arch/powerpc/kvm/book3s_hv_nested.c | 2 +-
    4 files changed, 3 insertions(+), 4 deletions(-)

    --- a/arch/powerpc/include/asm/kvm_book3s_64.h
    +++ b/arch/powerpc/include/asm/kvm_book3s_64.h
    @@ -39,7 +39,6 @@ struct kvm_nested_guest {
    pgd_t *shadow_pgtable; /* our page table for this guest */
    u64 l1_gr_to_hr; /* L1's addr of part'n-scoped table */
    u64 process_table; /* process table entry for this guest */
    - u64 hfscr; /* HFSCR that the L1 requested for this nested guest */
    long refcnt; /* number of pointers to this struct */
    struct mutex tlb_lock; /* serialize page faults and tlbies */
    struct kvm_nested_guest *next;
    --- a/arch/powerpc/include/asm/kvm_host.h
    +++ b/arch/powerpc/include/asm/kvm_host.h
    @@ -814,6 +814,7 @@ struct kvm_vcpu_arch {

    /* For support of nested guests */
    struct kvm_nested_guest *nested;
    + u64 nested_hfscr; /* HFSCR that the L1 requested for the nested guest */
    u32 nested_vcpu_id;
    gpa_t nested_io_gpr;
    #endif
    --- a/arch/powerpc/kvm/book3s_hv.c
    +++ b/arch/powerpc/kvm/book3s_hv.c
    @@ -1731,7 +1731,6 @@ static int kvmppc_handle_exit_hv(struct

    static int kvmppc_handle_nested_exit(struct kvm_vcpu *vcpu)
    {
    - struct kvm_nested_guest *nested = vcpu->arch.nested;
    int r;
    int srcu_idx;

    @@ -1831,7 +1830,7 @@ static int kvmppc_handle_nested_exit(str
    * it into a HEAI.
    */
    if (!(vcpu->arch.hfscr_permitted & (1UL << cause)) ||
    - (nested->hfscr & (1UL << cause))) {
    + (vcpu->arch.nested_hfscr & (1UL << cause))) {
    vcpu->arch.trap = BOOK3S_INTERRUPT_H_EMUL_ASSIST;

    /*
    --- a/arch/powerpc/kvm/book3s_hv_nested.c
    +++ b/arch/powerpc/kvm/book3s_hv_nested.c
    @@ -362,7 +362,7 @@ long kvmhv_enter_nested_guest(struct kvm
    /* set L1 state to L2 state */
    vcpu->arch.nested = l2;
    vcpu->arch.nested_vcpu_id = l2_hv.vcpu_token;
    - l2->hfscr = l2_hv.hfscr;
    + vcpu->arch.nested_hfscr = l2_hv.hfscr;
    vcpu->arch.regs = l2_regs;

    /* Guest must always run with ME enabled, HV disabled. */

    \
     
     \ /
      Last update: 2022-01-31 12:40    [W:4.152 / U:0.040 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site