Commit 4c532939 authored by Richard Cochran (linutronix GmbH)'s avatar Richard Cochran (linutronix GmbH) Committed by Thomas Gleixner

tick/sched: Split out jiffies update helper function

The logic to get the time of the last jiffies update will be needed by
the timer pull model as well.

Move the code into a global function in anticipation of the new caller.

No functional change.
Signed-off-by: default avatarRichard Cochran (linutronix GmbH) <richardcochran@gmail.com>
Signed-off-by: default avatarAnna-Maria Behnsen <anna-maria@linutronix.de>
Signed-off-by: default avatarThomas Gleixner <tglx@linutronix.de>
Reviewed-by: default avatarFrederic Weisbecker <frederic@kernel.org>
Link: https://lore.kernel.org/r/20240221090548.36600-17-anna-maria@linutronix.de
parent 89f01e10
...@@ -157,6 +157,7 @@ static inline void tick_nohz_init(void) { } ...@@ -157,6 +157,7 @@ static inline void tick_nohz_init(void) { }
#ifdef CONFIG_NO_HZ_COMMON #ifdef CONFIG_NO_HZ_COMMON
extern unsigned long tick_nohz_active; extern unsigned long tick_nohz_active;
extern void timers_update_nohz(void); extern void timers_update_nohz(void);
extern u64 get_jiffies_update(unsigned long *basej);
# ifdef CONFIG_SMP # ifdef CONFIG_SMP
extern struct static_key_false timers_migration_enabled; extern struct static_key_false timers_migration_enabled;
extern void fetch_next_timer_interrupt_remote(unsigned long basej, u64 basem, extern void fetch_next_timer_interrupt_remote(unsigned long basej, u64 basem,
......
...@@ -799,6 +799,24 @@ static inline bool local_timer_softirq_pending(void) ...@@ -799,6 +799,24 @@ static inline bool local_timer_softirq_pending(void)
return local_softirq_pending() & BIT(TIMER_SOFTIRQ); return local_softirq_pending() & BIT(TIMER_SOFTIRQ);
} }
/*
* Read jiffies and the time when jiffies were updated last
*/
u64 get_jiffies_update(unsigned long *basej)
{
unsigned long basejiff;
unsigned int seq;
u64 basemono;
do {
seq = read_seqcount_begin(&jiffies_seq);
basemono = last_jiffies_update;
basejiff = jiffies;
} while (read_seqcount_retry(&jiffies_seq, seq));
*basej = basejiff;
return basemono;
}
/** /**
* tick_nohz_next_event() - return the clock monotonic based next event * tick_nohz_next_event() - return the clock monotonic based next event
* @ts: pointer to tick_sched struct * @ts: pointer to tick_sched struct
...@@ -813,14 +831,8 @@ static ktime_t tick_nohz_next_event(struct tick_sched *ts, int cpu) ...@@ -813,14 +831,8 @@ static ktime_t tick_nohz_next_event(struct tick_sched *ts, int cpu)
{ {
u64 basemono, next_tick, delta, expires; u64 basemono, next_tick, delta, expires;
unsigned long basejiff; unsigned long basejiff;
unsigned int seq;
/* Read jiffies and the time when jiffies were updated last */ basemono = get_jiffies_update(&basejiff);
do {
seq = read_seqcount_begin(&jiffies_seq);
basemono = last_jiffies_update;
basejiff = jiffies;
} while (read_seqcount_retry(&jiffies_seq, seq));
ts->last_jiffies = basejiff; ts->last_jiffies = basejiff;
ts->timer_expires_base = basemono; ts->timer_expires_base = basemono;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment