• Paul Mackerras's avatar
    powerpc/powernv: Return to cpu offline loop when finished in KVM guest · 56548fc0
    Paul Mackerras authored
    When a secondary hardware thread has finished running a KVM guest, we
    currently put that thread into nap mode using a nap instruction in
    the KVM code.  This changes the code so that instead of doing a nap
    instruction directly, we instead cause the call to power7_nap() that
    put the thread into nap mode to return.  The reason for doing this is
    to avoid having the KVM code having to know what low-power mode to
    put the thread into.
    
    In the case of a secondary thread used to run a KVM guest, the thread
    will be offline from the point of view of the host kernel, and the
    relevant power7_nap() call is the one in pnv_smp_cpu_disable().
    In this case we don't want to clear pending IPIs in the offline loop
    in that function, since that might cause us to miss the wakeup for
    the next time the thread needs to run a guest.  To tell whether or
    not to clear the interrupt, we use the SRR1 value returned from
    power7_nap(), and check if it indicates an external interrupt.  We
    arrange that the return from power7_nap() when we have finished running
    a guest returns 0, so pending interrupts don't get flushed in that
    case.
    
    Note that it is important a secondary thread that has finished
    executing in the guest, or that didn't have a guest to run, should
    not return to power7_nap's caller while the kvm_hstate.hwthread_req
    flag in the PACA is non-zero, because the return from power7_nap
    will reenable the MMU, and the MMU might still be in guest context.
    In this situation we spin at low priority in real mode waiting for
    hwthread_req to become zero.
    Signed-off-by: default avatarPaul Mackerras <paulus@samba.org>
    Signed-off-by: default avatarMichael Ellerman <mpe@ellerman.id.au>
    56548fc0
idle_power7.S 5.45 KB