• Thomas Gleixner's avatar
    tick: Handle broadcast wakeup of multiple cpus · 989dcb64
    Thomas Gleixner authored
    Some brilliant hardware implementations wake multiple cores when the
    broadcast timer fires. This leads to the following interesting
    problem:
    
    CPU0				CPU1
    wakeup from idle		wakeup from idle
    
    leave broadcast mode		leave broadcast mode
     restart per cpu timer		 restart per cpu timer
     	     	 		go back to idle
    handle broadcast
     (empty mask)			
    				enter broadcast mode
    				programm broadcast device
    enter broadcast mode
    programm broadcast device
    
    So what happens is that due to the forced reprogramming of the cpu
    local timer, we need to set a event in the future. Now if we manage to
    go back to idle before the timer fires, we switch off the timer and
    arm the broadcast device with an already expired time (covered by
    forced mode). So in the worst case we repeat the above ping pong
    forever.
    					
    Unfortunately we have no information about what caused the wakeup, but
    we can check current time against the expiry time of the local cpu. If
    the local event is already in the past, we know that the broadcast
    timer is about to fire and send an IPI. So we mark ourself as an IPI
    target even if we left broadcast mode and avoid the reprogramming of
    the local cpu timer.
    
    This still leaves the possibility that a CPU which is not handling the
    broadcast interrupt is going to reach idle again before the IPI
    arrives. This can't be solved in the core code and will be handled in
    follow up patches.
    Reported-by: default avatarJason Liu <liu.h.jason@gmail.com>
    Signed-off-by: default avatarThomas Gleixner <tglx@linutronix.de>
    Cc: LAK <linux-arm-kernel@lists.infradead.org>
    Cc: John Stultz <john.stultz@linaro.org>
    Cc: Arjan van de Veen <arjan@infradead.org>
    Cc: Lorenzo Pieralisi <lorenzo.pieralisi@arm.com>
    Tested-by: default avatarSantosh Shilimkar <santosh.shilimkar@ti.com>
    Link: http://lkml.kernel.org/r/20130306111537.492045206@linutronix.deSigned-off-by: default avatarThomas Gleixner <tglx@linutronix.de>
    989dcb64
tick-broadcast.c 19.5 KB