• M
    powerpc/xmon: Don't loop forever in get_output_lock() · 730efb61
    Michael Ellerman 提交于
    If we enter with xmon_speaker != 0 we skip the first cmpxchg(), we also
    skip the while loop because xmon_speaker != last_speaker (0) - meaning we
    skip the second cmpxchg() also.
    
    Following that code path the compiler sees no memory barriers and so is
    within its rights to never reload xmon_speaker. The end result is we loop
    forever.
    
    This manifests as all cpus being in xmon ('c' command), but they refuse
    to take control when you switch to them ('c x' for cpu # x).
    
    I have seen this deadlock in practice and also checked the generated code to
    confirm this is what's happening.
    
    The simplest fix is just to always try the cmpxchg().
    Signed-off-by: NMichael Ellerman <michael@ellerman.id.au>
    Signed-off-by: NBenjamin Herrenschmidt <benh@kernel.crashing.org>
    730efb61
xmon.c 68.5 KB