diff options
Diffstat (limited to 'kernel/hrtimer.c')
-rw-r--r-- | kernel/hrtimer.c | 20 |
1 files changed, 14 insertions, 6 deletions
diff --git a/kernel/hrtimer.c b/kernel/hrtimer.c index a2310d1bebe1..e04ef38ea3be 100644 --- a/kernel/hrtimer.c +++ b/kernel/hrtimer.c | |||
@@ -2,8 +2,8 @@ | |||
2 | * linux/kernel/hrtimer.c | 2 | * linux/kernel/hrtimer.c |
3 | * | 3 | * |
4 | * Copyright(C) 2005-2006, Thomas Gleixner <tglx@linutronix.de> | 4 | * Copyright(C) 2005-2006, Thomas Gleixner <tglx@linutronix.de> |
5 | * Copyright(C) 2005-2006, Red Hat, Inc., Ingo Molnar | 5 | * Copyright(C) 2005-2007, Red Hat, Inc., Ingo Molnar |
6 | * Copyright(C) 2006 Timesys Corp., Thomas Gleixner <tglx@timesys.com> | 6 | * Copyright(C) 2006-2007 Timesys Corp., Thomas Gleixner <tglx@timesys.com> |
7 | * | 7 | * |
8 | * High-resolution kernel timers | 8 | * High-resolution kernel timers |
9 | * | 9 | * |
@@ -38,6 +38,7 @@ | |||
38 | #include <linux/notifier.h> | 38 | #include <linux/notifier.h> |
39 | #include <linux/syscalls.h> | 39 | #include <linux/syscalls.h> |
40 | #include <linux/interrupt.h> | 40 | #include <linux/interrupt.h> |
41 | #include <linux/tick.h> | ||
41 | 42 | ||
42 | #include <asm/uaccess.h> | 43 | #include <asm/uaccess.h> |
43 | 44 | ||
@@ -288,7 +289,7 @@ ktime_t ktime_add_ns(const ktime_t kt, u64 nsec) | |||
288 | /* | 289 | /* |
289 | * Divide a ktime value by a nanosecond value | 290 | * Divide a ktime value by a nanosecond value |
290 | */ | 291 | */ |
291 | static unsigned long ktime_divns(const ktime_t kt, s64 div) | 292 | unsigned long ktime_divns(const ktime_t kt, s64 div) |
292 | { | 293 | { |
293 | u64 dclc, inc, dns; | 294 | u64 dclc, inc, dns; |
294 | int sft = 0; | 295 | int sft = 0; |
@@ -305,9 +306,6 @@ static unsigned long ktime_divns(const ktime_t kt, s64 div) | |||
305 | 306 | ||
306 | return (unsigned long) dclc; | 307 | return (unsigned long) dclc; |
307 | } | 308 | } |
308 | |||
309 | #else /* BITS_PER_LONG < 64 */ | ||
310 | # define ktime_divns(kt, div) (unsigned long)((kt).tv64 / (div)) | ||
311 | #endif /* BITS_PER_LONG >= 64 */ | 309 | #endif /* BITS_PER_LONG >= 64 */ |
312 | 310 | ||
313 | /* | 311 | /* |
@@ -682,6 +680,16 @@ void hrtimer_run_queues(void) | |||
682 | struct hrtimer_cpu_base *cpu_base = &__get_cpu_var(hrtimer_bases); | 680 | struct hrtimer_cpu_base *cpu_base = &__get_cpu_var(hrtimer_bases); |
683 | int i; | 681 | int i; |
684 | 682 | ||
683 | /* | ||
684 | * This _is_ ugly: We have to check in the softirq context, | ||
685 | * whether we can switch to highres and / or nohz mode. The | ||
686 | * clocksource switch happens in the timer interrupt with | ||
687 | * xtime_lock held. Notification from there only sets the | ||
688 | * check bit in the tick_oneshot code, otherwise we might | ||
689 | * deadlock vs. xtime_lock. | ||
690 | */ | ||
691 | tick_check_oneshot_change(1); | ||
692 | |||
685 | hrtimer_get_softirq_time(cpu_base); | 693 | hrtimer_get_softirq_time(cpu_base); |
686 | 694 | ||
687 | for (i = 0; i < HRTIMER_MAX_CLOCK_BASES; i++) | 695 | for (i = 0; i < HRTIMER_MAX_CLOCK_BASES; i++) |