aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLinus Torvalds <torvalds@linux-foundation.org>2008-04-28 12:36:40 -0400
committerLinus Torvalds <torvalds@linux-foundation.org>2008-04-28 12:36:40 -0400
commit513694b5f931a62561d21eb97a4740ce37464a45 (patch)
treef340654b3d628c1b443751b1ba6a50f2b97bd4d6
parent46b958eb808b73a232efc962e730faffe7cff5c5 (diff)
parentd7b41a24bfb5d7fa02f7b49be1293d468814e424 (diff)
Merge git://git.kernel.org/pub/scm/linux/kernel/git/tglx/linux-2.6-hrt
* git://git.kernel.org/pub/scm/linux/kernel/git/tglx/linux-2.6-hrt: hrtimer: timeout too long when using HRTIMER_CB_SOFTIRQ
-rw-r--r--kernel/hrtimer.c15
1 files changed, 13 insertions, 2 deletions
diff --git a/kernel/hrtimer.c b/kernel/hrtimer.c
index f78777abe769..e379ef0e9c20 100644
--- a/kernel/hrtimer.c
+++ b/kernel/hrtimer.c
@@ -1080,8 +1080,19 @@ static void run_hrtimer_pending(struct hrtimer_cpu_base *cpu_base)
1080 * If the timer was rearmed on another CPU, reprogram 1080 * If the timer was rearmed on another CPU, reprogram
1081 * the event device. 1081 * the event device.
1082 */ 1082 */
1083 if (timer->base->first == &timer->node) 1083 struct hrtimer_clock_base *base = timer->base;
1084 hrtimer_reprogram(timer, timer->base); 1084
1085 if (base->first == &timer->node &&
1086 hrtimer_reprogram(timer, base)) {
1087 /*
1088 * Timer is expired. Thus move it from tree to
1089 * pending list again.
1090 */
1091 __remove_hrtimer(timer, base,
1092 HRTIMER_STATE_PENDING, 0);
1093 list_add_tail(&timer->cb_entry,
1094 &base->cpu_base->cb_pending);
1095 }
1085 } 1096 }
1086 } 1097 }
1087 spin_unlock_irq(&cpu_base->lock); 1098 spin_unlock_irq(&cpu_base->lock);