[PATCH] Extend next_timer_interrupt() to use a reference jiffie
For CONFIG_NO_HZ we need to calculate the next timer wheel event based on a given jiffie value. Extend the existing code to allow the extra 'now' argument. Provide a compability function for the existing implementations to call the function with now == jiffies. (This also solves the racyness of the original code vs. jiffies changing during the iteration.) No functional changes to existing users of this infrastructure. [ remove WARN_ON() that triggered on s390, by Carsten Otte <cotte@de.ibm.com> ] [ made new helper static, Adrian Bunk <bunk@stusta.de> ] Signed-off-by: Thomas Gleixner <tglx@linutronix.de> Signed-off-by: Ingo Molnar <mingo@elte.hu> Cc: john stultz <johnstul@us.ibm.com> Cc: Roman Zippel <zippel@linux-m68k.org> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This commit is contained in:
parent
1cfd68496e
commit
fd064b9b77
3 changed files with 22 additions and 4 deletions
|
@ -61,7 +61,17 @@ extern int del_timer(struct timer_list * timer);
|
|||
extern int __mod_timer(struct timer_list *timer, unsigned long expires);
|
||||
extern int mod_timer(struct timer_list *timer, unsigned long expires);
|
||||
|
||||
/*
|
||||
* Return when the next timer-wheel timeout occurs (in absolute jiffies),
|
||||
* locks the timer base:
|
||||
*/
|
||||
extern unsigned long next_timer_interrupt(void);
|
||||
/*
|
||||
* Return when the next timer-wheel timeout occurs (in absolute jiffies),
|
||||
* locks the timer base and does the comparison against the given
|
||||
* jiffie.
|
||||
*/
|
||||
extern unsigned long get_next_timer_interrupt(unsigned long now);
|
||||
|
||||
/**
|
||||
* add_timer - start a timer
|
||||
|
|
|
@ -533,7 +533,7 @@ ktime_t hrtimer_get_remaining(const struct hrtimer *timer)
|
|||
}
|
||||
EXPORT_SYMBOL_GPL(hrtimer_get_remaining);
|
||||
|
||||
#ifdef CONFIG_NO_IDLE_HZ
|
||||
#if defined(CONFIG_NO_IDLE_HZ) || defined(CONFIG_NO_HZ)
|
||||
/**
|
||||
* hrtimer_get_next_event - get the time until next expiry event
|
||||
*
|
||||
|
|
|
@ -591,7 +591,7 @@ static inline void __run_timers(tvec_base_t *base)
|
|||
spin_unlock_irq(&base->lock);
|
||||
}
|
||||
|
||||
#ifdef CONFIG_NO_IDLE_HZ
|
||||
#if defined(CONFIG_NO_IDLE_HZ) || defined(CONFIG_NO_HZ)
|
||||
/*
|
||||
* Find out when the next timer event is due to happen. This
|
||||
* is used on S/390 to stop all activity when a cpus is idle.
|
||||
|
@ -687,10 +687,10 @@ static unsigned long cmp_next_hrtimer_event(unsigned long now,
|
|||
/**
|
||||
* next_timer_interrupt - return the jiffy of the next pending timer
|
||||
*/
|
||||
unsigned long next_timer_interrupt(void)
|
||||
unsigned long get_next_timer_interrupt(unsigned long now)
|
||||
{
|
||||
tvec_base_t *base = __get_cpu_var(tvec_bases);
|
||||
unsigned long expires, now = jiffies;
|
||||
unsigned long expires;
|
||||
|
||||
spin_lock(&base->lock);
|
||||
expires = __next_timer_interrupt(base);
|
||||
|
@ -701,6 +701,14 @@ unsigned long next_timer_interrupt(void)
|
|||
|
||||
return cmp_next_hrtimer_event(now, expires);
|
||||
}
|
||||
|
||||
#ifdef CONFIG_NO_IDLE_HZ
|
||||
unsigned long next_timer_interrupt(void)
|
||||
{
|
||||
return get_next_timer_interrupt(jiffies);
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif
|
||||
|
||||
/******************************************************************/
|
||||
|
|
Loading…
Reference in a new issue