• Benjamin Herrenschmidt's avatar
    KVM: PPC: Book3S HV: Add more barriers in XIVE load/unload code · ad98dd1a
    Benjamin Herrenschmidt authored
    On POWER9 systems, we push the VCPU context onto the XIVE (eXternal
    Interrupt Virtualization Engine) hardware when entering a guest,
    and pull the context off the XIVE when exiting the guest.  The push
    is done with cache-inhibited stores, and the pull with cache-inhibited
    loads.
    
    Testing has revealed that it is possible (though very rare) for
    the stores to get reordered with the loads so that we end up with the
    guest VCPU context still loaded on the XIVE after we have exited the
    guest.  When that happens, it is possible for the same VCPU context
    to then get loaded on another CPU, which causes the machine to
    checkstop.
    
    To fix this, we add I/O barrier instructions (eieio) before and
    after the push and pull operations.  As partial compensation for the
    potential slowdown caused by the extra barriers, we remove the eieio
    instructions between the two stores in the push operation, and between
    the two loads in the pull operation.  (The architecture requires
    loads to cache-inhibited, guarded storage to be kept in order, and
    requires stores to cache-inhibited, guarded storage likewise to be
    kept in order, but allows such loads and stores to be reordered with
    respect to each other.)
    Reported-by: default avatarCarol L Soto <clsoto@us.ibm.com>
    Signed-off-by: default avatarPaul Mackerras <paulus@ozlabs.org>
    ad98dd1a
book3s_hv_rmhandlers.S 78.1 KB