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

Changed files
+9 -5
kernel
+6 -4
kernel/time/clockevents.c
··· 146 146 { 147 147 /* Nothing to do if we already reached the limit */ 148 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 151 dev->next_event.tv64 = KTIME_MAX; 151 152 return -ETIME; 152 153 } ··· 160 159 if (dev->min_delta_ns > MIN_DELTA_LIMIT) 161 160 dev->min_delta_ns = MIN_DELTA_LIMIT; 162 161 163 - printk(KERN_WARNING "CE: %s increased min_delta_ns to %llu nsec\n", 164 - dev->name ? dev->name : "?", 165 - (unsigned long long) dev->min_delta_ns); 162 + printk_deferred(KERN_WARNING 163 + "CE: %s increased min_delta_ns to %llu nsec\n", 164 + dev->name ? dev->name : "?", 165 + (unsigned long long) dev->min_delta_ns); 166 166 return 0; 167 167 } 168 168
+3 -1
kernel/time/sched_clock.c
··· 191 191 192 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 196 cd.suspended = true; 196 197 return 0; 197 198 } ··· 200 199 static void sched_clock_resume(void) 201 200 { 202 201 cd.epoch_cyc = read_sched_clock(); 202 + hrtimer_start(&sched_clock_timer, cd.wrap_kt, HRTIMER_MODE_REL); 203 203 cd.suspended = false; 204 204 } 205 205