diff options
Diffstat (limited to 'kernel')
| -rw-r--r-- | kernel/time/Kconfig | 5 | ||||
| -rw-r--r-- | kernel/time/Makefile | 2 | ||||
| -rw-r--r-- | kernel/time/clockevents.c | 3 | ||||
| -rw-r--r-- | kernel/time/tick-broadcast.c | 15 | ||||
| -rw-r--r-- | kernel/time/tick-common.c | 4 |
5 files changed, 16 insertions, 13 deletions
diff --git a/kernel/time/Kconfig b/kernel/time/Kconfig index f66351126544..8d53106a0a92 100644 --- a/kernel/time/Kconfig +++ b/kernel/time/Kconfig | |||
| @@ -23,3 +23,8 @@ config HIGH_RES_TIMERS | |||
| 23 | hardware is not capable then this option only increases | 23 | hardware is not capable then this option only increases |
| 24 | the size of the kernel image. | 24 | the size of the kernel image. |
| 25 | 25 | ||
| 26 | config GENERIC_CLOCKEVENTS_BUILD | ||
| 27 | bool | ||
| 28 | default y | ||
| 29 | depends on GENERIC_CLOCKEVENTS || GENERIC_CLOCKEVENTS_MIGR | ||
| 30 | |||
diff --git a/kernel/time/Makefile b/kernel/time/Makefile index 99b6034fc86b..905b0b50792d 100644 --- a/kernel/time/Makefile +++ b/kernel/time/Makefile | |||
| @@ -1,6 +1,6 @@ | |||
| 1 | obj-y += timekeeping.o ntp.o clocksource.o jiffies.o timer_list.o | 1 | obj-y += timekeeping.o ntp.o clocksource.o jiffies.o timer_list.o |
| 2 | 2 | ||
| 3 | obj-$(CONFIG_GENERIC_CLOCKEVENTS) += clockevents.o | 3 | obj-$(CONFIG_GENERIC_CLOCKEVENTS_BUILD) += clockevents.o |
| 4 | obj-$(CONFIG_GENERIC_CLOCKEVENTS) += tick-common.o | 4 | obj-$(CONFIG_GENERIC_CLOCKEVENTS) += tick-common.o |
| 5 | obj-$(CONFIG_GENERIC_CLOCKEVENTS_BROADCAST) += tick-broadcast.o | 5 | obj-$(CONFIG_GENERIC_CLOCKEVENTS_BROADCAST) += tick-broadcast.o |
| 6 | obj-$(CONFIG_TICK_ONESHOT) += tick-oneshot.o | 6 | obj-$(CONFIG_TICK_ONESHOT) += tick-oneshot.o |
diff --git a/kernel/time/clockevents.c b/kernel/time/clockevents.c index 41dd3105ce7f..822beebe664a 100644 --- a/kernel/time/clockevents.c +++ b/kernel/time/clockevents.c | |||
| @@ -194,6 +194,7 @@ void clockevents_exchange_device(struct clock_event_device *old, | |||
| 194 | local_irq_restore(flags); | 194 | local_irq_restore(flags); |
| 195 | } | 195 | } |
| 196 | 196 | ||
| 197 | #ifdef CONFIG_GENERIC_CLOCKEVENTS | ||
| 197 | /** | 198 | /** |
| 198 | * clockevents_notify - notification about relevant events | 199 | * clockevents_notify - notification about relevant events |
| 199 | */ | 200 | */ |
| @@ -222,4 +223,4 @@ void clockevents_notify(unsigned long reason, void *arg) | |||
| 222 | spin_unlock(&clockevents_lock); | 223 | spin_unlock(&clockevents_lock); |
| 223 | } | 224 | } |
| 224 | EXPORT_SYMBOL_GPL(clockevents_notify); | 225 | EXPORT_SYMBOL_GPL(clockevents_notify); |
| 225 | 226 | #endif | |
diff --git a/kernel/time/tick-broadcast.c b/kernel/time/tick-broadcast.c index 0962e0577660..298bc7c6f09f 100644 --- a/kernel/time/tick-broadcast.c +++ b/kernel/time/tick-broadcast.c | |||
| @@ -64,8 +64,9 @@ static void tick_broadcast_start_periodic(struct clock_event_device *bc) | |||
| 64 | */ | 64 | */ |
| 65 | int tick_check_broadcast_device(struct clock_event_device *dev) | 65 | int tick_check_broadcast_device(struct clock_event_device *dev) |
| 66 | { | 66 | { |
| 67 | if (tick_broadcast_device.evtdev || | 67 | if ((tick_broadcast_device.evtdev && |
| 68 | (dev->features & CLOCK_EVT_FEAT_C3STOP)) | 68 | tick_broadcast_device.evtdev->rating >= dev->rating) || |
| 69 | (dev->features & CLOCK_EVT_FEAT_C3STOP)) | ||
| 69 | return 0; | 70 | return 0; |
| 70 | 71 | ||
| 71 | clockevents_exchange_device(NULL, dev); | 72 | clockevents_exchange_device(NULL, dev); |
| @@ -176,8 +177,6 @@ static void tick_do_periodic_broadcast(void) | |||
| 176 | */ | 177 | */ |
| 177 | static void tick_handle_periodic_broadcast(struct clock_event_device *dev) | 178 | static void tick_handle_periodic_broadcast(struct clock_event_device *dev) |
| 178 | { | 179 | { |
| 179 | dev->next_event.tv64 = KTIME_MAX; | ||
| 180 | |||
| 181 | tick_do_periodic_broadcast(); | 180 | tick_do_periodic_broadcast(); |
| 182 | 181 | ||
| 183 | /* | 182 | /* |
| @@ -515,11 +514,9 @@ static void tick_broadcast_clear_oneshot(int cpu) | |||
| 515 | */ | 514 | */ |
| 516 | void tick_broadcast_setup_oneshot(struct clock_event_device *bc) | 515 | void tick_broadcast_setup_oneshot(struct clock_event_device *bc) |
| 517 | { | 516 | { |
| 518 | if (bc->mode != CLOCK_EVT_MODE_ONESHOT) { | 517 | bc->event_handler = tick_handle_oneshot_broadcast; |
| 519 | bc->event_handler = tick_handle_oneshot_broadcast; | 518 | clockevents_set_mode(bc, CLOCK_EVT_MODE_ONESHOT); |
| 520 | clockevents_set_mode(bc, CLOCK_EVT_MODE_ONESHOT); | 519 | bc->next_event.tv64 = KTIME_MAX; |
| 521 | bc->next_event.tv64 = KTIME_MAX; | ||
| 522 | } | ||
| 523 | } | 520 | } |
| 524 | 521 | ||
| 525 | /* | 522 | /* |
diff --git a/kernel/time/tick-common.c b/kernel/time/tick-common.c index 77a21abc8716..3f3ae3907830 100644 --- a/kernel/time/tick-common.c +++ b/kernel/time/tick-common.c | |||
| @@ -200,7 +200,7 @@ static int tick_check_new_device(struct clock_event_device *newdev) | |||
| 200 | 200 | ||
| 201 | cpu = smp_processor_id(); | 201 | cpu = smp_processor_id(); |
| 202 | if (!cpu_isset(cpu, newdev->cpumask)) | 202 | if (!cpu_isset(cpu, newdev->cpumask)) |
| 203 | goto out; | 203 | goto out_bc; |
| 204 | 204 | ||
| 205 | td = &per_cpu(tick_cpu_device, cpu); | 205 | td = &per_cpu(tick_cpu_device, cpu); |
| 206 | curdev = td->evtdev; | 206 | curdev = td->evtdev; |
| @@ -265,7 +265,7 @@ out_bc: | |||
| 265 | */ | 265 | */ |
| 266 | if (tick_check_broadcast_device(newdev)) | 266 | if (tick_check_broadcast_device(newdev)) |
| 267 | ret = NOTIFY_STOP; | 267 | ret = NOTIFY_STOP; |
| 268 | out: | 268 | |
| 269 | spin_unlock_irqrestore(&tick_device_lock, flags); | 269 | spin_unlock_irqrestore(&tick_device_lock, flags); |
| 270 | 270 | ||
| 271 | return ret; | 271 | return ret; |
