• Michael Ellerman's avatar
    powerpc/xmon: Don't loop forever in get_output_lock() · 730efb61
    Michael Ellerman authored
    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: default avatarMichael Ellerman <michael@ellerman.id.au>
    Signed-off-by: default avatarBenjamin Herrenschmidt <benh@kernel.crashing.org>
    730efb61
xmon.c 68.5 KB