Commit 5dfeaef8 authored by Linus Torvalds's avatar Linus Torvalds

Merge branch 'master' of git://git.kernel.org/pub/scm/linux/kernel/git/tglx/linux-2.6-hrt

* 'master' of git://git.kernel.org/pub/scm/linux/kernel/git/tglx/linux-2.6-hrt:
  hrtimer: optimize the softirq time optimization
  hrtimer: reduce calls to hrtimer_get_softirq_time()
  clockevents: fix typo in tick-broadcast.c
  jiffies: add time_is_after_jiffies and others which compare with jiffies
parents 429f731d 259aae86
...@@ -134,6 +134,22 @@ static inline u64 get_jiffies_64(void) ...@@ -134,6 +134,22 @@ static inline u64 get_jiffies_64(void)
((__s64)(a) - (__s64)(b) >= 0)) ((__s64)(a) - (__s64)(b) >= 0))
#define time_before_eq64(a,b) time_after_eq64(b,a) #define time_before_eq64(a,b) time_after_eq64(b,a)
/*
* These four macros compare jiffies and 'a' for convenience.
*/
/* time_is_before_jiffies(a) return true if a is before jiffies */
#define time_is_before_jiffies(a) time_after(jiffies, a)
/* time_is_after_jiffies(a) return true if a is after jiffies */
#define time_is_after_jiffies(a) time_before(jiffies, a)
/* time_is_before_eq_jiffies(a) return true if a is before or equal to jiffies*/
#define time_is_before_eq_jiffies(a) time_after_eq(jiffies, a)
/* time_is_after_eq_jiffies(a) return true if a is after or equal to jiffies*/
#define time_is_after_eq_jiffies(a) time_before_eq(jiffies, a)
/* /*
* Have the 32 bit jiffies value wrap 5 minutes after boot * Have the 32 bit jiffies value wrap 5 minutes after boot
* so jiffies wrap bugs show up earlier. * so jiffies wrap bugs show up earlier.
......
...@@ -1238,51 +1238,50 @@ void hrtimer_run_pending(void) ...@@ -1238,51 +1238,50 @@ void hrtimer_run_pending(void)
/* /*
* Called from hardirq context every jiffy * Called from hardirq context every jiffy
*/ */
static inline void run_hrtimer_queue(struct hrtimer_cpu_base *cpu_base, void hrtimer_run_queues(void)
int index)
{ {
struct rb_node *node; struct rb_node *node;
struct hrtimer_clock_base *base = &cpu_base->clock_base[index]; struct hrtimer_cpu_base *cpu_base = &__get_cpu_var(hrtimer_bases);
struct hrtimer_clock_base *base;
int index, gettime = 1;
if (!base->first) if (hrtimer_hres_active())
return; return;
if (base->get_softirq_time) for (index = 0; index < HRTIMER_MAX_CLOCK_BASES; index++) {
base->softirq_time = base->get_softirq_time(); base = &cpu_base->clock_base[index];
spin_lock(&cpu_base->lock);
while ((node = base->first)) { if (!base->first)
struct hrtimer *timer;
timer = rb_entry(node, struct hrtimer, node);
if (base->softirq_time.tv64 <= timer->expires.tv64)
break;
if (timer->cb_mode == HRTIMER_CB_SOFTIRQ) {
__remove_hrtimer(timer, base, HRTIMER_STATE_PENDING, 0);
list_add_tail(&timer->cb_entry,
&base->cpu_base->cb_pending);
continue; continue;
if (base->get_softirq_time)
base->softirq_time = base->get_softirq_time();
else if (gettime) {
hrtimer_get_softirq_time(cpu_base);
gettime = 0;
} }
__run_hrtimer(timer); spin_lock(&cpu_base->lock);
}
spin_unlock(&cpu_base->lock);
}
void hrtimer_run_queues(void) while ((node = base->first)) {
{ struct hrtimer *timer;
struct hrtimer_cpu_base *cpu_base = &__get_cpu_var(hrtimer_bases);
int i;
if (hrtimer_hres_active()) timer = rb_entry(node, struct hrtimer, node);
return; if (base->softirq_time.tv64 <= timer->expires.tv64)
break;
hrtimer_get_softirq_time(cpu_base); if (timer->cb_mode == HRTIMER_CB_SOFTIRQ) {
__remove_hrtimer(timer, base,
HRTIMER_STATE_PENDING, 0);
list_add_tail(&timer->cb_entry,
&base->cpu_base->cb_pending);
continue;
}
for (i = 0; i < HRTIMER_MAX_CLOCK_BASES; i++) __run_hrtimer(timer);
run_hrtimer_queue(cpu_base, i); }
spin_unlock(&cpu_base->lock);
}
} }
/* /*
......
...@@ -262,7 +262,7 @@ static void tick_do_broadcast_on_off(void *why) ...@@ -262,7 +262,7 @@ static void tick_do_broadcast_on_off(void *why)
void tick_broadcast_on_off(unsigned long reason, int *oncpu) void tick_broadcast_on_off(unsigned long reason, int *oncpu)
{ {
if (!cpu_isset(*oncpu, cpu_online_map)) if (!cpu_isset(*oncpu, cpu_online_map))
printk(KERN_ERR "tick-braodcast: ignoring broadcast for " printk(KERN_ERR "tick-broadcast: ignoring broadcast for "
"offline CPU #%d\n", *oncpu); "offline CPU #%d\n", *oncpu);
else else
smp_call_function_single(*oncpu, tick_do_broadcast_on_off, smp_call_function_single(*oncpu, tick_do_broadcast_on_off,
......
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