mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2025-01-17 02:36:21 +00:00
timers: Introduce add_timer() variants which modify timer flags
A timer might be used as a pinned timer (using add_timer_on()) and later on as non-pinned timer using add_timer(). When the "NOHZ timer pull at expiry model" is in place, the TIMER_PINNED flag is required to be used whenever a timer needs to expire on a dedicated CPU. Otherwise the flag must not be set if expiration on a dedicated CPU is not required. add_timer_on()'s behavior will be changed during the preparation patches for the "NOHZ timer pull at expiry model" to unconditionally set the TIMER_PINNED flag. To be able to clear/ set the flag when queueing a timer, two variants of add_timer() are introduced. This is a preparatory step and has no functional change. Signed-off-by: Anna-Maria Behnsen <anna-maria@linutronix.de> Signed-off-by: Thomas Gleixner <tglx@linutronix.de> Reviewed-by: Frederic Weisbecker <frederic@kernel.org> Link: https://lore.kernel.org/r/20240221090548.36600-6-anna-maria@linutronix.de
This commit is contained in:
parent
73129cf4b6
commit
8e7e247f64
@ -165,6 +165,8 @@ extern int timer_reduce(struct timer_list *timer, unsigned long expires);
|
||||
#define NEXT_TIMER_MAX_DELTA ((1UL << 30) - 1)
|
||||
|
||||
extern void add_timer(struct timer_list *timer);
|
||||
extern void add_timer_local(struct timer_list *timer);
|
||||
extern void add_timer_global(struct timer_list *timer);
|
||||
|
||||
extern int try_to_del_timer_sync(struct timer_list *timer);
|
||||
extern int timer_delete_sync(struct timer_list *timer);
|
||||
|
@ -1290,6 +1290,40 @@ void add_timer(struct timer_list *timer)
|
||||
}
|
||||
EXPORT_SYMBOL(add_timer);
|
||||
|
||||
/**
|
||||
* add_timer_local() - Start a timer on the local CPU
|
||||
* @timer: The timer to be started
|
||||
*
|
||||
* Same as add_timer() except that the timer flag TIMER_PINNED is set.
|
||||
*
|
||||
* See add_timer() for further details.
|
||||
*/
|
||||
void add_timer_local(struct timer_list *timer)
|
||||
{
|
||||
if (WARN_ON_ONCE(timer_pending(timer)))
|
||||
return;
|
||||
timer->flags |= TIMER_PINNED;
|
||||
__mod_timer(timer, timer->expires, MOD_TIMER_NOTPENDING);
|
||||
}
|
||||
EXPORT_SYMBOL(add_timer_local);
|
||||
|
||||
/**
|
||||
* add_timer_global() - Start a timer without TIMER_PINNED flag set
|
||||
* @timer: The timer to be started
|
||||
*
|
||||
* Same as add_timer() except that the timer flag TIMER_PINNED is unset.
|
||||
*
|
||||
* See add_timer() for further details.
|
||||
*/
|
||||
void add_timer_global(struct timer_list *timer)
|
||||
{
|
||||
if (WARN_ON_ONCE(timer_pending(timer)))
|
||||
return;
|
||||
timer->flags &= ~TIMER_PINNED;
|
||||
__mod_timer(timer, timer->expires, MOD_TIMER_NOTPENDING);
|
||||
}
|
||||
EXPORT_SYMBOL(add_timer_global);
|
||||
|
||||
/**
|
||||
* add_timer_on - Start a timer on a particular CPU
|
||||
* @timer: The timer to be started
|
||||
|
Loading…
x
Reference in New Issue
Block a user