diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2014-08-03 12:58:20 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2014-08-03 12:58:20 -0400 |
commit | 8d71844b5194fee6edd49e68c01445266f364572 (patch) | |
tree | 637d8292cc2b6530d33b53ede66cdc771514acc7 | |
parent | 3f9c08f7ce2ca7b176dc7ee8dd287a82dfe53e60 (diff) | |
parent | 504d58745c9ca28d33572e2d8a9990b43e06075d (diff) |
Merge branch 'timers-urgent-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip
Pull timer fixes from Thomas Gleixner:
"Two fixes in the timer area:
- a long-standing lock inversion due to a printk
- suspend-related hrtimer corruption in sched_clock"
* 'timers-urgent-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip:
timer: Fix lock inversion between hrtimer_bases.lock and scheduler locks
sched_clock: Avoid corrupting hrtimer tree during suspend
-rw-r--r-- | kernel/time/clockevents.c | 10 | ||||
-rw-r--r-- | kernel/time/sched_clock.c | 4 |
2 files changed, 9 insertions, 5 deletions
diff --git a/kernel/time/clockevents.c b/kernel/time/clockevents.c index ad362c260ef4..9c94c19f1305 100644 --- a/kernel/time/clockevents.c +++ b/kernel/time/clockevents.c | |||
@@ -146,7 +146,8 @@ static int clockevents_increase_min_delta(struct clock_event_device *dev) | |||
146 | { | 146 | { |
147 | /* Nothing to do if we already reached the limit */ | 147 | /* Nothing to do if we already reached the limit */ |
148 | if (dev->min_delta_ns >= MIN_DELTA_LIMIT) { | 148 | if (dev->min_delta_ns >= MIN_DELTA_LIMIT) { |
149 | printk(KERN_WARNING "CE: Reprogramming failure. Giving up\n"); | 149 | printk_deferred(KERN_WARNING |
150 | "CE: Reprogramming failure. Giving up\n"); | ||
150 | dev->next_event.tv64 = KTIME_MAX; | 151 | dev->next_event.tv64 = KTIME_MAX; |
151 | return -ETIME; | 152 | return -ETIME; |
152 | } | 153 | } |
@@ -159,9 +160,10 @@ static int clockevents_increase_min_delta(struct clock_event_device *dev) | |||
159 | if (dev->min_delta_ns > MIN_DELTA_LIMIT) | 160 | if (dev->min_delta_ns > MIN_DELTA_LIMIT) |
160 | dev->min_delta_ns = MIN_DELTA_LIMIT; | 161 | dev->min_delta_ns = MIN_DELTA_LIMIT; |
161 | 162 | ||
162 | printk(KERN_WARNING "CE: %s increased min_delta_ns to %llu nsec\n", | 163 | printk_deferred(KERN_WARNING |
163 | dev->name ? dev->name : "?", | 164 | "CE: %s increased min_delta_ns to %llu nsec\n", |
164 | (unsigned long long) dev->min_delta_ns); | 165 | dev->name ? dev->name : "?", |
166 | (unsigned long long) dev->min_delta_ns); | ||
165 | return 0; | 167 | return 0; |
166 | } | 168 | } |
167 | 169 | ||
diff --git a/kernel/time/sched_clock.c b/kernel/time/sched_clock.c index 445106d2c729..01d2d15aa662 100644 --- a/kernel/time/sched_clock.c +++ b/kernel/time/sched_clock.c | |||
@@ -191,7 +191,8 @@ void __init sched_clock_postinit(void) | |||
191 | 191 | ||
192 | static int sched_clock_suspend(void) | 192 | static int sched_clock_suspend(void) |
193 | { | 193 | { |
194 | sched_clock_poll(&sched_clock_timer); | 194 | update_sched_clock(); |
195 | hrtimer_cancel(&sched_clock_timer); | ||
195 | cd.suspended = true; | 196 | cd.suspended = true; |
196 | return 0; | 197 | return 0; |
197 | } | 198 | } |
@@ -199,6 +200,7 @@ static int sched_clock_suspend(void) | |||
199 | static void sched_clock_resume(void) | 200 | static void sched_clock_resume(void) |
200 | { | 201 | { |
201 | cd.epoch_cyc = read_sched_clock(); | 202 | cd.epoch_cyc = read_sched_clock(); |
203 | hrtimer_start(&sched_clock_timer, cd.wrap_kt, HRTIMER_MODE_REL); | ||
202 | cd.suspended = false; | 204 | cd.suspended = false; |
203 | } | 205 | } |
204 | 206 | ||