• Colin Cross's avatar
    cpuidle: coupled: fix race condition between pokes and safe state · 736899ab
    Colin Cross authored
    commit 9e19b73c30a5fa42a53583a1f7817dd857126156 upstream.
    
    The coupled cpuidle waiting loop clears pending pokes before
    entering the safe state.  If a poke arrives just before the
    pokes are cleared, but after the while loop condition checks,
    the poke will be lost and the cpu will stay in the safe state
    until another interrupt arrives.  This may cause the cpu that
    sent the poke to spin in the ready loop with interrupts off
    until another cpu receives an interrupt, and if no other cpus
    have interrupts routed to them it can spin forever.
    
    Change the return value of cpuidle_coupled_clear_pokes to
    return if a poke was cleared, and move the need_resched()
    checks into the callers.  In the waiting loop, if
    a poke was cleared restart the loop to repeat the while
    condition checks.
    Reported-by: default avatarNeil Zhang <zhangwm@marvell.com>
    Signed-off-by: default avatarColin Cross <ccross@android.com>
    Signed-off-by: default avatarRafael J. Wysocki <rafael.j.wysocki@intel.com>
    Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
    736899ab
Name
Last commit
Last update
..
governors Loading commit data...
Kconfig Loading commit data...
Makefile Loading commit data...
coupled.c Loading commit data...
cpuidle-calxeda.c Loading commit data...
cpuidle-kirkwood.c Loading commit data...
cpuidle.c Loading commit data...
cpuidle.h Loading commit data...
driver.c Loading commit data...
governor.c Loading commit data...
sysfs.c Loading commit data...