diff options
author | Steven Rostedt (Red Hat) <rostedt@goodmis.org> | 2013-03-19 22:06:29 -0400 |
---|---|---|
committer | Steven Rostedt <rostedt@goodmis.org> | 2013-03-19 22:06:29 -0400 |
commit | 2d60d16dca7537bff987545244496ff7477051e0 (patch) | |
tree | c2e98ec773cfd06b5c9243960aa601275464a381 /localversion-rt | |
parent | 1f5e9a5685c9596d9fc28018608ee9385c060b9e (diff) | |
parent | 733c7943173143e29005c44b4fceb64302dd3098 (diff) |
Merge tag 'v3.2.40' into v3.2-rt
This is the 3.2.40 stable release
Conflicts:
kernel/hrtimer.c
Solved with:
diff --cc kernel/hrtimer.c
index 9c09d02,cdd5607..0000000
--- a/kernel/hrtimer.c
+++ b/kernel/hrtimer.c
@@@ -1054,19 -982,20 +1032,39 @@@ int __hrtimer_start_range_ns(struct hrt
*
* XXX send_remote_softirq() ?
*/
- if (leftmost && new_base->cpu_base == &__get_cpu_var(hrtimer_bases)) {
- ret = hrtimer_enqueue_reprogram(timer, new_base, wakeup);
- if (ret) {
+ if (leftmost && new_base->cpu_base == &__get_cpu_var(hrtimer_bases)
+ && hrtimer_enqueue_reprogram(timer, new_base)) {
- if (wakeup) {
++
++ if (wakeup
++#ifdef CONFIG_PREEMPT_RT_BASE
++ /*
++ * Move softirq based timers away from the rbtree in
++ * case it expired already. Otherwise we would have a
++ * stale base->first entry until the softirq runs.
++ */
++ && hrtimer_rt_defer(timer)
++#endif
++ ) {
/*
- * In case we failed to reprogram the timer (mostly
- * because out current timer is already elapsed),
- * remove it again and report a failure. This avoids
- * stale base->first entries.
+ * We need to drop cpu_base->lock to avoid a
+ * lock ordering issue vs. rq->lock.
*/
- debug_deactivate(timer);
- __remove_hrtimer(timer, new_base,
- timer->state & HRTIMER_STATE_CALLBACK, 0);
+ raw_spin_unlock(&new_base->cpu_base->lock);
+ raise_softirq_irqoff(HRTIMER_SOFTIRQ);
+ local_irq_restore(flags);
+ return ret;
- } else {
- __raise_softirq_irqoff(HRTIMER_SOFTIRQ);
}
++
++ /*
++ * In case we failed to reprogram the timer (mostly
++ * because out current timer is already elapsed),
++ * remove it again and report a failure. This avoids
++ * stale base->first entries.
++ */
++ debug_deactivate(timer);
++ __remove_hrtimer(timer, new_base,
++ timer->state & HRTIMER_STATE_CALLBACK, 0);
++ ret = -ETIME;
}
unlock_hrtimer_base(timer, &flags);
Signed-off-by: Steven Rostedt <rostedt@goodmis.org>
Diffstat (limited to 'localversion-rt')
0 files changed, 0 insertions, 0 deletions