• Suraj Jitindar Singh's avatar
    KVM: PPC: Book3S HV: Invalidate ERAT when flushing guest TLB entries · 50087112
    Suraj Jitindar Singh authored
    When a guest vcpu moves from one physical thread to another it is
    necessary for the host to perform a tlb flush on the previous core if
    another vcpu from the same guest is going to run there. This is because the
    guest may use the local form of the tlb invalidation instruction meaning
    stale tlb entries would persist where it previously ran. This is handled
    on guest entry in kvmppc_check_need_tlb_flush() which calls
    flush_guest_tlb() to perform the tlb flush.
    
    Previously the generic radix__local_flush_tlb_lpid_guest() function was
    used, however the functionality was reimplemented in flush_guest_tlb()
    to avoid the trace_tlbie() call as the flushing may be done in real
    mode. The reimplementation in flush_guest_tlb() was missing an erat
    invalidation after flushing the tlb.
    
    This lead to observable memory corruption in the guest due to the
    caching of stale translations. Fix this by adding the erat invalidation.
    
    Fixes: 70ea13f6 ("KVM: PPC: Book3S HV: Flush TLB on secondary radix threads")
    Signed-off-by: default avatarSuraj Jitindar Singh <sjitindarsingh@gmail.com>
    Signed-off-by: default avatarMichael Ellerman <mpe@ellerman.id.au>
    50087112
book3s_hv_builtin.c 22 KB