Hi Ingo/Thomas/Peter,
While queuing a timer, we try to migrate it to a non-idle core if the local core is idle, but we don't try that if the timer is re-armed from its handler.
There were few unsolved problems due to which it was avoided until now. But there are cases where solving these problems can be useful. When the timer is always re-armed from its handler, it never migrates to other cores. And many a times, it ends up waking an idle core to just service the timer, which could have been handled by a non-idle core.
Peter suggested [1] few changes which can make that work and the first patch does exactly that. The second one is a minor improvement, that replaces 'running_timer' pointer with 'busy'. That variable was required as part of a sanity check during CPU hot-unplug operation. I was not sure if we should drop this extra variable ('running_timer' or 'busy') and the sanity check.
Because we are using another bit from base pointer to keep track of running status of timer, we get a warning on blackfin, as it doesn't respect ____cacheline_aligned [2].
kernel/time/timer.c: In function 'init_timers': kernel/time/timer.c:1731:2: error: call to '__compiletime_assert_1731' declared with attribute error: BUILD_BUG_ON failed: __alignof__(struct tvec_base) & TIMER_FLAG_MASK
-- viresh
[1] https://lkml.org/lkml/2015/3/28/32 [2] https://lkml.org/lkml/2015/3/29/178
Cc: Steven Miao realmz6@gmail.com
Viresh Kumar (2): timer: Avoid waking up an idle-core by migrate running timer timer: Replace base-> 'running_timer' with 'busy'
include/linux/timer.h | 3 +- kernel/time/timer.c | 102 ++++++++++++++++++++++++++++++++++++++------------ 2 files changed, 81 insertions(+), 24 deletions(-)