• Venki Pallipadi's avatar
    Add support for deferrable timers · 6e453a67
    Venki Pallipadi authored
    Introduce a new flag for timers - deferrable: Timers that work normally
    when system is busy.  But, will not cause CPU to come out of idle (just to
    service this timer), when CPU is idle.  Instead, this timer will be
    serviced when CPU eventually wakes up with a subsequent non-deferrable
    timer.
    
    The main advantage of this is to avoid unnecessary timer interrupts when
    CPU is idle.  If the routine currently called by a timer can wait until
    next event without any issues, this new timer can be used to setup timer
    event for that routine.  This, with dynticks, allows CPUs to be lazy,
    allowing them to stay in idle for extended period of time by reducing
    unnecesary wakeup and thereby reducing the power consumption.
    
    This patch:
    
    Builds this new timer on top of existing timer infrastructure.  It uses
    last bit in 'base' pointer of timer_list structure to store this deferrable
    timer flag.  __next_timer_interrupt() function skips over these deferrable
    timers when CPU looks for next timer event for which it has to wake up.
    
    This is exported by a new interface init_timer_deferrable() that can be
    called in place of regular init_timer().
    
    [akpm@linux-foundation.org: Privatise a #define]
    Signed-off-by: default avatarVenkatesh Pallipadi <venkatesh.pallipadi@intel.com>
    Cc: Ingo Molnar <mingo@elte.hu>
    Cc: Thomas Gleixner <tglx@linutronix.de>
    Cc: Oleg Nesterov <oleg@tv-sign.ru>
    Cc: Dave Jones <davej@codemonkey.org.uk>
    Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
    Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
    6e453a67
timer.c 51.8 KB