tick: Provide a check for a forced broadcast pending
authorThomas Gleixner <tglx@linutronix.de>
Wed, 6 Mar 2013 11:18:36 +0000 (11:18 +0000)
committerThomas Gleixner <tglx@linutronix.de>
Wed, 13 Mar 2013 10:39:39 +0000 (11:39 +0100)
commiteaa907c546f76222227dfc41784b22588af1e3d7
tree0e23882c311bc527ae9e328c22b000ff11b85fae
parent989dcb645ca715129c5a2b39102c8334a20d9615
tick: Provide a check for a forced broadcast pending

On the CPU which gets woken along with the target CPU of the broadcast
the following happens:

  deep_idle()
<-- spurious wakeup
  broadcast_exit()
    set forced bit

  enable interrupts

<-- Nothing happens

  disable interrupts

  broadcast_enter()
<-- Here we observe the forced bit is set
  deep_idle()

Now after that the target CPU of the broadcast runs the broadcast
handler and finds the other CPU in both the broadcast and the forced
mask, sends the IPI and stuff gets back to normal.

So it's not actually harmful, just more evidence for the theory, that
hardware designers have access to very special drug supplies.

Now there is no point in going back to deep idle just to wake up again
right away via an IPI. Provide a check which allows the idle code to
avoid the deep idle transition.

Signed-off-by: Thomas 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: Santosh Shilimkar <santosh.shilimkar@ti.com>
Cc: Jason Liu <liu.h.jason@gmail.com>
Link: http://lkml.kernel.org/r/20130306111537.565418308@linutronix.de
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
include/linux/clockchips.h
kernel/time/tick-broadcast.c