On Fri, 23 Jun 2017 19:33:23 +1000 Michael Ellerman <m...@ellerman.id.au> wrote:
> Michael Neuling <mi...@neuling.org> writes: > > > On POWER9 the ERAT may be incorrect on wakeup from some stop states > > that lose state. This causes random segvs and illegal instructions > > when these stop states are enabled. > > Incorrect how? It can have stale ERAT entries from another idle thread. > > Because with the ERAT flush where you've put it, there's still a good > amount of code executed prior to the flush isn't there? > > ie. we come in at 0x100, do some of the prolog, do IDLE_TEST which takes > us to pnv_powersave_wakeup, which then restores state from the paca > (memory), that returns and then we check KVM ... and then finally we end > up at pnv_wakeup_loss. In the case of an HMI, we could call into OPAL as well. > Or is there some other path? Or is the ERAT incorrect in some specific > way which means we only need to flush there? I think we're in real mode until returning from pnv_wakeup_loss so those ERATs should be the same. Except KVM, which can go to guest and switch on the MMU. My bad, I suggested putting it into pnv_wakeup_loss. Flushing at the start of pnv_powersave_wakeup should be safest. I guess we can avoid it for non-state-loss wakeups if cr3 is lt. Thanks, Nick