• Russell King's avatar
    ARM: Fix subtle race in CPU pen_release hotplug code · 3705ff6d
    Russell King authored
    There is a subtle race in the CPU hotplug code, where a CPU which has
    been offlined can online itself before being requested, which results
    in things going astray on the next online/offline cycle.
    
    What happens in the normal online/offline/online cycle is:
    
    	CPU0			CPU3
    	requests boot of CPU3
    	pen_release = 3
    	flush cache line
    				checks pen_release, reads 3
    				starts boot
    				pen_release = -1
    	... requests CPU3 offline ...
    				... dies ...
    				checks pen_release, reads -1
    	requests boot of CPU3
    	pen_release = 3
    	flush cache line
    				checks pen_release, reads 3
    				starts boot
    				pen_release = -1
    
    However, as the write of -1 of pen_release is not fully flushed back to
    memory, and the checking of pen_release is done with caches disabled,
    this allows CPU3 the opportunity to read the old value of pen_release:
    
    	CPU0			CPU3
    	requests boot of CPU3
    	pen_release = 3
    	flush cache line
    				checks pen_release, reads 3
    				starts boot
    				pen_release = -1
    	... requests CPU3 offline ...
    				... dies ...
    				checks pen_release, reads 3
    				starts boot
    				pen_release = -1
    	requests boot of CPU3
    	pen_release = 3
    	flush cache line
    
    Fix this by grouping the write of pen_release along with its cache line
    flushing code to ensure that any update to pen_release is always pushed
    out to physical memory.
    Signed-off-by: default avatarRussell King <rmk+kernel@arm.linux.org.uk>
    3705ff6d
platsmp.c 4.36 KB