Commit fd064b9b authored by Thomas Gleixner's avatar Thomas Gleixner Committed by Linus Torvalds

[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: default avatarThomas Gleixner <tglx@linutronix.de>
Signed-off-by: default avatarIngo Molnar <mingo@elte.hu>
Cc: john stultz <johnstul@us.ibm.com>
Cc: Roman Zippel <zippel@linux-m68k.org>
Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
parent 1cfd6849
...@@ -61,7 +61,17 @@ extern int del_timer(struct timer_list * timer); ...@@ -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);
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); 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 * add_timer - start a timer
......
...@@ -533,7 +533,7 @@ ktime_t hrtimer_get_remaining(const struct hrtimer *timer) ...@@ -533,7 +533,7 @@ ktime_t hrtimer_get_remaining(const struct hrtimer *timer)
} }
EXPORT_SYMBOL_GPL(hrtimer_get_remaining); 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 * hrtimer_get_next_event - get the time until next expiry event
* *
......
...@@ -591,7 +591,7 @@ static inline void __run_timers(tvec_base_t *base) ...@@ -591,7 +591,7 @@ static inline void __run_timers(tvec_base_t *base)
spin_unlock_irq(&base->lock); 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 * 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. * 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, ...@@ -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 * 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); tvec_base_t *base = __get_cpu_var(tvec_bases);
unsigned long expires, now = jiffies; unsigned long expires;
spin_lock(&base->lock); spin_lock(&base->lock);
expires = __next_timer_interrupt(base); expires = __next_timer_interrupt(base);
...@@ -701,6 +701,14 @@ unsigned long next_timer_interrupt(void) ...@@ -701,6 +701,14 @@ unsigned long next_timer_interrupt(void)
return cmp_next_hrtimer_event(now, expires); 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 #endif
/******************************************************************/ /******************************************************************/
......
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