• James Hogan's avatar
    KVM: MIPS: Fix lazy user ASID regenerate for SMP · 9078210e
    James Hogan authored
    kvm_mips_check_asids() runs before entering the guest and performs lazy
    regeneration of host ASID for guest usermode, using last_user_gasid to
    track the last guest ASID in the VCPU that was used by guest usermode on
    any host CPU.
    
    last_user_gasid is reset after performing the lazy ASID regeneration on
    the current CPU, and by kvm_arch_vcpu_load() if the host ASID for guest
    usermode is regenerated due to staleness (to cancel outstanding lazy
    ASID regenerations). Unfortunately neither case handles SMP hosts
    correctly:
    
     - When the lazy ASID regeneration is performed it should apply to all
       CPUs (as last_user_gasid does), so reset the ASID on other CPUs to
       zero to trigger regeneration when the VCPU is next loaded on those
       CPUs.
    
     - When the ASID is found to be stale on the current CPU, we should not
       cancel lazy ASID regenerations globally, so drop the reset of
       last_user_gasid altogether here.
    
    Both cases would require a guest ASID change and two host CPU migrations
    (and in the latter case one of the CPUs to start a new ASID cycle)
    before guest usermode could potentially access stale user pages from a
    previously running ASID in the same VCPU.
    
    Fixes: 25b08c7f ("KVM: MIPS: Invalidate TLB by regenerating ASIDs")
    Signed-off-by: default avatarJames Hogan <james.hogan@imgtec.com>
    Cc: Paolo Bonzini <pbonzini@redhat.com>
    Cc: "Radim Krčmář <rkrcmar@redhat.com>
    Cc: Ralf Baechle <ralf@linux-mips.org>
    Cc: linux-mips@linux-mips.org
    Cc: kvm@vger.kernel.org
    Signed-off-by: default avatarPaolo Bonzini <pbonzini@redhat.com>
    9078210e
mips.c 45.1 KB