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++) |
