|
@@ -1238,51 +1238,50 @@ void hrtimer_run_pending(void)
|
|
|
/*
|
|
|
* Called from hardirq context every jiffy
|
|
|
*/
|
|
|
-static inline void run_hrtimer_queue(struct hrtimer_cpu_base *cpu_base,
|
|
|
- int index)
|
|
|
+void hrtimer_run_queues(void)
|
|
|
{
|
|
|
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;
|
|
|
|
|
|
- if (base->get_softirq_time)
|
|
|
- base->softirq_time = base->get_softirq_time();
|
|
|
-
|
|
|
- spin_lock(&cpu_base->lock);
|
|
|
+ for (index = 0; index < HRTIMER_MAX_CLOCK_BASES; index++) {
|
|
|
+ base = &cpu_base->clock_base[index];
|
|
|
|
|
|
- while ((node = 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);
|
|
|
+ if (!base->first)
|
|
|
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_unlock(&cpu_base->lock);
|
|
|
-}
|
|
|
+ spin_lock(&cpu_base->lock);
|
|
|
|
|
|
-void hrtimer_run_queues(void)
|
|
|
-{
|
|
|
- struct hrtimer_cpu_base *cpu_base = &__get_cpu_var(hrtimer_bases);
|
|
|
- int i;
|
|
|
+ while ((node = base->first)) {
|
|
|
+ struct hrtimer *timer;
|
|
|
|
|
|
- if (hrtimer_hres_active())
|
|
|
- return;
|
|
|
+ timer = rb_entry(node, struct hrtimer, node);
|
|
|
+ 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_queue(cpu_base, i);
|
|
|
+ __run_hrtimer(timer);
|
|
|
+ }
|
|
|
+ spin_unlock(&cpu_base->lock);
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
/*
|