diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2008-04-28 12:36:40 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2008-04-28 12:36:40 -0400 |
commit | 513694b5f931a62561d21eb97a4740ce37464a45 (patch) | |
tree | f340654b3d628c1b443751b1ba6a50f2b97bd4d6 | |
parent | 46b958eb808b73a232efc962e730faffe7cff5c5 (diff) | |
parent | d7b41a24bfb5d7fa02f7b49be1293d468814e424 (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.c | 15 |
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); |