diff options
Diffstat (limited to 'kernel/time')
| -rw-r--r-- | kernel/time/Kconfig | 6 | ||||
| -rw-r--r-- | kernel/time/Makefile | 6 | ||||
| -rw-r--r-- | kernel/time/clockevents.c | 229 | ||||
| -rw-r--r-- | kernel/time/clocksource.c | 173 | ||||
| -rw-r--r-- | kernel/time/hrtimer.c | 9 | ||||
| -rw-r--r-- | kernel/time/jiffies.c | 7 | ||||
| -rw-r--r-- | kernel/time/ntp.c | 14 | ||||
| -rw-r--r-- | kernel/time/sched_clock.c | 236 | ||||
| -rw-r--r-- | kernel/time/tick-broadcast-hrtimer.c | 11 | ||||
| -rw-r--r-- | kernel/time/tick-broadcast.c | 179 | ||||
| -rw-r--r-- | kernel/time/tick-common.c | 82 | ||||
| -rw-r--r-- | kernel/time/tick-internal.h | 211 | ||||
| -rw-r--r-- | kernel/time/tick-oneshot.c | 6 | ||||
| -rw-r--r-- | kernel/time/tick-sched.c | 7 | ||||
| -rw-r--r-- | kernel/time/tick-sched.h | 74 | ||||
| -rw-r--r-- | kernel/time/timekeeping.c | 490 | ||||
| -rw-r--r-- | kernel/time/timekeeping.h | 7 | ||||
| -rw-r--r-- | kernel/time/timer.c | 149 | ||||
| -rw-r--r-- | kernel/time/timer_list.c | 34 | 
19 files changed, 1176 insertions, 754 deletions
diff --git a/kernel/time/Kconfig b/kernel/time/Kconfig index d626dc98e8df..579ce1b929af 100644 --- a/kernel/time/Kconfig +++ b/kernel/time/Kconfig  | |||
| @@ -33,12 +33,6 @@ config ARCH_USES_GETTIMEOFFSET | |||
| 33 | config GENERIC_CLOCKEVENTS | 33 | config GENERIC_CLOCKEVENTS | 
| 34 | bool | 34 | bool | 
| 35 | 35 | ||
| 36 | # Migration helper. Builds, but does not invoke | ||
| 37 | config GENERIC_CLOCKEVENTS_BUILD | ||
| 38 | bool | ||
| 39 | default y | ||
| 40 | depends on GENERIC_CLOCKEVENTS | ||
| 41 | |||
| 42 | # Architecture can handle broadcast in a driver-agnostic way | 36 | # Architecture can handle broadcast in a driver-agnostic way | 
| 43 | config ARCH_HAS_TICK_BROADCAST | 37 | config ARCH_HAS_TICK_BROADCAST | 
| 44 | bool | 38 | bool | 
diff --git a/kernel/time/Makefile b/kernel/time/Makefile index c09c07817d7a..01f0312419b3 100644 --- a/kernel/time/Makefile +++ b/kernel/time/Makefile  | |||
| @@ -2,15 +2,13 @@ obj-y += time.o timer.o hrtimer.o itimer.o posix-timers.o posix-cpu-timers.o | |||
| 2 | obj-y += timekeeping.o ntp.o clocksource.o jiffies.o timer_list.o | 2 | obj-y += timekeeping.o ntp.o clocksource.o jiffies.o timer_list.o | 
| 3 | obj-y += timeconv.o timecounter.o posix-clock.o alarmtimer.o | 3 | obj-y += timeconv.o timecounter.o posix-clock.o alarmtimer.o | 
| 4 | 4 | ||
| 5 | obj-$(CONFIG_GENERIC_CLOCKEVENTS_BUILD) += clockevents.o | 5 | obj-$(CONFIG_GENERIC_CLOCKEVENTS) += clockevents.o tick-common.o | 
| 6 | obj-$(CONFIG_GENERIC_CLOCKEVENTS) += tick-common.o | ||
| 7 | ifeq ($(CONFIG_GENERIC_CLOCKEVENTS_BROADCAST),y) | 6 | ifeq ($(CONFIG_GENERIC_CLOCKEVENTS_BROADCAST),y) | 
| 8 | obj-y += tick-broadcast.o | 7 | obj-y += tick-broadcast.o | 
| 9 | obj-$(CONFIG_TICK_ONESHOT) += tick-broadcast-hrtimer.o | 8 | obj-$(CONFIG_TICK_ONESHOT) += tick-broadcast-hrtimer.o | 
| 10 | endif | 9 | endif | 
| 11 | obj-$(CONFIG_GENERIC_SCHED_CLOCK) += sched_clock.o | 10 | obj-$(CONFIG_GENERIC_SCHED_CLOCK) += sched_clock.o | 
| 12 | obj-$(CONFIG_TICK_ONESHOT) += tick-oneshot.o | 11 | obj-$(CONFIG_TICK_ONESHOT) += tick-oneshot.o tick-sched.o | 
| 13 | obj-$(CONFIG_TICK_ONESHOT) += tick-sched.o | ||
| 14 | obj-$(CONFIG_TIMER_STATS) += timer_stats.o | 12 | obj-$(CONFIG_TIMER_STATS) += timer_stats.o | 
| 15 | obj-$(CONFIG_DEBUG_FS) += timekeeping_debug.o | 13 | obj-$(CONFIG_DEBUG_FS) += timekeeping_debug.o | 
| 16 | obj-$(CONFIG_TEST_UDELAY) += test_udelay.o | 14 | obj-$(CONFIG_TEST_UDELAY) += test_udelay.o | 
diff --git a/kernel/time/clockevents.c b/kernel/time/clockevents.c index 55449909f114..25d942d1da27 100644 --- a/kernel/time/clockevents.c +++ b/kernel/time/clockevents.c  | |||
| @@ -94,25 +94,76 @@ u64 clockevent_delta2ns(unsigned long latch, struct clock_event_device *evt) | |||
| 94 | } | 94 | } | 
| 95 | EXPORT_SYMBOL_GPL(clockevent_delta2ns); | 95 | EXPORT_SYMBOL_GPL(clockevent_delta2ns); | 
| 96 | 96 | ||
| 97 | static int __clockevents_set_state(struct clock_event_device *dev, | ||
| 98 | enum clock_event_state state) | ||
| 99 | { | ||
| 100 | /* Transition with legacy set_mode() callback */ | ||
| 101 | if (dev->set_mode) { | ||
| 102 | /* Legacy callback doesn't support new modes */ | ||
| 103 | if (state > CLOCK_EVT_STATE_ONESHOT) | ||
| 104 | return -ENOSYS; | ||
| 105 | /* | ||
| 106 | * 'clock_event_state' and 'clock_event_mode' have 1-to-1 | ||
| 107 | * mapping until *_ONESHOT, and so a simple cast will work. | ||
| 108 | */ | ||
| 109 | dev->set_mode((enum clock_event_mode)state, dev); | ||
| 110 | dev->mode = (enum clock_event_mode)state; | ||
| 111 | return 0; | ||
| 112 | } | ||
| 113 | |||
| 114 | if (dev->features & CLOCK_EVT_FEAT_DUMMY) | ||
| 115 | return 0; | ||
| 116 | |||
| 117 | /* Transition with new state-specific callbacks */ | ||
| 118 | switch (state) { | ||
| 119 | case CLOCK_EVT_STATE_DETACHED: | ||
| 120 | /* | ||
| 121 | * This is an internal state, which is guaranteed to go from | ||
| 122 | * SHUTDOWN to DETACHED. No driver interaction required. | ||
| 123 | */ | ||
| 124 | return 0; | ||
| 125 | |||
| 126 | case CLOCK_EVT_STATE_SHUTDOWN: | ||
| 127 | return dev->set_state_shutdown(dev); | ||
| 128 | |||
| 129 | case CLOCK_EVT_STATE_PERIODIC: | ||
| 130 | /* Core internal bug */ | ||
| 131 | if (!(dev->features & CLOCK_EVT_FEAT_PERIODIC)) | ||
| 132 | return -ENOSYS; | ||
| 133 | return dev->set_state_periodic(dev); | ||
| 134 | |||
| 135 | case CLOCK_EVT_STATE_ONESHOT: | ||
| 136 | /* Core internal bug */ | ||
| 137 | if (!(dev->features & CLOCK_EVT_FEAT_ONESHOT)) | ||
| 138 | return -ENOSYS; | ||
| 139 | return dev->set_state_oneshot(dev); | ||
| 140 | |||
| 141 | default: | ||
| 142 | return -ENOSYS; | ||
| 143 | } | ||
| 144 | } | ||
| 145 | |||
| 97 | /** | 146 | /** | 
| 98 | * clockevents_set_mode - set the operating mode of a clock event device | 147 | * clockevents_set_state - set the operating state of a clock event device | 
| 99 | * @dev: device to modify | 148 | * @dev: device to modify | 
| 100 | * @mode: new mode | 149 | * @state: new state | 
| 101 | * | 150 | * | 
| 102 | * Must be called with interrupts disabled ! | 151 | * Must be called with interrupts disabled ! | 
| 103 | */ | 152 | */ | 
| 104 | void clockevents_set_mode(struct clock_event_device *dev, | 153 | void clockevents_set_state(struct clock_event_device *dev, | 
| 105 | enum clock_event_mode mode) | 154 | enum clock_event_state state) | 
| 106 | { | 155 | { | 
| 107 | if (dev->mode != mode) { | 156 | if (dev->state != state) { | 
| 108 | dev->set_mode(mode, dev); | 157 | if (__clockevents_set_state(dev, state)) | 
| 109 | dev->mode = mode; | 158 | return; | 
| 159 | |||
| 160 | dev->state = state; | ||
| 110 | 161 | ||
| 111 | /* | 162 | /* | 
| 112 | * A nsec2cyc multiplicator of 0 is invalid and we'd crash | 163 | * A nsec2cyc multiplicator of 0 is invalid and we'd crash | 
| 113 | * on it, so fix it up and emit a warning: | 164 | * on it, so fix it up and emit a warning: | 
| 114 | */ | 165 | */ | 
| 115 | if (mode == CLOCK_EVT_MODE_ONESHOT) { | 166 | if (state == CLOCK_EVT_STATE_ONESHOT) { | 
| 116 | if (unlikely(!dev->mult)) { | 167 | if (unlikely(!dev->mult)) { | 
| 117 | dev->mult = 1; | 168 | dev->mult = 1; | 
| 118 | WARN_ON(1); | 169 | WARN_ON(1); | 
| @@ -127,10 +178,28 @@ void clockevents_set_mode(struct clock_event_device *dev, | |||
| 127 | */ | 178 | */ | 
| 128 | void clockevents_shutdown(struct clock_event_device *dev) | 179 | void clockevents_shutdown(struct clock_event_device *dev) | 
| 129 | { | 180 | { | 
| 130 | clockevents_set_mode(dev, CLOCK_EVT_MODE_SHUTDOWN); | 181 | clockevents_set_state(dev, CLOCK_EVT_STATE_SHUTDOWN); | 
| 131 | dev->next_event.tv64 = KTIME_MAX; | 182 | dev->next_event.tv64 = KTIME_MAX; | 
| 132 | } | 183 | } | 
| 133 | 184 | ||
| 185 | /** | ||
| 186 | * clockevents_tick_resume - Resume the tick device before using it again | ||
| 187 | * @dev: device to resume | ||
| 188 | */ | ||
| 189 | int clockevents_tick_resume(struct clock_event_device *dev) | ||
| 190 | { | ||
| 191 | int ret = 0; | ||
| 192 | |||
| 193 | if (dev->set_mode) { | ||
| 194 | dev->set_mode(CLOCK_EVT_MODE_RESUME, dev); | ||
| 195 | dev->mode = CLOCK_EVT_MODE_RESUME; | ||
| 196 | } else if (dev->tick_resume) { | ||
| 197 | ret = dev->tick_resume(dev); | ||
| 198 | } | ||
| 199 | |||
| 200 | return ret; | ||
| 201 | } | ||
| 202 | |||
| 134 | #ifdef CONFIG_GENERIC_CLOCKEVENTS_MIN_ADJUST | 203 | #ifdef CONFIG_GENERIC_CLOCKEVENTS_MIN_ADJUST | 
| 135 | 204 | ||
| 136 | /* Limit min_delta to a jiffie */ | 205 | /* Limit min_delta to a jiffie */ | 
| @@ -183,7 +252,7 @@ static int clockevents_program_min_delta(struct clock_event_device *dev) | |||
| 183 | delta = dev->min_delta_ns; | 252 | delta = dev->min_delta_ns; | 
| 184 | dev->next_event = ktime_add_ns(ktime_get(), delta); | 253 | dev->next_event = ktime_add_ns(ktime_get(), delta); | 
| 185 | 254 | ||
| 186 | if (dev->mode == CLOCK_EVT_MODE_SHUTDOWN) | 255 | if (dev->state == CLOCK_EVT_STATE_SHUTDOWN) | 
| 187 | return 0; | 256 | return 0; | 
| 188 | 257 | ||
| 189 | dev->retries++; | 258 | dev->retries++; | 
| @@ -220,7 +289,7 @@ static int clockevents_program_min_delta(struct clock_event_device *dev) | |||
| 220 | delta = dev->min_delta_ns; | 289 | delta = dev->min_delta_ns; | 
| 221 | dev->next_event = ktime_add_ns(ktime_get(), delta); | 290 | dev->next_event = ktime_add_ns(ktime_get(), delta); | 
| 222 | 291 | ||
| 223 | if (dev->mode == CLOCK_EVT_MODE_SHUTDOWN) | 292 | if (dev->state == CLOCK_EVT_STATE_SHUTDOWN) | 
| 224 | return 0; | 293 | return 0; | 
| 225 | 294 | ||
| 226 | dev->retries++; | 295 | dev->retries++; | 
| @@ -252,7 +321,7 @@ int clockevents_program_event(struct clock_event_device *dev, ktime_t expires, | |||
| 252 | 321 | ||
| 253 | dev->next_event = expires; | 322 | dev->next_event = expires; | 
| 254 | 323 | ||
| 255 | if (dev->mode == CLOCK_EVT_MODE_SHUTDOWN) | 324 | if (dev->state == CLOCK_EVT_STATE_SHUTDOWN) | 
| 256 | return 0; | 325 | return 0; | 
| 257 | 326 | ||
| 258 | /* Shortcut for clockevent devices that can deal with ktime. */ | 327 | /* Shortcut for clockevent devices that can deal with ktime. */ | 
| @@ -297,7 +366,7 @@ static int clockevents_replace(struct clock_event_device *ced) | |||
| 297 | struct clock_event_device *dev, *newdev = NULL; | 366 | struct clock_event_device *dev, *newdev = NULL; | 
| 298 | 367 | ||
| 299 | list_for_each_entry(dev, &clockevent_devices, list) { | 368 | list_for_each_entry(dev, &clockevent_devices, list) { | 
| 300 | if (dev == ced || dev->mode != CLOCK_EVT_MODE_UNUSED) | 369 | if (dev == ced || dev->state != CLOCK_EVT_STATE_DETACHED) | 
| 301 | continue; | 370 | continue; | 
| 302 | 371 | ||
| 303 | if (!tick_check_replacement(newdev, dev)) | 372 | if (!tick_check_replacement(newdev, dev)) | 
| @@ -323,7 +392,7 @@ static int clockevents_replace(struct clock_event_device *ced) | |||
| 323 | static int __clockevents_try_unbind(struct clock_event_device *ced, int cpu) | 392 | static int __clockevents_try_unbind(struct clock_event_device *ced, int cpu) | 
| 324 | { | 393 | { | 
| 325 | /* Fast track. Device is unused */ | 394 | /* Fast track. Device is unused */ | 
| 326 | if (ced->mode == CLOCK_EVT_MODE_UNUSED) { | 395 | if (ced->state == CLOCK_EVT_STATE_DETACHED) { | 
| 327 | list_del_init(&ced->list); | 396 | list_del_init(&ced->list); | 
| 328 | return 0; | 397 | return 0; | 
| 329 | } | 398 | } | 
| @@ -373,6 +442,37 @@ int clockevents_unbind_device(struct clock_event_device *ced, int cpu) | |||
| 373 | } | 442 | } | 
| 374 | EXPORT_SYMBOL_GPL(clockevents_unbind); | 443 | EXPORT_SYMBOL_GPL(clockevents_unbind); | 
| 375 | 444 | ||
| 445 | /* Sanity check of state transition callbacks */ | ||
| 446 | static int clockevents_sanity_check(struct clock_event_device *dev) | ||
| 447 | { | ||
| 448 | /* Legacy set_mode() callback */ | ||
| 449 | if (dev->set_mode) { | ||
| 450 | /* We shouldn't be supporting new modes now */ | ||
| 451 | WARN_ON(dev->set_state_periodic || dev->set_state_oneshot || | ||
| 452 | dev->set_state_shutdown || dev->tick_resume); | ||
| 453 | |||
| 454 | BUG_ON(dev->mode != CLOCK_EVT_MODE_UNUSED); | ||
| 455 | return 0; | ||
| 456 | } | ||
| 457 | |||
| 458 | if (dev->features & CLOCK_EVT_FEAT_DUMMY) | ||
| 459 | return 0; | ||
| 460 | |||
| 461 | /* New state-specific callbacks */ | ||
| 462 | if (!dev->set_state_shutdown) | ||
| 463 | return -EINVAL; | ||
| 464 | |||
| 465 | if ((dev->features & CLOCK_EVT_FEAT_PERIODIC) && | ||
| 466 | !dev->set_state_periodic) | ||
| 467 | return -EINVAL; | ||
| 468 | |||
| 469 | if ((dev->features & CLOCK_EVT_FEAT_ONESHOT) && | ||
| 470 | !dev->set_state_oneshot) | ||
| 471 | return -EINVAL; | ||
| 472 | |||
| 473 | return 0; | ||
| 474 | } | ||
| 475 | |||
| 376 | /** | 476 | /** | 
| 377 | * clockevents_register_device - register a clock event device | 477 | * clockevents_register_device - register a clock event device | 
| 378 | * @dev: device to register | 478 | * @dev: device to register | 
| @@ -381,7 +481,11 @@ void clockevents_register_device(struct clock_event_device *dev) | |||
| 381 | { | 481 | { | 
| 382 | unsigned long flags; | 482 | unsigned long flags; | 
| 383 | 483 | ||
| 384 | BUG_ON(dev->mode != CLOCK_EVT_MODE_UNUSED); | 484 | BUG_ON(clockevents_sanity_check(dev)); | 
| 485 | |||
| 486 | /* Initialize state to DETACHED */ | ||
| 487 | dev->state = CLOCK_EVT_STATE_DETACHED; | ||
| 488 | |||
| 385 | if (!dev->cpumask) { | 489 | if (!dev->cpumask) { | 
| 386 | WARN_ON(num_possible_cpus() > 1); | 490 | WARN_ON(num_possible_cpus() > 1); | 
| 387 | dev->cpumask = cpumask_of(smp_processor_id()); | 491 | dev->cpumask = cpumask_of(smp_processor_id()); | 
| @@ -445,11 +549,11 @@ int __clockevents_update_freq(struct clock_event_device *dev, u32 freq) | |||
| 445 | { | 549 | { | 
| 446 | clockevents_config(dev, freq); | 550 | clockevents_config(dev, freq); | 
| 447 | 551 | ||
| 448 | if (dev->mode == CLOCK_EVT_MODE_ONESHOT) | 552 | if (dev->state == CLOCK_EVT_STATE_ONESHOT) | 
| 449 | return clockevents_program_event(dev, dev->next_event, false); | 553 | return clockevents_program_event(dev, dev->next_event, false); | 
| 450 | 554 | ||
| 451 | if (dev->mode == CLOCK_EVT_MODE_PERIODIC) | 555 | if (dev->state == CLOCK_EVT_STATE_PERIODIC) | 
| 452 | dev->set_mode(CLOCK_EVT_MODE_PERIODIC, dev); | 556 | return __clockevents_set_state(dev, CLOCK_EVT_STATE_PERIODIC); | 
| 453 | 557 | ||
| 454 | return 0; | 558 | return 0; | 
| 455 | } | 559 | } | 
| @@ -491,30 +595,27 @@ void clockevents_handle_noop(struct clock_event_device *dev) | |||
| 491 | * @old: device to release (can be NULL) | 595 | * @old: device to release (can be NULL) | 
| 492 | * @new: device to request (can be NULL) | 596 | * @new: device to request (can be NULL) | 
| 493 | * | 597 | * | 
| 494 | * Called from the notifier chain. clockevents_lock is held already | 598 | * Called from various tick functions with clockevents_lock held and | 
| 599 | * interrupts disabled. | ||
| 495 | */ | 600 | */ | 
| 496 | void clockevents_exchange_device(struct clock_event_device *old, | 601 | void clockevents_exchange_device(struct clock_event_device *old, | 
| 497 | struct clock_event_device *new) | 602 | struct clock_event_device *new) | 
| 498 | { | 603 | { | 
| 499 | unsigned long flags; | ||
| 500 | |||
| 501 | local_irq_save(flags); | ||
| 502 | /* | 604 | /* | 
| 503 | * Caller releases a clock event device. We queue it into the | 605 | * Caller releases a clock event device. We queue it into the | 
| 504 | * released list and do a notify add later. | 606 | * released list and do a notify add later. | 
| 505 | */ | 607 | */ | 
| 506 | if (old) { | 608 | if (old) { | 
| 507 | module_put(old->owner); | 609 | module_put(old->owner); | 
| 508 | clockevents_set_mode(old, CLOCK_EVT_MODE_UNUSED); | 610 | clockevents_set_state(old, CLOCK_EVT_STATE_DETACHED); | 
| 509 | list_del(&old->list); | 611 | list_del(&old->list); | 
| 510 | list_add(&old->list, &clockevents_released); | 612 | list_add(&old->list, &clockevents_released); | 
| 511 | } | 613 | } | 
| 512 | 614 | ||
| 513 | if (new) { | 615 | if (new) { | 
| 514 | BUG_ON(new->mode != CLOCK_EVT_MODE_UNUSED); | 616 | BUG_ON(new->state != CLOCK_EVT_STATE_DETACHED); | 
| 515 | clockevents_shutdown(new); | 617 | clockevents_shutdown(new); | 
| 516 | } | 618 | } | 
| 517 | local_irq_restore(flags); | ||
| 518 | } | 619 | } | 
| 519 | 620 | ||
| 520 | /** | 621 | /** | 
| @@ -541,74 +642,40 @@ void clockevents_resume(void) | |||
| 541 | dev->resume(dev); | 642 | dev->resume(dev); | 
| 542 | } | 643 | } | 
| 543 | 644 | ||
| 544 | #ifdef CONFIG_GENERIC_CLOCKEVENTS | 645 | #ifdef CONFIG_HOTPLUG_CPU | 
| 545 | /** | 646 | /** | 
| 546 | * clockevents_notify - notification about relevant events | 647 | * tick_cleanup_dead_cpu - Cleanup the tick and clockevents of a dead cpu | 
| 547 | * Returns 0 on success, any other value on error | ||
| 548 | */ | 648 | */ | 
| 549 | int clockevents_notify(unsigned long reason, void *arg) | 649 | void tick_cleanup_dead_cpu(int cpu) | 
| 550 | { | 650 | { | 
| 551 | struct clock_event_device *dev, *tmp; | 651 | struct clock_event_device *dev, *tmp; | 
| 552 | unsigned long flags; | 652 | unsigned long flags; | 
| 553 | int cpu, ret = 0; | ||
| 554 | 653 | ||
| 555 | raw_spin_lock_irqsave(&clockevents_lock, flags); | 654 | raw_spin_lock_irqsave(&clockevents_lock, flags); | 
| 556 | 655 | ||
| 557 | switch (reason) { | 656 | tick_shutdown_broadcast_oneshot(cpu); | 
| 558 | case CLOCK_EVT_NOTIFY_BROADCAST_ON: | 657 | tick_shutdown_broadcast(cpu); | 
| 559 | case CLOCK_EVT_NOTIFY_BROADCAST_OFF: | 658 | tick_shutdown(cpu); | 
| 560 | case CLOCK_EVT_NOTIFY_BROADCAST_FORCE: | 659 | /* | 
| 561 | tick_broadcast_on_off(reason, arg); | 660 | * Unregister the clock event devices which were | 
| 562 | break; | 661 | * released from the users in the notify chain. | 
| 563 | 662 | */ | |
| 564 | case CLOCK_EVT_NOTIFY_BROADCAST_ENTER: | 663 | list_for_each_entry_safe(dev, tmp, &clockevents_released, list) | 
| 565 | case CLOCK_EVT_NOTIFY_BROADCAST_EXIT: | 664 | list_del(&dev->list); | 
| 566 | ret = tick_broadcast_oneshot_control(reason); | 665 | /* | 
| 567 | break; | 666 | * Now check whether the CPU has left unused per cpu devices | 
| 568 | 667 | */ | |
| 569 | case CLOCK_EVT_NOTIFY_CPU_DYING: | 668 | list_for_each_entry_safe(dev, tmp, &clockevent_devices, list) { | 
| 570 | tick_handover_do_timer(arg); | 669 | if (cpumask_test_cpu(cpu, dev->cpumask) && | 
| 571 | break; | 670 | cpumask_weight(dev->cpumask) == 1 && | 
| 572 | 671 | !tick_is_broadcast_device(dev)) { | |
| 573 | case CLOCK_EVT_NOTIFY_SUSPEND: | 672 | BUG_ON(dev->state != CLOCK_EVT_STATE_DETACHED); | 
| 574 | tick_suspend(); | ||
| 575 | tick_suspend_broadcast(); | ||
| 576 | break; | ||
| 577 | |||
| 578 | case CLOCK_EVT_NOTIFY_RESUME: | ||
| 579 | tick_resume(); | ||
| 580 | break; | ||
| 581 | |||
| 582 | case CLOCK_EVT_NOTIFY_CPU_DEAD: | ||
| 583 | tick_shutdown_broadcast_oneshot(arg); | ||
| 584 | tick_shutdown_broadcast(arg); | ||
| 585 | tick_shutdown(arg); | ||
| 586 | /* | ||
| 587 | * Unregister the clock event devices which were | ||
| 588 | * released from the users in the notify chain. | ||
| 589 | */ | ||
| 590 | list_for_each_entry_safe(dev, tmp, &clockevents_released, list) | ||
| 591 | list_del(&dev->list); | 673 | list_del(&dev->list); | 
| 592 | /* | ||
| 593 | * Now check whether the CPU has left unused per cpu devices | ||
| 594 | */ | ||
| 595 | cpu = *((int *)arg); | ||
| 596 | list_for_each_entry_safe(dev, tmp, &clockevent_devices, list) { | ||
| 597 | if (cpumask_test_cpu(cpu, dev->cpumask) && | ||
| 598 | cpumask_weight(dev->cpumask) == 1 && | ||
| 599 | !tick_is_broadcast_device(dev)) { | ||
| 600 | BUG_ON(dev->mode != CLOCK_EVT_MODE_UNUSED); | ||
| 601 | list_del(&dev->list); | ||
| 602 | } | ||
| 603 | } | 674 | } | 
| 604 | break; | ||
| 605 | default: | ||
| 606 | break; | ||
| 607 | } | 675 | } | 
| 608 | raw_spin_unlock_irqrestore(&clockevents_lock, flags); | 676 | raw_spin_unlock_irqrestore(&clockevents_lock, flags); | 
| 609 | return ret; | ||
| 610 | } | 677 | } | 
| 611 | EXPORT_SYMBOL_GPL(clockevents_notify); | 678 | #endif | 
| 612 | 679 | ||
| 613 | #ifdef CONFIG_SYSFS | 680 | #ifdef CONFIG_SYSFS | 
| 614 | struct bus_type clockevents_subsys = { | 681 | struct bus_type clockevents_subsys = { | 
| @@ -727,5 +794,3 @@ static int __init clockevents_init_sysfs(void) | |||
| 727 | } | 794 | } | 
| 728 | device_initcall(clockevents_init_sysfs); | 795 | device_initcall(clockevents_init_sysfs); | 
| 729 | #endif /* SYSFS */ | 796 | #endif /* SYSFS */ | 
| 730 | |||
| 731 | #endif /* GENERIC_CLOCK_EVENTS */ | ||
diff --git a/kernel/time/clocksource.c b/kernel/time/clocksource.c index 4892352f0e49..15facb1b9c60 100644 --- a/kernel/time/clocksource.c +++ b/kernel/time/clocksource.c  | |||
| @@ -142,13 +142,6 @@ static void __clocksource_unstable(struct clocksource *cs) | |||
| 142 | schedule_work(&watchdog_work); | 142 | schedule_work(&watchdog_work); | 
| 143 | } | 143 | } | 
| 144 | 144 | ||
| 145 | static void clocksource_unstable(struct clocksource *cs, int64_t delta) | ||
| 146 | { | ||
| 147 | printk(KERN_WARNING "Clocksource %s unstable (delta = %Ld ns)\n", | ||
| 148 | cs->name, delta); | ||
| 149 | __clocksource_unstable(cs); | ||
| 150 | } | ||
| 151 | |||
| 152 | /** | 145 | /** | 
| 153 | * clocksource_mark_unstable - mark clocksource unstable via watchdog | 146 | * clocksource_mark_unstable - mark clocksource unstable via watchdog | 
| 154 | * @cs: clocksource to be marked unstable | 147 | * @cs: clocksource to be marked unstable | 
| @@ -174,7 +167,7 @@ void clocksource_mark_unstable(struct clocksource *cs) | |||
| 174 | static void clocksource_watchdog(unsigned long data) | 167 | static void clocksource_watchdog(unsigned long data) | 
| 175 | { | 168 | { | 
| 176 | struct clocksource *cs; | 169 | struct clocksource *cs; | 
| 177 | cycle_t csnow, wdnow, delta; | 170 | cycle_t csnow, wdnow, cslast, wdlast, delta; | 
| 178 | int64_t wd_nsec, cs_nsec; | 171 | int64_t wd_nsec, cs_nsec; | 
| 179 | int next_cpu, reset_pending; | 172 | int next_cpu, reset_pending; | 
| 180 | 173 | ||
| @@ -213,6 +206,8 @@ static void clocksource_watchdog(unsigned long data) | |||
| 213 | 206 | ||
| 214 | delta = clocksource_delta(csnow, cs->cs_last, cs->mask); | 207 | delta = clocksource_delta(csnow, cs->cs_last, cs->mask); | 
| 215 | cs_nsec = clocksource_cyc2ns(delta, cs->mult, cs->shift); | 208 | cs_nsec = clocksource_cyc2ns(delta, cs->mult, cs->shift); | 
| 209 | wdlast = cs->wd_last; /* save these in case we print them */ | ||
| 210 | cslast = cs->cs_last; | ||
| 216 | cs->cs_last = csnow; | 211 | cs->cs_last = csnow; | 
| 217 | cs->wd_last = wdnow; | 212 | cs->wd_last = wdnow; | 
| 218 | 213 | ||
| @@ -221,7 +216,12 @@ static void clocksource_watchdog(unsigned long data) | |||
| 221 | 216 | ||
| 222 | /* Check the deviation from the watchdog clocksource. */ | 217 | /* Check the deviation from the watchdog clocksource. */ | 
| 223 | if ((abs(cs_nsec - wd_nsec) > WATCHDOG_THRESHOLD)) { | 218 | if ((abs(cs_nsec - wd_nsec) > WATCHDOG_THRESHOLD)) { | 
| 224 | clocksource_unstable(cs, cs_nsec - wd_nsec); | 219 | pr_warn("timekeeping watchdog: Marking clocksource '%s' as unstable, because the skew is too large:\n", cs->name); | 
| 220 | pr_warn(" '%s' wd_now: %llx wd_last: %llx mask: %llx\n", | ||
| 221 | watchdog->name, wdnow, wdlast, watchdog->mask); | ||
| 222 | pr_warn(" '%s' cs_now: %llx cs_last: %llx mask: %llx\n", | ||
| 223 | cs->name, csnow, cslast, cs->mask); | ||
| 224 | __clocksource_unstable(cs); | ||
| 225 | continue; | 225 | continue; | 
| 226 | } | 226 | } | 
| 227 | 227 | ||
| @@ -469,26 +469,25 @@ static u32 clocksource_max_adjustment(struct clocksource *cs) | |||
| 469 | * @shift: cycle to nanosecond divisor (power of two) | 469 | * @shift: cycle to nanosecond divisor (power of two) | 
| 470 | * @maxadj: maximum adjustment value to mult (~11%) | 470 | * @maxadj: maximum adjustment value to mult (~11%) | 
| 471 | * @mask: bitmask for two's complement subtraction of non 64 bit counters | 471 | * @mask: bitmask for two's complement subtraction of non 64 bit counters | 
| 472 | * @max_cyc: maximum cycle value before potential overflow (does not include | ||
| 473 | * any safety margin) | ||
| 474 | * | ||
| 475 | * NOTE: This function includes a safety margin of 50%, in other words, we | ||
| 476 | * return half the number of nanoseconds the hardware counter can technically | ||
| 477 | * cover. This is done so that we can potentially detect problems caused by | ||
| 478 | * delayed timers or bad hardware, which might result in time intervals that | ||
| 479 | * are larger then what the math used can handle without overflows. | ||
| 472 | */ | 480 | */ | 
| 473 | u64 clocks_calc_max_nsecs(u32 mult, u32 shift, u32 maxadj, u64 mask) | 481 | u64 clocks_calc_max_nsecs(u32 mult, u32 shift, u32 maxadj, u64 mask, u64 *max_cyc) | 
| 474 | { | 482 | { | 
| 475 | u64 max_nsecs, max_cycles; | 483 | u64 max_nsecs, max_cycles; | 
| 476 | 484 | ||
| 477 | /* | 485 | /* | 
| 478 | * Calculate the maximum number of cycles that we can pass to the | 486 | * Calculate the maximum number of cycles that we can pass to the | 
| 479 | * cyc2ns function without overflowing a 64-bit signed result. The | 487 | * cyc2ns() function without overflowing a 64-bit result. | 
| 480 | * maximum number of cycles is equal to ULLONG_MAX/(mult+maxadj) | ||
| 481 | * which is equivalent to the below. | ||
| 482 | * max_cycles < (2^63)/(mult + maxadj) | ||
| 483 | * max_cycles < 2^(log2((2^63)/(mult + maxadj))) | ||
| 484 | * max_cycles < 2^(log2(2^63) - log2(mult + maxadj)) | ||
| 485 | * max_cycles < 2^(63 - log2(mult + maxadj)) | ||
| 486 | * max_cycles < 1 << (63 - log2(mult + maxadj)) | ||
| 487 | * Please note that we add 1 to the result of the log2 to account for | ||
| 488 | * any rounding errors, ensure the above inequality is satisfied and | ||
| 489 | * no overflow will occur. | ||
| 490 | */ | 488 | */ | 
| 491 | max_cycles = 1ULL << (63 - (ilog2(mult + maxadj) + 1)); | 489 | max_cycles = ULLONG_MAX; | 
| 490 | do_div(max_cycles, mult+maxadj); | ||
| 492 | 491 | ||
| 493 | /* | 492 | /* | 
| 494 | * The actual maximum number of cycles we can defer the clocksource is | 493 | * The actual maximum number of cycles we can defer the clocksource is | 
| @@ -499,27 +498,26 @@ u64 clocks_calc_max_nsecs(u32 mult, u32 shift, u32 maxadj, u64 mask) | |||
| 499 | max_cycles = min(max_cycles, mask); | 498 | max_cycles = min(max_cycles, mask); | 
| 500 | max_nsecs = clocksource_cyc2ns(max_cycles, mult - maxadj, shift); | 499 | max_nsecs = clocksource_cyc2ns(max_cycles, mult - maxadj, shift); | 
| 501 | 500 | ||
| 501 | /* return the max_cycles value as well if requested */ | ||
| 502 | if (max_cyc) | ||
| 503 | *max_cyc = max_cycles; | ||
| 504 | |||
| 505 | /* Return 50% of the actual maximum, so we can detect bad values */ | ||
| 506 | max_nsecs >>= 1; | ||
| 507 | |||
| 502 | return max_nsecs; | 508 | return max_nsecs; | 
| 503 | } | 509 | } | 
| 504 | 510 | ||
| 505 | /** | 511 | /** | 
| 506 | * clocksource_max_deferment - Returns max time the clocksource can be deferred | 512 | * clocksource_update_max_deferment - Updates the clocksource max_idle_ns & max_cycles | 
| 507 | * @cs: Pointer to clocksource | 513 | * @cs: Pointer to clocksource to be updated | 
| 508 | * | 514 | * | 
| 509 | */ | 515 | */ | 
| 510 | static u64 clocksource_max_deferment(struct clocksource *cs) | 516 | static inline void clocksource_update_max_deferment(struct clocksource *cs) | 
| 511 | { | 517 | { | 
| 512 | u64 max_nsecs; | 518 | cs->max_idle_ns = clocks_calc_max_nsecs(cs->mult, cs->shift, | 
| 513 | 519 | cs->maxadj, cs->mask, | |
| 514 | max_nsecs = clocks_calc_max_nsecs(cs->mult, cs->shift, cs->maxadj, | 520 | &cs->max_cycles); | 
| 515 | cs->mask); | ||
| 516 | /* | ||
| 517 | * To ensure that the clocksource does not wrap whilst we are idle, | ||
| 518 | * limit the time the clocksource can be deferred by 12.5%. Please | ||
| 519 | * note a margin of 12.5% is used because this can be computed with | ||
| 520 | * a shift, versus say 10% which would require division. | ||
| 521 | */ | ||
| 522 | return max_nsecs - (max_nsecs >> 3); | ||
| 523 | } | 521 | } | 
| 524 | 522 | ||
| 525 | #ifndef CONFIG_ARCH_USES_GETTIMEOFFSET | 523 | #ifndef CONFIG_ARCH_USES_GETTIMEOFFSET | 
| @@ -648,7 +646,7 @@ static void clocksource_enqueue(struct clocksource *cs) | |||
| 648 | } | 646 | } | 
| 649 | 647 | ||
| 650 | /** | 648 | /** | 
| 651 | * __clocksource_updatefreq_scale - Used update clocksource with new freq | 649 | * __clocksource_update_freq_scale - Used update clocksource with new freq | 
| 652 | * @cs: clocksource to be registered | 650 | * @cs: clocksource to be registered | 
| 653 | * @scale: Scale factor multiplied against freq to get clocksource hz | 651 | * @scale: Scale factor multiplied against freq to get clocksource hz | 
| 654 | * @freq: clocksource frequency (cycles per second) divided by scale | 652 | * @freq: clocksource frequency (cycles per second) divided by scale | 
| @@ -656,48 +654,64 @@ static void clocksource_enqueue(struct clocksource *cs) | |||
| 656 | * This should only be called from the clocksource->enable() method. | 654 | * This should only be called from the clocksource->enable() method. | 
| 657 | * | 655 | * | 
| 658 | * This *SHOULD NOT* be called directly! Please use the | 656 | * This *SHOULD NOT* be called directly! Please use the | 
| 659 | * clocksource_updatefreq_hz() or clocksource_updatefreq_khz helper functions. | 657 | * __clocksource_update_freq_hz() or __clocksource_update_freq_khz() helper | 
| 658 | * functions. | ||
| 660 | */ | 659 | */ | 
| 661 | void __clocksource_updatefreq_scale(struct clocksource *cs, u32 scale, u32 freq) | 660 | void __clocksource_update_freq_scale(struct clocksource *cs, u32 scale, u32 freq) | 
| 662 | { | 661 | { | 
| 663 | u64 sec; | 662 | u64 sec; | 
| 663 | |||
| 664 | /* | 664 | /* | 
| 665 | * Calc the maximum number of seconds which we can run before | 665 | * Default clocksources are *special* and self-define their mult/shift. | 
| 666 | * wrapping around. For clocksources which have a mask > 32bit | 666 | * But, you're not special, so you should specify a freq value. | 
| 667 | * we need to limit the max sleep time to have a good | ||
| 668 | * conversion precision. 10 minutes is still a reasonable | ||
| 669 | * amount. That results in a shift value of 24 for a | ||
| 670 | * clocksource with mask >= 40bit and f >= 4GHz. That maps to | ||
| 671 | * ~ 0.06ppm granularity for NTP. We apply the same 12.5% | ||
| 672 | * margin as we do in clocksource_max_deferment() | ||
| 673 | */ | 667 | */ | 
| 674 | sec = (cs->mask - (cs->mask >> 3)); | 668 | if (freq) { | 
| 675 | do_div(sec, freq); | 669 | /* | 
| 676 | do_div(sec, scale); | 670 | * Calc the maximum number of seconds which we can run before | 
| 677 | if (!sec) | 671 | * wrapping around. For clocksources which have a mask > 32-bit | 
| 678 | sec = 1; | 672 | * we need to limit the max sleep time to have a good | 
| 679 | else if (sec > 600 && cs->mask > UINT_MAX) | 673 | * conversion precision. 10 minutes is still a reasonable | 
| 680 | sec = 600; | 674 | * amount. That results in a shift value of 24 for a | 
| 681 | 675 | * clocksource with mask >= 40-bit and f >= 4GHz. That maps to | |
| 682 | clocks_calc_mult_shift(&cs->mult, &cs->shift, freq, | 676 | * ~ 0.06ppm granularity for NTP. | 
| 683 | NSEC_PER_SEC / scale, sec * scale); | 677 | */ | 
| 684 | 678 | sec = cs->mask; | |
| 679 | do_div(sec, freq); | ||
| 680 | do_div(sec, scale); | ||
| 681 | if (!sec) | ||
| 682 | sec = 1; | ||
| 683 | else if (sec > 600 && cs->mask > UINT_MAX) | ||
| 684 | sec = 600; | ||
| 685 | |||
| 686 | clocks_calc_mult_shift(&cs->mult, &cs->shift, freq, | ||
| 687 | NSEC_PER_SEC / scale, sec * scale); | ||
| 688 | } | ||
| 685 | /* | 689 | /* | 
| 686 | * for clocksources that have large mults, to avoid overflow. | 690 | * Ensure clocksources that have large 'mult' values don't overflow | 
| 687 | * Since mult may be adjusted by ntp, add an safety extra margin | 691 | * when adjusted. | 
| 688 | * | ||
| 689 | */ | 692 | */ | 
| 690 | cs->maxadj = clocksource_max_adjustment(cs); | 693 | cs->maxadj = clocksource_max_adjustment(cs); | 
| 691 | while ((cs->mult + cs->maxadj < cs->mult) | 694 | while (freq && ((cs->mult + cs->maxadj < cs->mult) | 
| 692 | || (cs->mult - cs->maxadj > cs->mult)) { | 695 | || (cs->mult - cs->maxadj > cs->mult))) { | 
| 693 | cs->mult >>= 1; | 696 | cs->mult >>= 1; | 
| 694 | cs->shift--; | 697 | cs->shift--; | 
| 695 | cs->maxadj = clocksource_max_adjustment(cs); | 698 | cs->maxadj = clocksource_max_adjustment(cs); | 
| 696 | } | 699 | } | 
| 697 | 700 | ||
| 698 | cs->max_idle_ns = clocksource_max_deferment(cs); | 701 | /* | 
| 702 | * Only warn for *special* clocksources that self-define | ||
| 703 | * their mult/shift values and don't specify a freq. | ||
| 704 | */ | ||
| 705 | WARN_ONCE(cs->mult + cs->maxadj < cs->mult, | ||
| 706 | "timekeeping: Clocksource %s might overflow on 11%% adjustment\n", | ||
| 707 | cs->name); | ||
| 708 | |||
| 709 | clocksource_update_max_deferment(cs); | ||
| 710 | |||
| 711 | pr_info("clocksource %s: mask: 0x%llx max_cycles: 0x%llx, max_idle_ns: %lld ns\n", | ||
| 712 | cs->name, cs->mask, cs->max_cycles, cs->max_idle_ns); | ||
| 699 | } | 713 | } | 
| 700 | EXPORT_SYMBOL_GPL(__clocksource_updatefreq_scale); | 714 | EXPORT_SYMBOL_GPL(__clocksource_update_freq_scale); | 
| 701 | 715 | ||
| 702 | /** | 716 | /** | 
| 703 | * __clocksource_register_scale - Used to install new clocksources | 717 | * __clocksource_register_scale - Used to install new clocksources | 
| @@ -714,7 +728,7 @@ int __clocksource_register_scale(struct clocksource *cs, u32 scale, u32 freq) | |||
| 714 | { | 728 | { | 
| 715 | 729 | ||
| 716 | /* Initialize mult/shift and max_idle_ns */ | 730 | /* Initialize mult/shift and max_idle_ns */ | 
| 717 | __clocksource_updatefreq_scale(cs, scale, freq); | 731 | __clocksource_update_freq_scale(cs, scale, freq); | 
| 718 | 732 | ||
| 719 | /* Add clocksource to the clocksource list */ | 733 | /* Add clocksource to the clocksource list */ | 
| 720 | mutex_lock(&clocksource_mutex); | 734 | mutex_lock(&clocksource_mutex); | 
| @@ -726,33 +740,6 @@ int __clocksource_register_scale(struct clocksource *cs, u32 scale, u32 freq) | |||
| 726 | } | 740 | } | 
| 727 | EXPORT_SYMBOL_GPL(__clocksource_register_scale); | 741 | EXPORT_SYMBOL_GPL(__clocksource_register_scale); | 
| 728 | 742 | ||
| 729 | |||
| 730 | /** | ||
| 731 | * clocksource_register - Used to install new clocksources | ||
| 732 | * @cs: clocksource to be registered | ||
| 733 | * | ||
| 734 | * Returns -EBUSY if registration fails, zero otherwise. | ||
| 735 | */ | ||
| 736 | int clocksource_register(struct clocksource *cs) | ||
| 737 | { | ||
| 738 | /* calculate max adjustment for given mult/shift */ | ||
| 739 | cs->maxadj = clocksource_max_adjustment(cs); | ||
| 740 | WARN_ONCE(cs->mult + cs->maxadj < cs->mult, | ||
| 741 | "Clocksource %s might overflow on 11%% adjustment\n", | ||
| 742 | cs->name); | ||
| 743 | |||
| 744 | /* calculate max idle time permitted for this clocksource */ | ||
| 745 | cs->max_idle_ns = clocksource_max_deferment(cs); | ||
| 746 | |||
| 747 | mutex_lock(&clocksource_mutex); | ||
| 748 | clocksource_enqueue(cs); | ||
| 749 | clocksource_enqueue_watchdog(cs); | ||
| 750 | clocksource_select(); | ||
| 751 | mutex_unlock(&clocksource_mutex); | ||
| 752 | return 0; | ||
| 753 | } | ||
| 754 | EXPORT_SYMBOL(clocksource_register); | ||
| 755 | |||
| 756 | static void __clocksource_change_rating(struct clocksource *cs, int rating) | 743 | static void __clocksource_change_rating(struct clocksource *cs, int rating) | 
| 757 | { | 744 | { | 
| 758 | list_del(&cs->list); | 745 | list_del(&cs->list); | 
diff --git a/kernel/time/hrtimer.c b/kernel/time/hrtimer.c index bee0c1f78091..76d4bd962b19 100644 --- a/kernel/time/hrtimer.c +++ b/kernel/time/hrtimer.c  | |||
| @@ -54,7 +54,7 @@ | |||
| 54 | 54 | ||
| 55 | #include <trace/events/timer.h> | 55 | #include <trace/events/timer.h> | 
| 56 | 56 | ||
| 57 | #include "timekeeping.h" | 57 | #include "tick-internal.h" | 
| 58 | 58 | ||
| 59 | /* | 59 | /* | 
| 60 | * The timer bases: | 60 | * The timer bases: | 
| @@ -1707,17 +1707,10 @@ static int hrtimer_cpu_notify(struct notifier_block *self, | |||
| 1707 | break; | 1707 | break; | 
| 1708 | 1708 | ||
| 1709 | #ifdef CONFIG_HOTPLUG_CPU | 1709 | #ifdef CONFIG_HOTPLUG_CPU | 
| 1710 | case CPU_DYING: | ||
| 1711 | case CPU_DYING_FROZEN: | ||
| 1712 | clockevents_notify(CLOCK_EVT_NOTIFY_CPU_DYING, &scpu); | ||
| 1713 | break; | ||
| 1714 | case CPU_DEAD: | 1710 | case CPU_DEAD: | 
| 1715 | case CPU_DEAD_FROZEN: | 1711 | case CPU_DEAD_FROZEN: | 
| 1716 | { | ||
| 1717 | clockevents_notify(CLOCK_EVT_NOTIFY_CPU_DEAD, &scpu); | ||
| 1718 | migrate_hrtimers(scpu); | 1712 | migrate_hrtimers(scpu); | 
| 1719 | break; | 1713 | break; | 
| 1720 | } | ||
| 1721 | #endif | 1714 | #endif | 
| 1722 | 1715 | ||
| 1723 | default: | 1716 | default: | 
diff --git a/kernel/time/jiffies.c b/kernel/time/jiffies.c index a6a5bf53e86d..347fecf86a3f 100644 --- a/kernel/time/jiffies.c +++ b/kernel/time/jiffies.c  | |||
| @@ -25,7 +25,7 @@ | |||
| 25 | #include <linux/module.h> | 25 | #include <linux/module.h> | 
| 26 | #include <linux/init.h> | 26 | #include <linux/init.h> | 
| 27 | 27 | ||
| 28 | #include "tick-internal.h" | 28 | #include "timekeeping.h" | 
| 29 | 29 | ||
| 30 | /* The Jiffies based clocksource is the lowest common | 30 | /* The Jiffies based clocksource is the lowest common | 
| 31 | * denominator clock source which should function on | 31 | * denominator clock source which should function on | 
| @@ -71,6 +71,7 @@ static struct clocksource clocksource_jiffies = { | |||
| 71 | .mask = 0xffffffff, /*32bits*/ | 71 | .mask = 0xffffffff, /*32bits*/ | 
| 72 | .mult = NSEC_PER_JIFFY << JIFFIES_SHIFT, /* details above */ | 72 | .mult = NSEC_PER_JIFFY << JIFFIES_SHIFT, /* details above */ | 
| 73 | .shift = JIFFIES_SHIFT, | 73 | .shift = JIFFIES_SHIFT, | 
| 74 | .max_cycles = 10, | ||
| 74 | }; | 75 | }; | 
| 75 | 76 | ||
| 76 | __cacheline_aligned_in_smp DEFINE_SEQLOCK(jiffies_lock); | 77 | __cacheline_aligned_in_smp DEFINE_SEQLOCK(jiffies_lock); | 
| @@ -94,7 +95,7 @@ EXPORT_SYMBOL(jiffies); | |||
| 94 | 95 | ||
| 95 | static int __init init_jiffies_clocksource(void) | 96 | static int __init init_jiffies_clocksource(void) | 
| 96 | { | 97 | { | 
| 97 | return clocksource_register(&clocksource_jiffies); | 98 | return __clocksource_register(&clocksource_jiffies); | 
| 98 | } | 99 | } | 
| 99 | 100 | ||
| 100 | core_initcall(init_jiffies_clocksource); | 101 | core_initcall(init_jiffies_clocksource); | 
| @@ -130,6 +131,6 @@ int register_refined_jiffies(long cycles_per_second) | |||
| 130 | 131 | ||
| 131 | refined_jiffies.mult = ((u32)nsec_per_tick) << JIFFIES_SHIFT; | 132 | refined_jiffies.mult = ((u32)nsec_per_tick) << JIFFIES_SHIFT; | 
| 132 | 133 | ||
| 133 | clocksource_register(&refined_jiffies); | 134 | __clocksource_register(&refined_jiffies); | 
| 134 | return 0; | 135 | return 0; | 
| 135 | } | 136 | } | 
diff --git a/kernel/time/ntp.c b/kernel/time/ntp.c index 0f60b08a4f07..7a681003001c 100644 --- a/kernel/time/ntp.c +++ b/kernel/time/ntp.c  | |||
| @@ -17,7 +17,6 @@ | |||
| 17 | #include <linux/module.h> | 17 | #include <linux/module.h> | 
| 18 | #include <linux/rtc.h> | 18 | #include <linux/rtc.h> | 
| 19 | 19 | ||
| 20 | #include "tick-internal.h" | ||
| 21 | #include "ntp_internal.h" | 20 | #include "ntp_internal.h" | 
| 22 | 21 | ||
| 23 | /* | 22 | /* | 
| @@ -459,6 +458,16 @@ out: | |||
| 459 | return leap; | 458 | return leap; | 
| 460 | } | 459 | } | 
| 461 | 460 | ||
| 461 | #ifdef CONFIG_GENERIC_CMOS_UPDATE | ||
| 462 | int __weak update_persistent_clock64(struct timespec64 now64) | ||
| 463 | { | ||
| 464 | struct timespec now; | ||
| 465 | |||
| 466 | now = timespec64_to_timespec(now64); | ||
| 467 | return update_persistent_clock(now); | ||
| 468 | } | ||
| 469 | #endif | ||
| 470 | |||
| 462 | #if defined(CONFIG_GENERIC_CMOS_UPDATE) || defined(CONFIG_RTC_SYSTOHC) | 471 | #if defined(CONFIG_GENERIC_CMOS_UPDATE) || defined(CONFIG_RTC_SYSTOHC) | 
| 463 | static void sync_cmos_clock(struct work_struct *work); | 472 | static void sync_cmos_clock(struct work_struct *work); | 
| 464 | 473 | ||
| @@ -494,8 +503,9 @@ static void sync_cmos_clock(struct work_struct *work) | |||
| 494 | if (persistent_clock_is_local) | 503 | if (persistent_clock_is_local) | 
| 495 | adjust.tv_sec -= (sys_tz.tz_minuteswest * 60); | 504 | adjust.tv_sec -= (sys_tz.tz_minuteswest * 60); | 
| 496 | #ifdef CONFIG_GENERIC_CMOS_UPDATE | 505 | #ifdef CONFIG_GENERIC_CMOS_UPDATE | 
| 497 | fail = update_persistent_clock(timespec64_to_timespec(adjust)); | 506 | fail = update_persistent_clock64(adjust); | 
| 498 | #endif | 507 | #endif | 
| 508 | |||
| 499 | #ifdef CONFIG_RTC_SYSTOHC | 509 | #ifdef CONFIG_RTC_SYSTOHC | 
| 500 | if (fail == -ENODEV) | 510 | if (fail == -ENODEV) | 
| 501 | fail = rtc_set_ntp_time(adjust); | 511 | fail = rtc_set_ntp_time(adjust); | 
diff --git a/kernel/time/sched_clock.c b/kernel/time/sched_clock.c index 01d2d15aa662..a26036d37a38 100644 --- a/kernel/time/sched_clock.c +++ b/kernel/time/sched_clock.c  | |||
| @@ -1,5 +1,6 @@ | |||
| 1 | /* | 1 | /* | 
| 2 | * sched_clock.c: support for extending counters to full 64-bit ns counter | 2 | * sched_clock.c: Generic sched_clock() support, to extend low level | 
| 3 | * hardware time counters to full 64-bit ns values. | ||
| 3 | * | 4 | * | 
| 4 | * This program is free software; you can redistribute it and/or modify | 5 | * This program is free software; you can redistribute it and/or modify | 
| 5 | * it under the terms of the GNU General Public License version 2 as | 6 | * it under the terms of the GNU General Public License version 2 as | 
| @@ -18,15 +19,53 @@ | |||
| 18 | #include <linux/seqlock.h> | 19 | #include <linux/seqlock.h> | 
| 19 | #include <linux/bitops.h> | 20 | #include <linux/bitops.h> | 
| 20 | 21 | ||
| 21 | struct clock_data { | 22 | /** | 
| 22 | ktime_t wrap_kt; | 23 | * struct clock_read_data - data required to read from sched_clock() | 
| 24 | * | ||
| 25 | * @epoch_ns: sched_clock() value at last update | ||
| 26 | * @epoch_cyc: Clock cycle value at last update. | ||
| 27 | * @sched_clock_mask: Bitmask for two's complement subtraction of non 64bit | ||
| 28 | * clocks. | ||
| 29 | * @read_sched_clock: Current clock source (or dummy source when suspended). | ||
| 30 | * @mult: Multipler for scaled math conversion. | ||
| 31 | * @shift: Shift value for scaled math conversion. | ||
| 32 | * | ||
| 33 | * Care must be taken when updating this structure; it is read by | ||
| 34 | * some very hot code paths. It occupies <=40 bytes and, when combined | ||
| 35 | * with the seqcount used to synchronize access, comfortably fits into | ||
| 36 | * a 64 byte cache line. | ||
| 37 | */ | ||
| 38 | struct clock_read_data { | ||
| 23 | u64 epoch_ns; | 39 | u64 epoch_ns; | 
| 24 | u64 epoch_cyc; | 40 | u64 epoch_cyc; | 
| 25 | seqcount_t seq; | 41 | u64 sched_clock_mask; | 
| 26 | unsigned long rate; | 42 | u64 (*read_sched_clock)(void); | 
| 27 | u32 mult; | 43 | u32 mult; | 
| 28 | u32 shift; | 44 | u32 shift; | 
| 29 | bool suspended; | 45 | }; | 
| 46 | |||
| 47 | /** | ||
| 48 | * struct clock_data - all data needed for sched_clock() (including | ||
| 49 | * registration of a new clock source) | ||
| 50 | * | ||
| 51 | * @seq: Sequence counter for protecting updates. The lowest | ||
| 52 | * bit is the index for @read_data. | ||
| 53 | * @read_data: Data required to read from sched_clock. | ||
| 54 | * @wrap_kt: Duration for which clock can run before wrapping. | ||
| 55 | * @rate: Tick rate of the registered clock. | ||
| 56 | * @actual_read_sched_clock: Registered hardware level clock read function. | ||
| 57 | * | ||
| 58 | * The ordering of this structure has been chosen to optimize cache | ||
| 59 | * performance. In particular 'seq' and 'read_data[0]' (combined) should fit | ||
| 60 | * into a single 64-byte cache line. | ||
| 61 | */ | ||
| 62 | struct clock_data { | ||
| 63 | seqcount_t seq; | ||
| 64 | struct clock_read_data read_data[2]; | ||
| 65 | ktime_t wrap_kt; | ||
| 66 | unsigned long rate; | ||
| 67 | |||
| 68 | u64 (*actual_read_sched_clock)(void); | ||
| 30 | }; | 69 | }; | 
| 31 | 70 | ||
| 32 | static struct hrtimer sched_clock_timer; | 71 | static struct hrtimer sched_clock_timer; | 
| @@ -34,12 +73,6 @@ static int irqtime = -1; | |||
| 34 | 73 | ||
| 35 | core_param(irqtime, irqtime, int, 0400); | 74 | core_param(irqtime, irqtime, int, 0400); | 
| 36 | 75 | ||
| 37 | static struct clock_data cd = { | ||
| 38 | .mult = NSEC_PER_SEC / HZ, | ||
| 39 | }; | ||
| 40 | |||
| 41 | static u64 __read_mostly sched_clock_mask; | ||
| 42 | |||
| 43 | static u64 notrace jiffy_sched_clock_read(void) | 76 | static u64 notrace jiffy_sched_clock_read(void) | 
| 44 | { | 77 | { | 
| 45 | /* | 78 | /* | 
| @@ -49,7 +82,11 @@ static u64 notrace jiffy_sched_clock_read(void) | |||
| 49 | return (u64)(jiffies - INITIAL_JIFFIES); | 82 | return (u64)(jiffies - INITIAL_JIFFIES); | 
| 50 | } | 83 | } | 
| 51 | 84 | ||
| 52 | static u64 __read_mostly (*read_sched_clock)(void) = jiffy_sched_clock_read; | 85 | static struct clock_data cd ____cacheline_aligned = { | 
| 86 | .read_data[0] = { .mult = NSEC_PER_SEC / HZ, | ||
| 87 | .read_sched_clock = jiffy_sched_clock_read, }, | ||
| 88 | .actual_read_sched_clock = jiffy_sched_clock_read, | ||
| 89 | }; | ||
| 53 | 90 | ||
| 54 | static inline u64 notrace cyc_to_ns(u64 cyc, u32 mult, u32 shift) | 91 | static inline u64 notrace cyc_to_ns(u64 cyc, u32 mult, u32 shift) | 
| 55 | { | 92 | { | 
| @@ -58,111 +95,136 @@ static inline u64 notrace cyc_to_ns(u64 cyc, u32 mult, u32 shift) | |||
| 58 | 95 | ||
| 59 | unsigned long long notrace sched_clock(void) | 96 | unsigned long long notrace sched_clock(void) | 
| 60 | { | 97 | { | 
| 61 | u64 epoch_ns; | 98 | u64 cyc, res; | 
| 62 | u64 epoch_cyc; | ||
| 63 | u64 cyc; | ||
| 64 | unsigned long seq; | 99 | unsigned long seq; | 
| 65 | 100 | struct clock_read_data *rd; | |
| 66 | if (cd.suspended) | ||
| 67 | return cd.epoch_ns; | ||
| 68 | 101 | ||
| 69 | do { | 102 | do { | 
| 70 | seq = raw_read_seqcount_begin(&cd.seq); | 103 | seq = raw_read_seqcount(&cd.seq); | 
| 71 | epoch_cyc = cd.epoch_cyc; | 104 | rd = cd.read_data + (seq & 1); | 
| 72 | epoch_ns = cd.epoch_ns; | 105 | |
| 106 | cyc = (rd->read_sched_clock() - rd->epoch_cyc) & | ||
| 107 | rd->sched_clock_mask; | ||
| 108 | res = rd->epoch_ns + cyc_to_ns(cyc, rd->mult, rd->shift); | ||
| 73 | } while (read_seqcount_retry(&cd.seq, seq)); | 109 | } while (read_seqcount_retry(&cd.seq, seq)); | 
| 74 | 110 | ||
| 75 | cyc = read_sched_clock(); | 111 | return res; | 
| 76 | cyc = (cyc - epoch_cyc) & sched_clock_mask; | 112 | } | 
| 77 | return epoch_ns + cyc_to_ns(cyc, cd.mult, cd.shift); | 113 | |
| 114 | /* | ||
| 115 | * Updating the data required to read the clock. | ||
| 116 | * | ||
| 117 | * sched_clock() will never observe mis-matched data even if called from | ||
| 118 | * an NMI. We do this by maintaining an odd/even copy of the data and | ||
| 119 | * steering sched_clock() to one or the other using a sequence counter. | ||
| 120 | * In order to preserve the data cache profile of sched_clock() as much | ||
| 121 | * as possible the system reverts back to the even copy when the update | ||
| 122 | * completes; the odd copy is used *only* during an update. | ||
| 123 | */ | ||
| 124 | static void update_clock_read_data(struct clock_read_data *rd) | ||
| 125 | { | ||
| 126 | /* update the backup (odd) copy with the new data */ | ||
| 127 | cd.read_data[1] = *rd; | ||
| 128 | |||
| 129 | /* steer readers towards the odd copy */ | ||
| 130 | raw_write_seqcount_latch(&cd.seq); | ||
| 131 | |||
| 132 | /* now its safe for us to update the normal (even) copy */ | ||
| 133 | cd.read_data[0] = *rd; | ||
| 134 | |||
| 135 | /* switch readers back to the even copy */ | ||
| 136 | raw_write_seqcount_latch(&cd.seq); | ||
| 78 | } | 137 | } | 
| 79 | 138 | ||
| 80 | /* | 139 | /* | 
| 81 | * Atomically update the sched_clock epoch. | 140 | * Atomically update the sched_clock() epoch. | 
| 82 | */ | 141 | */ | 
| 83 | static void notrace update_sched_clock(void) | 142 | static void update_sched_clock(void) | 
| 84 | { | 143 | { | 
| 85 | unsigned long flags; | ||
| 86 | u64 cyc; | 144 | u64 cyc; | 
| 87 | u64 ns; | 145 | u64 ns; | 
| 146 | struct clock_read_data rd; | ||
| 147 | |||
| 148 | rd = cd.read_data[0]; | ||
| 149 | |||
| 150 | cyc = cd.actual_read_sched_clock(); | ||
| 151 | ns = rd.epoch_ns + cyc_to_ns((cyc - rd.epoch_cyc) & rd.sched_clock_mask, rd.mult, rd.shift); | ||
| 152 | |||
| 153 | rd.epoch_ns = ns; | ||
| 154 | rd.epoch_cyc = cyc; | ||
| 88 | 155 | ||
| 89 | cyc = read_sched_clock(); | 156 | update_clock_read_data(&rd); | 
| 90 | ns = cd.epoch_ns + | ||
| 91 | cyc_to_ns((cyc - cd.epoch_cyc) & sched_clock_mask, | ||
| 92 | cd.mult, cd.shift); | ||
| 93 | |||
| 94 | raw_local_irq_save(flags); | ||
| 95 | raw_write_seqcount_begin(&cd.seq); | ||
| 96 | cd.epoch_ns = ns; | ||
| 97 | cd.epoch_cyc = cyc; | ||
| 98 | raw_write_seqcount_end(&cd.seq); | ||
| 99 | raw_local_irq_restore(flags); | ||
| 100 | } | 157 | } | 
| 101 | 158 | ||
| 102 | static enum hrtimer_restart sched_clock_poll(struct hrtimer *hrt) | 159 | static enum hrtimer_restart sched_clock_poll(struct hrtimer *hrt) | 
| 103 | { | 160 | { | 
| 104 | update_sched_clock(); | 161 | update_sched_clock(); | 
| 105 | hrtimer_forward_now(hrt, cd.wrap_kt); | 162 | hrtimer_forward_now(hrt, cd.wrap_kt); | 
| 163 | |||
| 106 | return HRTIMER_RESTART; | 164 | return HRTIMER_RESTART; | 
| 107 | } | 165 | } | 
| 108 | 166 | ||
| 109 | void __init sched_clock_register(u64 (*read)(void), int bits, | 167 | void __init | 
| 110 | unsigned long rate) | 168 | sched_clock_register(u64 (*read)(void), int bits, unsigned long rate) | 
| 111 | { | 169 | { | 
| 112 | u64 res, wrap, new_mask, new_epoch, cyc, ns; | 170 | u64 res, wrap, new_mask, new_epoch, cyc, ns; | 
| 113 | u32 new_mult, new_shift; | 171 | u32 new_mult, new_shift; | 
| 114 | ktime_t new_wrap_kt; | ||
| 115 | unsigned long r; | 172 | unsigned long r; | 
| 116 | char r_unit; | 173 | char r_unit; | 
| 174 | struct clock_read_data rd; | ||
| 117 | 175 | ||
| 118 | if (cd.rate > rate) | 176 | if (cd.rate > rate) | 
| 119 | return; | 177 | return; | 
| 120 | 178 | ||
| 121 | WARN_ON(!irqs_disabled()); | 179 | WARN_ON(!irqs_disabled()); | 
| 122 | 180 | ||
| 123 | /* calculate the mult/shift to convert counter ticks to ns. */ | 181 | /* Calculate the mult/shift to convert counter ticks to ns. */ | 
| 124 | clocks_calc_mult_shift(&new_mult, &new_shift, rate, NSEC_PER_SEC, 3600); | 182 | clocks_calc_mult_shift(&new_mult, &new_shift, rate, NSEC_PER_SEC, 3600); | 
| 125 | 183 | ||
| 126 | new_mask = CLOCKSOURCE_MASK(bits); | 184 | new_mask = CLOCKSOURCE_MASK(bits); | 
| 185 | cd.rate = rate; | ||
| 186 | |||
| 187 | /* Calculate how many nanosecs until we risk wrapping */ | ||
| 188 | wrap = clocks_calc_max_nsecs(new_mult, new_shift, 0, new_mask, NULL); | ||
| 189 | cd.wrap_kt = ns_to_ktime(wrap); | ||
| 127 | 190 | ||
| 128 | /* calculate how many ns until we wrap */ | 191 | rd = cd.read_data[0]; | 
| 129 | wrap = clocks_calc_max_nsecs(new_mult, new_shift, 0, new_mask); | ||
| 130 | new_wrap_kt = ns_to_ktime(wrap - (wrap >> 3)); | ||
| 131 | 192 | ||
| 132 | /* update epoch for new counter and update epoch_ns from old counter*/ | 193 | /* Update epoch for new counter and update 'epoch_ns' from old counter*/ | 
| 133 | new_epoch = read(); | 194 | new_epoch = read(); | 
| 134 | cyc = read_sched_clock(); | 195 | cyc = cd.actual_read_sched_clock(); | 
| 135 | ns = cd.epoch_ns + cyc_to_ns((cyc - cd.epoch_cyc) & sched_clock_mask, | 196 | ns = rd.epoch_ns + cyc_to_ns((cyc - rd.epoch_cyc) & rd.sched_clock_mask, rd.mult, rd.shift); | 
| 136 | cd.mult, cd.shift); | 197 | cd.actual_read_sched_clock = read; | 
| 137 | 198 | ||
| 138 | raw_write_seqcount_begin(&cd.seq); | 199 | rd.read_sched_clock = read; | 
| 139 | read_sched_clock = read; | 200 | rd.sched_clock_mask = new_mask; | 
| 140 | sched_clock_mask = new_mask; | 201 | rd.mult = new_mult; | 
| 141 | cd.rate = rate; | 202 | rd.shift = new_shift; | 
| 142 | cd.wrap_kt = new_wrap_kt; | 203 | rd.epoch_cyc = new_epoch; | 
| 143 | cd.mult = new_mult; | 204 | rd.epoch_ns = ns; | 
| 144 | cd.shift = new_shift; | 205 | |
| 145 | cd.epoch_cyc = new_epoch; | 206 | update_clock_read_data(&rd); | 
| 146 | cd.epoch_ns = ns; | ||
| 147 | raw_write_seqcount_end(&cd.seq); | ||
| 148 | 207 | ||
| 149 | r = rate; | 208 | r = rate; | 
| 150 | if (r >= 4000000) { | 209 | if (r >= 4000000) { | 
| 151 | r /= 1000000; | 210 | r /= 1000000; | 
| 152 | r_unit = 'M'; | 211 | r_unit = 'M'; | 
| 153 | } else if (r >= 1000) { | 212 | } else { | 
| 154 | r /= 1000; | 213 | if (r >= 1000) { | 
| 155 | r_unit = 'k'; | 214 | r /= 1000; | 
| 156 | } else | 215 | r_unit = 'k'; | 
| 157 | r_unit = ' '; | 216 | } else { | 
| 158 | 217 | r_unit = ' '; | |
| 159 | /* calculate the ns resolution of this counter */ | 218 | } | 
| 219 | } | ||
| 220 | |||
| 221 | /* Calculate the ns resolution of this counter */ | ||
| 160 | res = cyc_to_ns(1ULL, new_mult, new_shift); | 222 | res = cyc_to_ns(1ULL, new_mult, new_shift); | 
| 161 | 223 | ||
| 162 | pr_info("sched_clock: %u bits at %lu%cHz, resolution %lluns, wraps every %lluns\n", | 224 | pr_info("sched_clock: %u bits at %lu%cHz, resolution %lluns, wraps every %lluns\n", | 
| 163 | bits, r, r_unit, res, wrap); | 225 | bits, r, r_unit, res, wrap); | 
| 164 | 226 | ||
| 165 | /* Enable IRQ time accounting if we have a fast enough sched_clock */ | 227 | /* Enable IRQ time accounting if we have a fast enough sched_clock() */ | 
| 166 | if (irqtime > 0 || (irqtime == -1 && rate >= 1000000)) | 228 | if (irqtime > 0 || (irqtime == -1 && rate >= 1000000)) | 
| 167 | enable_sched_clock_irqtime(); | 229 | enable_sched_clock_irqtime(); | 
| 168 | 230 | ||
| @@ -172,10 +234,10 @@ void __init sched_clock_register(u64 (*read)(void), int bits, | |||
| 172 | void __init sched_clock_postinit(void) | 234 | void __init sched_clock_postinit(void) | 
| 173 | { | 235 | { | 
| 174 | /* | 236 | /* | 
| 175 | * If no sched_clock function has been provided at that point, | 237 | * If no sched_clock() function has been provided at that point, | 
| 176 | * make it the final one one. | 238 | * make it the final one one. | 
| 177 | */ | 239 | */ | 
| 178 | if (read_sched_clock == jiffy_sched_clock_read) | 240 | if (cd.actual_read_sched_clock == jiffy_sched_clock_read) | 
| 179 | sched_clock_register(jiffy_sched_clock_read, BITS_PER_LONG, HZ); | 241 | sched_clock_register(jiffy_sched_clock_read, BITS_PER_LONG, HZ); | 
| 180 | 242 | ||
| 181 | update_sched_clock(); | 243 | update_sched_clock(); | 
| @@ -189,29 +251,53 @@ void __init sched_clock_postinit(void) | |||
| 189 | hrtimer_start(&sched_clock_timer, cd.wrap_kt, HRTIMER_MODE_REL); | 251 | hrtimer_start(&sched_clock_timer, cd.wrap_kt, HRTIMER_MODE_REL); | 
| 190 | } | 252 | } | 
| 191 | 253 | ||
| 254 | /* | ||
| 255 | * Clock read function for use when the clock is suspended. | ||
| 256 | * | ||
| 257 | * This function makes it appear to sched_clock() as if the clock | ||
| 258 | * stopped counting at its last update. | ||
| 259 | * | ||
| 260 | * This function must only be called from the critical | ||
| 261 | * section in sched_clock(). It relies on the read_seqcount_retry() | ||
| 262 | * at the end of the critical section to be sure we observe the | ||
| 263 | * correct copy of 'epoch_cyc'. | ||
| 264 | */ | ||
| 265 | static u64 notrace suspended_sched_clock_read(void) | ||
| 266 | { | ||
| 267 | unsigned long seq = raw_read_seqcount(&cd.seq); | ||
| 268 | |||
| 269 | return cd.read_data[seq & 1].epoch_cyc; | ||
| 270 | } | ||
| 271 | |||
| 192 | static int sched_clock_suspend(void) | 272 | static int sched_clock_suspend(void) | 
| 193 | { | 273 | { | 
| 274 | struct clock_read_data *rd = &cd.read_data[0]; | ||
| 275 | |||
| 194 | update_sched_clock(); | 276 | update_sched_clock(); | 
| 195 | hrtimer_cancel(&sched_clock_timer); | 277 | hrtimer_cancel(&sched_clock_timer); | 
| 196 | cd.suspended = true; | 278 | rd->read_sched_clock = suspended_sched_clock_read; | 
| 279 | |||
| 197 | return 0; | 280 | return 0; | 
| 198 | } | 281 | } | 
| 199 | 282 | ||
| 200 | static void sched_clock_resume(void) | 283 | static void sched_clock_resume(void) | 
| 201 | { | 284 | { | 
| 202 | cd.epoch_cyc = read_sched_clock(); | 285 | struct clock_read_data *rd = &cd.read_data[0]; | 
| 286 | |||
| 287 | rd->epoch_cyc = cd.actual_read_sched_clock(); | ||
| 203 | hrtimer_start(&sched_clock_timer, cd.wrap_kt, HRTIMER_MODE_REL); | 288 | hrtimer_start(&sched_clock_timer, cd.wrap_kt, HRTIMER_MODE_REL); | 
| 204 | cd.suspended = false; | 289 | rd->read_sched_clock = cd.actual_read_sched_clock; | 
| 205 | } | 290 | } | 
| 206 | 291 | ||
| 207 | static struct syscore_ops sched_clock_ops = { | 292 | static struct syscore_ops sched_clock_ops = { | 
| 208 | .suspend = sched_clock_suspend, | 293 | .suspend = sched_clock_suspend, | 
| 209 | .resume = sched_clock_resume, | 294 | .resume = sched_clock_resume, | 
| 210 | }; | 295 | }; | 
| 211 | 296 | ||
| 212 | static int __init sched_clock_syscore_init(void) | 297 | static int __init sched_clock_syscore_init(void) | 
| 213 | { | 298 | { | 
| 214 | register_syscore_ops(&sched_clock_ops); | 299 | register_syscore_ops(&sched_clock_ops); | 
| 300 | |||
| 215 | return 0; | 301 | return 0; | 
| 216 | } | 302 | } | 
| 217 | device_initcall(sched_clock_syscore_init); | 303 | device_initcall(sched_clock_syscore_init); | 
diff --git a/kernel/time/tick-broadcast-hrtimer.c b/kernel/time/tick-broadcast-hrtimer.c index eb682d5c697c..6aac4beedbbe 100644 --- a/kernel/time/tick-broadcast-hrtimer.c +++ b/kernel/time/tick-broadcast-hrtimer.c  | |||
| @@ -49,6 +49,7 @@ static void bc_set_mode(enum clock_event_mode mode, | |||
| 49 | */ | 49 | */ | 
| 50 | static int bc_set_next(ktime_t expires, struct clock_event_device *bc) | 50 | static int bc_set_next(ktime_t expires, struct clock_event_device *bc) | 
| 51 | { | 51 | { | 
| 52 | int bc_moved; | ||
| 52 | /* | 53 | /* | 
| 53 | * We try to cancel the timer first. If the callback is on | 54 | * We try to cancel the timer first. If the callback is on | 
| 54 | * flight on some other cpu then we let it handle it. If we | 55 | * flight on some other cpu then we let it handle it. If we | 
| @@ -60,9 +61,15 @@ static int bc_set_next(ktime_t expires, struct clock_event_device *bc) | |||
| 60 | * restart the timer because we are in the callback, but we | 61 | * restart the timer because we are in the callback, but we | 
| 61 | * can set the expiry time and let the callback return | 62 | * can set the expiry time and let the callback return | 
| 62 | * HRTIMER_RESTART. | 63 | * HRTIMER_RESTART. | 
| 64 | * | ||
| 65 | * Since we are in the idle loop at this point and because | ||
| 66 | * hrtimer_{start/cancel} functions call into tracing, | ||
| 67 | * calls to these functions must be bound within RCU_NONIDLE. | ||
| 63 | */ | 68 | */ | 
| 64 | if (hrtimer_try_to_cancel(&bctimer) >= 0) { | 69 | RCU_NONIDLE(bc_moved = (hrtimer_try_to_cancel(&bctimer) >= 0) ? | 
| 65 | hrtimer_start(&bctimer, expires, HRTIMER_MODE_ABS_PINNED); | 70 | !hrtimer_start(&bctimer, expires, HRTIMER_MODE_ABS_PINNED) : | 
| 71 | 0); | ||
| 72 | if (bc_moved) { | ||
| 66 | /* Bind the "device" to the cpu */ | 73 | /* Bind the "device" to the cpu */ | 
| 67 | bc->bound_on = smp_processor_id(); | 74 | bc->bound_on = smp_processor_id(); | 
| 68 | } else if (bc->bound_on == smp_processor_id()) { | 75 | } else if (bc->bound_on == smp_processor_id()) { | 
diff --git a/kernel/time/tick-broadcast.c b/kernel/time/tick-broadcast.c index 066f0ec05e48..7e8ca4f448a8 100644 --- a/kernel/time/tick-broadcast.c +++ b/kernel/time/tick-broadcast.c  | |||
| @@ -33,12 +33,14 @@ static cpumask_var_t tick_broadcast_mask; | |||
| 33 | static cpumask_var_t tick_broadcast_on; | 33 | static cpumask_var_t tick_broadcast_on; | 
| 34 | static cpumask_var_t tmpmask; | 34 | static cpumask_var_t tmpmask; | 
| 35 | static DEFINE_RAW_SPINLOCK(tick_broadcast_lock); | 35 | static DEFINE_RAW_SPINLOCK(tick_broadcast_lock); | 
| 36 | static int tick_broadcast_force; | 36 | static int tick_broadcast_forced; | 
| 37 | 37 | ||
| 38 | #ifdef CONFIG_TICK_ONESHOT | 38 | #ifdef CONFIG_TICK_ONESHOT | 
| 39 | static void tick_broadcast_clear_oneshot(int cpu); | 39 | static void tick_broadcast_clear_oneshot(int cpu); | 
| 40 | static void tick_resume_broadcast_oneshot(struct clock_event_device *bc); | ||
| 40 | #else | 41 | #else | 
| 41 | static inline void tick_broadcast_clear_oneshot(int cpu) { } | 42 | static inline void tick_broadcast_clear_oneshot(int cpu) { } | 
| 43 | static inline void tick_resume_broadcast_oneshot(struct clock_event_device *bc) { } | ||
| 42 | #endif | 44 | #endif | 
| 43 | 45 | ||
| 44 | /* | 46 | /* | 
| @@ -303,7 +305,7 @@ static void tick_handle_periodic_broadcast(struct clock_event_device *dev) | |||
| 303 | /* | 305 | /* | 
| 304 | * The device is in periodic mode. No reprogramming necessary: | 306 | * The device is in periodic mode. No reprogramming necessary: | 
| 305 | */ | 307 | */ | 
| 306 | if (dev->mode == CLOCK_EVT_MODE_PERIODIC) | 308 | if (dev->state == CLOCK_EVT_STATE_PERIODIC) | 
| 307 | goto unlock; | 309 | goto unlock; | 
| 308 | 310 | ||
| 309 | /* | 311 | /* | 
| @@ -324,49 +326,54 @@ unlock: | |||
| 324 | raw_spin_unlock(&tick_broadcast_lock); | 326 | raw_spin_unlock(&tick_broadcast_lock); | 
| 325 | } | 327 | } | 
| 326 | 328 | ||
| 327 | /* | 329 | /** | 
| 328 | * Powerstate information: The system enters/leaves a state, where | 330 | * tick_broadcast_control - Enable/disable or force broadcast mode | 
| 329 | * affected devices might stop | 331 | * @mode: The selected broadcast mode | 
| 332 | * | ||
| 333 | * Called when the system enters a state where affected tick devices | ||
| 334 | * might stop. Note: TICK_BROADCAST_FORCE cannot be undone. | ||
| 335 | * | ||
| 336 | * Called with interrupts disabled, so clockevents_lock is not | ||
| 337 | * required here because the local clock event device cannot go away | ||
| 338 | * under us. | ||
| 330 | */ | 339 | */ | 
| 331 | static void tick_do_broadcast_on_off(unsigned long *reason) | 340 | void tick_broadcast_control(enum tick_broadcast_mode mode) | 
| 332 | { | 341 | { | 
| 333 | struct clock_event_device *bc, *dev; | 342 | struct clock_event_device *bc, *dev; | 
| 334 | struct tick_device *td; | 343 | struct tick_device *td; | 
| 335 | unsigned long flags; | ||
| 336 | int cpu, bc_stopped; | 344 | int cpu, bc_stopped; | 
| 337 | 345 | ||
| 338 | raw_spin_lock_irqsave(&tick_broadcast_lock, flags); | 346 | td = this_cpu_ptr(&tick_cpu_device); | 
| 339 | |||
| 340 | cpu = smp_processor_id(); | ||
| 341 | td = &per_cpu(tick_cpu_device, cpu); | ||
| 342 | dev = td->evtdev; | 347 | dev = td->evtdev; | 
| 343 | bc = tick_broadcast_device.evtdev; | ||
| 344 | 348 | ||
| 345 | /* | 349 | /* | 
| 346 | * Is the device not affected by the powerstate ? | 350 | * Is the device not affected by the powerstate ? | 
| 347 | */ | 351 | */ | 
| 348 | if (!dev || !(dev->features & CLOCK_EVT_FEAT_C3STOP)) | 352 | if (!dev || !(dev->features & CLOCK_EVT_FEAT_C3STOP)) | 
| 349 | goto out; | 353 | return; | 
| 350 | 354 | ||
| 351 | if (!tick_device_is_functional(dev)) | 355 | if (!tick_device_is_functional(dev)) | 
| 352 | goto out; | 356 | return; | 
| 353 | 357 | ||
| 358 | raw_spin_lock(&tick_broadcast_lock); | ||
| 359 | cpu = smp_processor_id(); | ||
| 360 | bc = tick_broadcast_device.evtdev; | ||
| 354 | bc_stopped = cpumask_empty(tick_broadcast_mask); | 361 | bc_stopped = cpumask_empty(tick_broadcast_mask); | 
| 355 | 362 | ||
| 356 | switch (*reason) { | 363 | switch (mode) { | 
| 357 | case CLOCK_EVT_NOTIFY_BROADCAST_ON: | 364 | case TICK_BROADCAST_FORCE: | 
| 358 | case CLOCK_EVT_NOTIFY_BROADCAST_FORCE: | 365 | tick_broadcast_forced = 1; | 
| 366 | case TICK_BROADCAST_ON: | ||
| 359 | cpumask_set_cpu(cpu, tick_broadcast_on); | 367 | cpumask_set_cpu(cpu, tick_broadcast_on); | 
| 360 | if (!cpumask_test_and_set_cpu(cpu, tick_broadcast_mask)) { | 368 | if (!cpumask_test_and_set_cpu(cpu, tick_broadcast_mask)) { | 
| 361 | if (tick_broadcast_device.mode == | 369 | if (tick_broadcast_device.mode == | 
| 362 | TICKDEV_MODE_PERIODIC) | 370 | TICKDEV_MODE_PERIODIC) | 
| 363 | clockevents_shutdown(dev); | 371 | clockevents_shutdown(dev); | 
| 364 | } | 372 | } | 
| 365 | if (*reason == CLOCK_EVT_NOTIFY_BROADCAST_FORCE) | ||
| 366 | tick_broadcast_force = 1; | ||
| 367 | break; | 373 | break; | 
| 368 | case CLOCK_EVT_NOTIFY_BROADCAST_OFF: | 374 | |
| 369 | if (tick_broadcast_force) | 375 | case TICK_BROADCAST_OFF: | 
| 376 | if (tick_broadcast_forced) | ||
| 370 | break; | 377 | break; | 
| 371 | cpumask_clear_cpu(cpu, tick_broadcast_on); | 378 | cpumask_clear_cpu(cpu, tick_broadcast_on); | 
| 372 | if (!tick_device_is_functional(dev)) | 379 | if (!tick_device_is_functional(dev)) | 
| @@ -388,22 +395,9 @@ static void tick_do_broadcast_on_off(unsigned long *reason) | |||
| 388 | else | 395 | else | 
| 389 | tick_broadcast_setup_oneshot(bc); | 396 | tick_broadcast_setup_oneshot(bc); | 
| 390 | } | 397 | } | 
| 391 | out: | 398 | raw_spin_unlock(&tick_broadcast_lock); | 
| 392 | raw_spin_unlock_irqrestore(&tick_broadcast_lock, flags); | ||
| 393 | } | ||
| 394 | |||
| 395 | /* | ||
| 396 | * Powerstate information: The system enters/leaves a state, where | ||
| 397 | * affected devices might stop. | ||
| 398 | */ | ||
| 399 | void tick_broadcast_on_off(unsigned long reason, int *oncpu) | ||
| 400 | { | ||
| 401 | if (!cpumask_test_cpu(*oncpu, cpu_online_mask)) | ||
| 402 | printk(KERN_ERR "tick-broadcast: ignoring broadcast for " | ||
| 403 | "offline CPU #%d\n", *oncpu); | ||
| 404 | else | ||
| 405 | tick_do_broadcast_on_off(&reason); | ||
| 406 | } | 399 | } | 
| 400 | EXPORT_SYMBOL_GPL(tick_broadcast_control); | ||
| 407 | 401 | ||
| 408 | /* | 402 | /* | 
| 409 | * Set the periodic handler depending on broadcast on/off | 403 | * Set the periodic handler depending on broadcast on/off | 
| @@ -416,14 +410,14 @@ void tick_set_periodic_handler(struct clock_event_device *dev, int broadcast) | |||
| 416 | dev->event_handler = tick_handle_periodic_broadcast; | 410 | dev->event_handler = tick_handle_periodic_broadcast; | 
| 417 | } | 411 | } | 
| 418 | 412 | ||
| 413 | #ifdef CONFIG_HOTPLUG_CPU | ||
| 419 | /* | 414 | /* | 
| 420 | * Remove a CPU from broadcasting | 415 | * Remove a CPU from broadcasting | 
| 421 | */ | 416 | */ | 
| 422 | void tick_shutdown_broadcast(unsigned int *cpup) | 417 | void tick_shutdown_broadcast(unsigned int cpu) | 
| 423 | { | 418 | { | 
| 424 | struct clock_event_device *bc; | 419 | struct clock_event_device *bc; | 
| 425 | unsigned long flags; | 420 | unsigned long flags; | 
| 426 | unsigned int cpu = *cpup; | ||
| 427 | 421 | ||
| 428 | raw_spin_lock_irqsave(&tick_broadcast_lock, flags); | 422 | raw_spin_lock_irqsave(&tick_broadcast_lock, flags); | 
| 429 | 423 | ||
| @@ -438,6 +432,7 @@ void tick_shutdown_broadcast(unsigned int *cpup) | |||
| 438 | 432 | ||
| 439 | raw_spin_unlock_irqrestore(&tick_broadcast_lock, flags); | 433 | raw_spin_unlock_irqrestore(&tick_broadcast_lock, flags); | 
| 440 | } | 434 | } | 
| 435 | #endif | ||
| 441 | 436 | ||
| 442 | void tick_suspend_broadcast(void) | 437 | void tick_suspend_broadcast(void) | 
| 443 | { | 438 | { | 
| @@ -453,38 +448,48 @@ void tick_suspend_broadcast(void) | |||
| 453 | raw_spin_unlock_irqrestore(&tick_broadcast_lock, flags); | 448 | raw_spin_unlock_irqrestore(&tick_broadcast_lock, flags); | 
| 454 | } | 449 | } | 
| 455 | 450 | ||
| 456 | int tick_resume_broadcast(void) | 451 | /* | 
| 452 | * This is called from tick_resume_local() on a resuming CPU. That's | ||
| 453 | * called from the core resume function, tick_unfreeze() and the magic XEN | ||
| 454 | * resume hackery. | ||
| 455 | * | ||
| 456 | * In none of these cases the broadcast device mode can change and the | ||
| 457 | * bit of the resuming CPU in the broadcast mask is safe as well. | ||
| 458 | */ | ||
| 459 | bool tick_resume_check_broadcast(void) | ||
| 460 | { | ||
| 461 | if (tick_broadcast_device.mode == TICKDEV_MODE_ONESHOT) | ||
| 462 | return false; | ||
| 463 | else | ||
| 464 | return cpumask_test_cpu(smp_processor_id(), tick_broadcast_mask); | ||
| 465 | } | ||
| 466 | |||
| 467 | void tick_resume_broadcast(void) | ||
| 457 | { | 468 | { | 
| 458 | struct clock_event_device *bc; | 469 | struct clock_event_device *bc; | 
| 459 | unsigned long flags; | 470 | unsigned long flags; | 
| 460 | int broadcast = 0; | ||
| 461 | 471 | ||
| 462 | raw_spin_lock_irqsave(&tick_broadcast_lock, flags); | 472 | raw_spin_lock_irqsave(&tick_broadcast_lock, flags); | 
| 463 | 473 | ||
| 464 | bc = tick_broadcast_device.evtdev; | 474 | bc = tick_broadcast_device.evtdev; | 
| 465 | 475 | ||
| 466 | if (bc) { | 476 | if (bc) { | 
| 467 | clockevents_set_mode(bc, CLOCK_EVT_MODE_RESUME); | 477 | clockevents_tick_resume(bc); | 
| 468 | 478 | ||
| 469 | switch (tick_broadcast_device.mode) { | 479 | switch (tick_broadcast_device.mode) { | 
| 470 | case TICKDEV_MODE_PERIODIC: | 480 | case TICKDEV_MODE_PERIODIC: | 
| 471 | if (!cpumask_empty(tick_broadcast_mask)) | 481 | if (!cpumask_empty(tick_broadcast_mask)) | 
| 472 | tick_broadcast_start_periodic(bc); | 482 | tick_broadcast_start_periodic(bc); | 
| 473 | broadcast = cpumask_test_cpu(smp_processor_id(), | ||
| 474 | tick_broadcast_mask); | ||
| 475 | break; | 483 | break; | 
| 476 | case TICKDEV_MODE_ONESHOT: | 484 | case TICKDEV_MODE_ONESHOT: | 
| 477 | if (!cpumask_empty(tick_broadcast_mask)) | 485 | if (!cpumask_empty(tick_broadcast_mask)) | 
| 478 | broadcast = tick_resume_broadcast_oneshot(bc); | 486 | tick_resume_broadcast_oneshot(bc); | 
| 479 | break; | 487 | break; | 
| 480 | } | 488 | } | 
| 481 | } | 489 | } | 
| 482 | raw_spin_unlock_irqrestore(&tick_broadcast_lock, flags); | 490 | raw_spin_unlock_irqrestore(&tick_broadcast_lock, flags); | 
| 483 | |||
| 484 | return broadcast; | ||
| 485 | } | 491 | } | 
| 486 | 492 | ||
| 487 | |||
| 488 | #ifdef CONFIG_TICK_ONESHOT | 493 | #ifdef CONFIG_TICK_ONESHOT | 
| 489 | 494 | ||
| 490 | static cpumask_var_t tick_broadcast_oneshot_mask; | 495 | static cpumask_var_t tick_broadcast_oneshot_mask; | 
| @@ -532,8 +537,8 @@ static int tick_broadcast_set_event(struct clock_event_device *bc, int cpu, | |||
| 532 | { | 537 | { | 
| 533 | int ret; | 538 | int ret; | 
| 534 | 539 | ||
| 535 | if (bc->mode != CLOCK_EVT_MODE_ONESHOT) | 540 | if (bc->state != CLOCK_EVT_STATE_ONESHOT) | 
| 536 | clockevents_set_mode(bc, CLOCK_EVT_MODE_ONESHOT); | 541 | clockevents_set_state(bc, CLOCK_EVT_STATE_ONESHOT); | 
| 537 | 542 | ||
| 538 | ret = clockevents_program_event(bc, expires, force); | 543 | ret = clockevents_program_event(bc, expires, force); | 
| 539 | if (!ret) | 544 | if (!ret) | 
| @@ -541,10 +546,9 @@ static int tick_broadcast_set_event(struct clock_event_device *bc, int cpu, | |||
| 541 | return ret; | 546 | return ret; | 
| 542 | } | 547 | } | 
| 543 | 548 | ||
| 544 | int tick_resume_broadcast_oneshot(struct clock_event_device *bc) | 549 | static void tick_resume_broadcast_oneshot(struct clock_event_device *bc) | 
| 545 | { | 550 | { | 
| 546 | clockevents_set_mode(bc, CLOCK_EVT_MODE_ONESHOT); | 551 | clockevents_set_state(bc, CLOCK_EVT_STATE_ONESHOT); | 
| 547 | return 0; | ||
| 548 | } | 552 | } | 
| 549 | 553 | ||
| 550 | /* | 554 | /* | 
| @@ -562,8 +566,8 @@ void tick_check_oneshot_broadcast_this_cpu(void) | |||
| 562 | * switched over, leave the device alone. | 566 | * switched over, leave the device alone. | 
| 563 | */ | 567 | */ | 
| 564 | if (td->mode == TICKDEV_MODE_ONESHOT) { | 568 | if (td->mode == TICKDEV_MODE_ONESHOT) { | 
| 565 | clockevents_set_mode(td->evtdev, | 569 | clockevents_set_state(td->evtdev, | 
| 566 | CLOCK_EVT_MODE_ONESHOT); | 570 | CLOCK_EVT_STATE_ONESHOT); | 
| 567 | } | 571 | } | 
| 568 | } | 572 | } | 
| 569 | } | 573 | } | 
| @@ -666,31 +670,26 @@ static void broadcast_shutdown_local(struct clock_event_device *bc, | |||
| 666 | if (dev->next_event.tv64 < bc->next_event.tv64) | 670 | if (dev->next_event.tv64 < bc->next_event.tv64) | 
| 667 | return; | 671 | return; | 
| 668 | } | 672 | } | 
| 669 | clockevents_set_mode(dev, CLOCK_EVT_MODE_SHUTDOWN); | 673 | clockevents_set_state(dev, CLOCK_EVT_STATE_SHUTDOWN); | 
| 670 | } | 674 | } | 
| 671 | 675 | ||
| 672 | static void broadcast_move_bc(int deadcpu) | 676 | /** | 
| 673 | { | 677 | * tick_broadcast_oneshot_control - Enter/exit broadcast oneshot mode | 
| 674 | struct clock_event_device *bc = tick_broadcast_device.evtdev; | 678 | * @state: The target state (enter/exit) | 
| 675 | 679 | * | |
| 676 | if (!bc || !broadcast_needs_cpu(bc, deadcpu)) | 680 | * The system enters/leaves a state, where affected devices might stop | 
| 677 | return; | ||
| 678 | /* This moves the broadcast assignment to this cpu */ | ||
| 679 | clockevents_program_event(bc, bc->next_event, 1); | ||
| 680 | } | ||
| 681 | |||
| 682 | /* | ||
| 683 | * Powerstate information: The system enters/leaves a state, where | ||
| 684 | * affected devices might stop | ||
| 685 | * Returns 0 on success, -EBUSY if the cpu is used to broadcast wakeups. | 681 | * Returns 0 on success, -EBUSY if the cpu is used to broadcast wakeups. | 
| 682 | * | ||
| 683 | * Called with interrupts disabled, so clockevents_lock is not | ||
| 684 | * required here because the local clock event device cannot go away | ||
| 685 | * under us. | ||
| 686 | */ | 686 | */ | 
| 687 | int tick_broadcast_oneshot_control(unsigned long reason) | 687 | int tick_broadcast_oneshot_control(enum tick_broadcast_state state) | 
| 688 | { | 688 | { | 
| 689 | struct clock_event_device *bc, *dev; | 689 | struct clock_event_device *bc, *dev; | 
| 690 | struct tick_device *td; | 690 | struct tick_device *td; | 
| 691 | unsigned long flags; | ||
| 692 | ktime_t now; | ||
| 693 | int cpu, ret = 0; | 691 | int cpu, ret = 0; | 
| 692 | ktime_t now; | ||
| 694 | 693 | ||
| 695 | /* | 694 | /* | 
| 696 | * Periodic mode does not care about the enter/exit of power | 695 | * Periodic mode does not care about the enter/exit of power | 
| @@ -703,17 +702,17 @@ int tick_broadcast_oneshot_control(unsigned long reason) | |||
| 703 | * We are called with preemtion disabled from the depth of the | 702 | * We are called with preemtion disabled from the depth of the | 
| 704 | * idle code, so we can't be moved away. | 703 | * idle code, so we can't be moved away. | 
| 705 | */ | 704 | */ | 
| 706 | cpu = smp_processor_id(); | 705 | td = this_cpu_ptr(&tick_cpu_device); | 
| 707 | td = &per_cpu(tick_cpu_device, cpu); | ||
| 708 | dev = td->evtdev; | 706 | dev = td->evtdev; | 
| 709 | 707 | ||
| 710 | if (!(dev->features & CLOCK_EVT_FEAT_C3STOP)) | 708 | if (!(dev->features & CLOCK_EVT_FEAT_C3STOP)) | 
| 711 | return 0; | 709 | return 0; | 
| 712 | 710 | ||
| 711 | raw_spin_lock(&tick_broadcast_lock); | ||
| 713 | bc = tick_broadcast_device.evtdev; | 712 | bc = tick_broadcast_device.evtdev; | 
| 713 | cpu = smp_processor_id(); | ||
| 714 | 714 | ||
| 715 | raw_spin_lock_irqsave(&tick_broadcast_lock, flags); | 715 | if (state == TICK_BROADCAST_ENTER) { | 
| 716 | if (reason == CLOCK_EVT_NOTIFY_BROADCAST_ENTER) { | ||
| 717 | if (!cpumask_test_and_set_cpu(cpu, tick_broadcast_oneshot_mask)) { | 716 | if (!cpumask_test_and_set_cpu(cpu, tick_broadcast_oneshot_mask)) { | 
| 718 | WARN_ON_ONCE(cpumask_test_cpu(cpu, tick_broadcast_pending_mask)); | 717 | WARN_ON_ONCE(cpumask_test_cpu(cpu, tick_broadcast_pending_mask)); | 
| 719 | broadcast_shutdown_local(bc, dev); | 718 | broadcast_shutdown_local(bc, dev); | 
| @@ -741,7 +740,7 @@ int tick_broadcast_oneshot_control(unsigned long reason) | |||
| 741 | cpumask_clear_cpu(cpu, tick_broadcast_oneshot_mask); | 740 | cpumask_clear_cpu(cpu, tick_broadcast_oneshot_mask); | 
| 742 | } else { | 741 | } else { | 
| 743 | if (cpumask_test_and_clear_cpu(cpu, tick_broadcast_oneshot_mask)) { | 742 | if (cpumask_test_and_clear_cpu(cpu, tick_broadcast_oneshot_mask)) { | 
| 744 | clockevents_set_mode(dev, CLOCK_EVT_MODE_ONESHOT); | 743 | clockevents_set_state(dev, CLOCK_EVT_STATE_ONESHOT); | 
| 745 | /* | 744 | /* | 
| 746 | * The cpu which was handling the broadcast | 745 | * The cpu which was handling the broadcast | 
| 747 | * timer marked this cpu in the broadcast | 746 | * timer marked this cpu in the broadcast | 
| @@ -805,9 +804,10 @@ int tick_broadcast_oneshot_control(unsigned long reason) | |||
| 805 | } | 804 | } | 
| 806 | } | 805 | } | 
| 807 | out: | 806 | out: | 
| 808 | raw_spin_unlock_irqrestore(&tick_broadcast_lock, flags); | 807 | raw_spin_unlock(&tick_broadcast_lock); | 
| 809 | return ret; | 808 | return ret; | 
| 810 | } | 809 | } | 
| 810 | EXPORT_SYMBOL_GPL(tick_broadcast_oneshot_control); | ||
| 811 | 811 | ||
| 812 | /* | 812 | /* | 
| 813 | * Reset the one shot broadcast for a cpu | 813 | * Reset the one shot broadcast for a cpu | 
| @@ -842,7 +842,7 @@ void tick_broadcast_setup_oneshot(struct clock_event_device *bc) | |||
| 842 | 842 | ||
| 843 | /* Set it up only once ! */ | 843 | /* Set it up only once ! */ | 
| 844 | if (bc->event_handler != tick_handle_oneshot_broadcast) { | 844 | if (bc->event_handler != tick_handle_oneshot_broadcast) { | 
| 845 | int was_periodic = bc->mode == CLOCK_EVT_MODE_PERIODIC; | 845 | int was_periodic = bc->state == CLOCK_EVT_STATE_PERIODIC; | 
| 846 | 846 | ||
| 847 | bc->event_handler = tick_handle_oneshot_broadcast; | 847 | bc->event_handler = tick_handle_oneshot_broadcast; | 
| 848 | 848 | ||
| @@ -858,7 +858,7 @@ void tick_broadcast_setup_oneshot(struct clock_event_device *bc) | |||
| 858 | tick_broadcast_oneshot_mask, tmpmask); | 858 | tick_broadcast_oneshot_mask, tmpmask); | 
| 859 | 859 | ||
| 860 | if (was_periodic && !cpumask_empty(tmpmask)) { | 860 | if (was_periodic && !cpumask_empty(tmpmask)) { | 
| 861 | clockevents_set_mode(bc, CLOCK_EVT_MODE_ONESHOT); | 861 | clockevents_set_state(bc, CLOCK_EVT_STATE_ONESHOT); | 
| 862 | tick_broadcast_init_next_event(tmpmask, | 862 | tick_broadcast_init_next_event(tmpmask, | 
| 863 | tick_next_period); | 863 | tick_next_period); | 
| 864 | tick_broadcast_set_event(bc, cpu, tick_next_period, 1); | 864 | tick_broadcast_set_event(bc, cpu, tick_next_period, 1); | 
| @@ -894,14 +894,28 @@ void tick_broadcast_switch_to_oneshot(void) | |||
| 894 | raw_spin_unlock_irqrestore(&tick_broadcast_lock, flags); | 894 | raw_spin_unlock_irqrestore(&tick_broadcast_lock, flags); | 
| 895 | } | 895 | } | 
| 896 | 896 | ||
| 897 | #ifdef CONFIG_HOTPLUG_CPU | ||
| 898 | void hotplug_cpu__broadcast_tick_pull(int deadcpu) | ||
| 899 | { | ||
| 900 | struct clock_event_device *bc; | ||
| 901 | unsigned long flags; | ||
| 902 | |||
| 903 | raw_spin_lock_irqsave(&tick_broadcast_lock, flags); | ||
| 904 | bc = tick_broadcast_device.evtdev; | ||
| 905 | |||
| 906 | if (bc && broadcast_needs_cpu(bc, deadcpu)) { | ||
| 907 | /* This moves the broadcast assignment to this CPU: */ | ||
| 908 | clockevents_program_event(bc, bc->next_event, 1); | ||
| 909 | } | ||
| 910 | raw_spin_unlock_irqrestore(&tick_broadcast_lock, flags); | ||
| 911 | } | ||
| 897 | 912 | ||
| 898 | /* | 913 | /* | 
| 899 | * Remove a dead CPU from broadcasting | 914 | * Remove a dead CPU from broadcasting | 
| 900 | */ | 915 | */ | 
| 901 | void tick_shutdown_broadcast_oneshot(unsigned int *cpup) | 916 | void tick_shutdown_broadcast_oneshot(unsigned int cpu) | 
| 902 | { | 917 | { | 
| 903 | unsigned long flags; | 918 | unsigned long flags; | 
| 904 | unsigned int cpu = *cpup; | ||
| 905 | 919 | ||
| 906 | raw_spin_lock_irqsave(&tick_broadcast_lock, flags); | 920 | raw_spin_lock_irqsave(&tick_broadcast_lock, flags); | 
| 907 | 921 | ||
| @@ -913,10 +927,9 @@ void tick_shutdown_broadcast_oneshot(unsigned int *cpup) | |||
| 913 | cpumask_clear_cpu(cpu, tick_broadcast_pending_mask); | 927 | cpumask_clear_cpu(cpu, tick_broadcast_pending_mask); | 
| 914 | cpumask_clear_cpu(cpu, tick_broadcast_force_mask); | 928 | cpumask_clear_cpu(cpu, tick_broadcast_force_mask); | 
| 915 | 929 | ||
| 916 | broadcast_move_bc(cpu); | ||
| 917 | |||
| 918 | raw_spin_unlock_irqrestore(&tick_broadcast_lock, flags); | 930 | raw_spin_unlock_irqrestore(&tick_broadcast_lock, flags); | 
| 919 | } | 931 | } | 
| 932 | #endif | ||
| 920 | 933 | ||
| 921 | /* | 934 | /* | 
| 922 | * Check, whether the broadcast device is in one shot mode | 935 | * Check, whether the broadcast device is in one shot mode | 
diff --git a/kernel/time/tick-common.c b/kernel/time/tick-common.c index f7c515595b42..3ae6afa1eb98 100644 --- a/kernel/time/tick-common.c +++ b/kernel/time/tick-common.c  | |||
| @@ -102,7 +102,7 @@ void tick_handle_periodic(struct clock_event_device *dev) | |||
| 102 | 102 | ||
| 103 | tick_periodic(cpu); | 103 | tick_periodic(cpu); | 
| 104 | 104 | ||
| 105 | if (dev->mode != CLOCK_EVT_MODE_ONESHOT) | 105 | if (dev->state != CLOCK_EVT_STATE_ONESHOT) | 
| 106 | return; | 106 | return; | 
| 107 | for (;;) { | 107 | for (;;) { | 
| 108 | /* | 108 | /* | 
| @@ -140,7 +140,7 @@ void tick_setup_periodic(struct clock_event_device *dev, int broadcast) | |||
| 140 | 140 | ||
| 141 | if ((dev->features & CLOCK_EVT_FEAT_PERIODIC) && | 141 | if ((dev->features & CLOCK_EVT_FEAT_PERIODIC) && | 
| 142 | !tick_broadcast_oneshot_active()) { | 142 | !tick_broadcast_oneshot_active()) { | 
| 143 | clockevents_set_mode(dev, CLOCK_EVT_MODE_PERIODIC); | 143 | clockevents_set_state(dev, CLOCK_EVT_STATE_PERIODIC); | 
| 144 | } else { | 144 | } else { | 
| 145 | unsigned long seq; | 145 | unsigned long seq; | 
| 146 | ktime_t next; | 146 | ktime_t next; | 
| @@ -150,7 +150,7 @@ void tick_setup_periodic(struct clock_event_device *dev, int broadcast) | |||
| 150 | next = tick_next_period; | 150 | next = tick_next_period; | 
| 151 | } while (read_seqretry(&jiffies_lock, seq)); | 151 | } while (read_seqretry(&jiffies_lock, seq)); | 
| 152 | 152 | ||
| 153 | clockevents_set_mode(dev, CLOCK_EVT_MODE_ONESHOT); | 153 | clockevents_set_state(dev, CLOCK_EVT_STATE_ONESHOT); | 
| 154 | 154 | ||
| 155 | for (;;) { | 155 | for (;;) { | 
| 156 | if (!clockevents_program_event(dev, next, false)) | 156 | if (!clockevents_program_event(dev, next, false)) | 
| @@ -332,14 +332,16 @@ out_bc: | |||
| 332 | tick_install_broadcast_device(newdev); | 332 | tick_install_broadcast_device(newdev); | 
| 333 | } | 333 | } | 
| 334 | 334 | ||
| 335 | #ifdef CONFIG_HOTPLUG_CPU | ||
| 335 | /* | 336 | /* | 
| 336 | * Transfer the do_timer job away from a dying cpu. | 337 | * Transfer the do_timer job away from a dying cpu. | 
| 337 | * | 338 | * | 
| 338 | * Called with interrupts disabled. | 339 | * Called with interrupts disabled. Not locking required. If | 
| 340 | * tick_do_timer_cpu is owned by this cpu, nothing can change it. | ||
| 339 | */ | 341 | */ | 
| 340 | void tick_handover_do_timer(int *cpup) | 342 | void tick_handover_do_timer(void) | 
| 341 | { | 343 | { | 
| 342 | if (*cpup == tick_do_timer_cpu) { | 344 | if (tick_do_timer_cpu == smp_processor_id()) { | 
| 343 | int cpu = cpumask_first(cpu_online_mask); | 345 | int cpu = cpumask_first(cpu_online_mask); | 
| 344 | 346 | ||
| 345 | tick_do_timer_cpu = (cpu < nr_cpu_ids) ? cpu : | 347 | tick_do_timer_cpu = (cpu < nr_cpu_ids) ? cpu : | 
| @@ -354,9 +356,9 @@ void tick_handover_do_timer(int *cpup) | |||
| 354 | * access the hardware device itself. | 356 | * access the hardware device itself. | 
| 355 | * We just set the mode and remove it from the lists. | 357 | * We just set the mode and remove it from the lists. | 
| 356 | */ | 358 | */ | 
| 357 | void tick_shutdown(unsigned int *cpup) | 359 | void tick_shutdown(unsigned int cpu) | 
| 358 | { | 360 | { | 
| 359 | struct tick_device *td = &per_cpu(tick_cpu_device, *cpup); | 361 | struct tick_device *td = &per_cpu(tick_cpu_device, cpu); | 
| 360 | struct clock_event_device *dev = td->evtdev; | 362 | struct clock_event_device *dev = td->evtdev; | 
| 361 | 363 | ||
| 362 | td->mode = TICKDEV_MODE_PERIODIC; | 364 | td->mode = TICKDEV_MODE_PERIODIC; | 
| @@ -365,27 +367,42 @@ void tick_shutdown(unsigned int *cpup) | |||
| 365 | * Prevent that the clock events layer tries to call | 367 | * Prevent that the clock events layer tries to call | 
| 366 | * the set mode function! | 368 | * the set mode function! | 
| 367 | */ | 369 | */ | 
| 370 | dev->state = CLOCK_EVT_STATE_DETACHED; | ||
| 368 | dev->mode = CLOCK_EVT_MODE_UNUSED; | 371 | dev->mode = CLOCK_EVT_MODE_UNUSED; | 
| 369 | clockevents_exchange_device(dev, NULL); | 372 | clockevents_exchange_device(dev, NULL); | 
| 370 | dev->event_handler = clockevents_handle_noop; | 373 | dev->event_handler = clockevents_handle_noop; | 
| 371 | td->evtdev = NULL; | 374 | td->evtdev = NULL; | 
| 372 | } | 375 | } | 
| 373 | } | 376 | } | 
| 377 | #endif | ||
| 374 | 378 | ||
| 375 | void tick_suspend(void) | 379 | /** | 
| 380 | * tick_suspend_local - Suspend the local tick device | ||
| 381 | * | ||
| 382 | * Called from the local cpu for freeze with interrupts disabled. | ||
| 383 | * | ||
| 384 | * No locks required. Nothing can change the per cpu device. | ||
| 385 | */ | ||
| 386 | void tick_suspend_local(void) | ||
| 376 | { | 387 | { | 
| 377 | struct tick_device *td = this_cpu_ptr(&tick_cpu_device); | 388 | struct tick_device *td = this_cpu_ptr(&tick_cpu_device); | 
| 378 | 389 | ||
| 379 | clockevents_shutdown(td->evtdev); | 390 | clockevents_shutdown(td->evtdev); | 
| 380 | } | 391 | } | 
| 381 | 392 | ||
| 382 | void tick_resume(void) | 393 | /** | 
| 394 | * tick_resume_local - Resume the local tick device | ||
| 395 | * | ||
| 396 | * Called from the local CPU for unfreeze or XEN resume magic. | ||
| 397 | * | ||
| 398 | * No locks required. Nothing can change the per cpu device. | ||
| 399 | */ | ||
| 400 | void tick_resume_local(void) | ||
| 383 | { | 401 | { | 
| 384 | struct tick_device *td = this_cpu_ptr(&tick_cpu_device); | 402 | struct tick_device *td = this_cpu_ptr(&tick_cpu_device); | 
| 385 | int broadcast = tick_resume_broadcast(); | 403 | bool broadcast = tick_resume_check_broadcast(); | 
| 386 | |||
| 387 | clockevents_set_mode(td->evtdev, CLOCK_EVT_MODE_RESUME); | ||
| 388 | 404 | ||
| 405 | clockevents_tick_resume(td->evtdev); | ||
| 389 | if (!broadcast) { | 406 | if (!broadcast) { | 
| 390 | if (td->mode == TICKDEV_MODE_PERIODIC) | 407 | if (td->mode == TICKDEV_MODE_PERIODIC) | 
| 391 | tick_setup_periodic(td->evtdev, 0); | 408 | tick_setup_periodic(td->evtdev, 0); | 
| @@ -394,6 +411,35 @@ void tick_resume(void) | |||
| 394 | } | 411 | } | 
| 395 | } | 412 | } | 
| 396 | 413 | ||
| 414 | /** | ||
| 415 | * tick_suspend - Suspend the tick and the broadcast device | ||
| 416 | * | ||
| 417 | * Called from syscore_suspend() via timekeeping_suspend with only one | ||
| 418 | * CPU online and interrupts disabled or from tick_unfreeze() under | ||
| 419 | * tick_freeze_lock. | ||
| 420 | * | ||
| 421 | * No locks required. Nothing can change the per cpu device. | ||
| 422 | */ | ||
| 423 | void tick_suspend(void) | ||
| 424 | { | ||
| 425 | tick_suspend_local(); | ||
| 426 | tick_suspend_broadcast(); | ||
| 427 | } | ||
| 428 | |||
| 429 | /** | ||
| 430 | * tick_resume - Resume the tick and the broadcast device | ||
| 431 | * | ||
| 432 | * Called from syscore_resume() via timekeeping_resume with only one | ||
| 433 | * CPU online and interrupts disabled. | ||
| 434 | * | ||
| 435 | * No locks required. Nothing can change the per cpu device. | ||
| 436 | */ | ||
| 437 | void tick_resume(void) | ||
| 438 | { | ||
| 439 | tick_resume_broadcast(); | ||
| 440 | tick_resume_local(); | ||
| 441 | } | ||
| 442 | |||
| 397 | static DEFINE_RAW_SPINLOCK(tick_freeze_lock); | 443 | static DEFINE_RAW_SPINLOCK(tick_freeze_lock); | 
| 398 | static unsigned int tick_freeze_depth; | 444 | static unsigned int tick_freeze_depth; | 
| 399 | 445 | ||
| @@ -411,12 +457,10 @@ void tick_freeze(void) | |||
| 411 | raw_spin_lock(&tick_freeze_lock); | 457 | raw_spin_lock(&tick_freeze_lock); | 
| 412 | 458 | ||
| 413 | tick_freeze_depth++; | 459 | tick_freeze_depth++; | 
| 414 | if (tick_freeze_depth == num_online_cpus()) { | 460 | if (tick_freeze_depth == num_online_cpus()) | 
| 415 | timekeeping_suspend(); | 461 | timekeeping_suspend(); | 
| 416 | } else { | 462 | else | 
| 417 | tick_suspend(); | 463 | tick_suspend_local(); | 
| 418 | tick_suspend_broadcast(); | ||
| 419 | } | ||
| 420 | 464 | ||
| 421 | raw_spin_unlock(&tick_freeze_lock); | 465 | raw_spin_unlock(&tick_freeze_lock); | 
| 422 | } | 466 | } | 
| @@ -437,7 +481,7 @@ void tick_unfreeze(void) | |||
| 437 | if (tick_freeze_depth == num_online_cpus()) | 481 | if (tick_freeze_depth == num_online_cpus()) | 
| 438 | timekeeping_resume(); | 482 | timekeeping_resume(); | 
| 439 | else | 483 | else | 
| 440 | tick_resume(); | 484 | tick_resume_local(); | 
| 441 | 485 | ||
| 442 | tick_freeze_depth--; | 486 | tick_freeze_depth--; | 
| 443 | 487 | ||
diff --git a/kernel/time/tick-internal.h b/kernel/time/tick-internal.h index 366aeb4f2c66..b64fdd8054c5 100644 --- a/kernel/time/tick-internal.h +++ b/kernel/time/tick-internal.h  | |||
| @@ -5,15 +5,12 @@ | |||
| 5 | #include <linux/tick.h> | 5 | #include <linux/tick.h> | 
| 6 | 6 | ||
| 7 | #include "timekeeping.h" | 7 | #include "timekeeping.h" | 
| 8 | #include "tick-sched.h" | ||
| 8 | 9 | ||
| 9 | extern seqlock_t jiffies_lock; | 10 | #ifdef CONFIG_GENERIC_CLOCKEVENTS | 
| 10 | 11 | ||
| 11 | #define CS_NAME_LEN 32 | 12 | # define TICK_DO_TIMER_NONE -1 | 
| 12 | 13 | # define TICK_DO_TIMER_BOOT -2 | |
| 13 | #ifdef CONFIG_GENERIC_CLOCKEVENTS_BUILD | ||
| 14 | |||
| 15 | #define TICK_DO_TIMER_NONE -1 | ||
| 16 | #define TICK_DO_TIMER_BOOT -2 | ||
| 17 | 14 | ||
| 18 | DECLARE_PER_CPU(struct tick_device, tick_cpu_device); | 15 | DECLARE_PER_CPU(struct tick_device, tick_cpu_device); | 
| 19 | extern ktime_t tick_next_period; | 16 | extern ktime_t tick_next_period; | 
| @@ -23,21 +20,72 @@ extern int tick_do_timer_cpu __read_mostly; | |||
| 23 | extern void tick_setup_periodic(struct clock_event_device *dev, int broadcast); | 20 | extern void tick_setup_periodic(struct clock_event_device *dev, int broadcast); | 
| 24 | extern void tick_handle_periodic(struct clock_event_device *dev); | 21 | extern void tick_handle_periodic(struct clock_event_device *dev); | 
| 25 | extern void tick_check_new_device(struct clock_event_device *dev); | 22 | extern void tick_check_new_device(struct clock_event_device *dev); | 
| 26 | extern void tick_handover_do_timer(int *cpup); | 23 | extern void tick_shutdown(unsigned int cpu); | 
| 27 | extern void tick_shutdown(unsigned int *cpup); | ||
| 28 | extern void tick_suspend(void); | 24 | extern void tick_suspend(void); | 
| 29 | extern void tick_resume(void); | 25 | extern void tick_resume(void); | 
| 30 | extern bool tick_check_replacement(struct clock_event_device *curdev, | 26 | extern bool tick_check_replacement(struct clock_event_device *curdev, | 
| 31 | struct clock_event_device *newdev); | 27 | struct clock_event_device *newdev); | 
| 32 | extern void tick_install_replacement(struct clock_event_device *dev); | 28 | extern void tick_install_replacement(struct clock_event_device *dev); | 
| 29 | extern int tick_is_oneshot_available(void); | ||
| 30 | extern struct tick_device *tick_get_device(int cpu); | ||
| 33 | 31 | ||
| 34 | extern void clockevents_shutdown(struct clock_event_device *dev); | 32 | extern int clockevents_tick_resume(struct clock_event_device *dev); | 
| 33 | /* Check, if the device is functional or a dummy for broadcast */ | ||
| 34 | static inline int tick_device_is_functional(struct clock_event_device *dev) | ||
| 35 | { | ||
| 36 | return !(dev->features & CLOCK_EVT_FEAT_DUMMY); | ||
| 37 | } | ||
| 35 | 38 | ||
| 39 | extern void clockevents_shutdown(struct clock_event_device *dev); | ||
| 40 | extern void clockevents_exchange_device(struct clock_event_device *old, | ||
| 41 | struct clock_event_device *new); | ||
| 42 | extern void clockevents_set_state(struct clock_event_device *dev, | ||
| 43 | enum clock_event_state state); | ||
| 44 | extern int clockevents_program_event(struct clock_event_device *dev, | ||
| 45 | ktime_t expires, bool force); | ||
| 46 | extern void clockevents_handle_noop(struct clock_event_device *dev); | ||
| 47 | extern int __clockevents_update_freq(struct clock_event_device *dev, u32 freq); | ||
| 36 | extern ssize_t sysfs_get_uname(const char *buf, char *dst, size_t cnt); | 48 | extern ssize_t sysfs_get_uname(const char *buf, char *dst, size_t cnt); | 
| 37 | 49 | ||
| 38 | /* | 50 | /* Broadcasting support */ | 
| 39 | * NO_HZ / high resolution timer shared code | 51 | # ifdef CONFIG_GENERIC_CLOCKEVENTS_BROADCAST | 
| 40 | */ | 52 | extern int tick_device_uses_broadcast(struct clock_event_device *dev, int cpu); | 
| 53 | extern void tick_install_broadcast_device(struct clock_event_device *dev); | ||
| 54 | extern int tick_is_broadcast_device(struct clock_event_device *dev); | ||
| 55 | extern void tick_shutdown_broadcast(unsigned int cpu); | ||
| 56 | extern void tick_suspend_broadcast(void); | ||
| 57 | extern void tick_resume_broadcast(void); | ||
| 58 | extern bool tick_resume_check_broadcast(void); | ||
| 59 | extern void tick_broadcast_init(void); | ||
| 60 | extern void tick_set_periodic_handler(struct clock_event_device *dev, int broadcast); | ||
| 61 | extern int tick_broadcast_update_freq(struct clock_event_device *dev, u32 freq); | ||
| 62 | extern struct tick_device *tick_get_broadcast_device(void); | ||
| 63 | extern struct cpumask *tick_get_broadcast_mask(void); | ||
| 64 | # else /* !CONFIG_GENERIC_CLOCKEVENTS_BROADCAST: */ | ||
| 65 | static inline void tick_install_broadcast_device(struct clock_event_device *dev) { } | ||
| 66 | static inline int tick_is_broadcast_device(struct clock_event_device *dev) { return 0; } | ||
| 67 | static inline int tick_device_uses_broadcast(struct clock_event_device *dev, int cpu) { return 0; } | ||
| 68 | static inline void tick_do_periodic_broadcast(struct clock_event_device *d) { } | ||
| 69 | static inline void tick_shutdown_broadcast(unsigned int cpu) { } | ||
| 70 | static inline void tick_suspend_broadcast(void) { } | ||
| 71 | static inline void tick_resume_broadcast(void) { } | ||
| 72 | static inline bool tick_resume_check_broadcast(void) { return false; } | ||
| 73 | static inline void tick_broadcast_init(void) { } | ||
| 74 | static inline int tick_broadcast_update_freq(struct clock_event_device *dev, u32 freq) { return -ENODEV; } | ||
| 75 | |||
| 76 | /* Set the periodic handler in non broadcast mode */ | ||
| 77 | static inline void tick_set_periodic_handler(struct clock_event_device *dev, int broadcast) | ||
| 78 | { | ||
| 79 | dev->event_handler = tick_handle_periodic; | ||
| 80 | } | ||
| 81 | # endif /* !CONFIG_GENERIC_CLOCKEVENTS_BROADCAST */ | ||
| 82 | |||
| 83 | #else /* !GENERIC_CLOCKEVENTS: */ | ||
| 84 | static inline void tick_suspend(void) { } | ||
| 85 | static inline void tick_resume(void) { } | ||
| 86 | #endif /* !GENERIC_CLOCKEVENTS */ | ||
| 87 | |||
| 88 | /* Oneshot related functions */ | ||
| 41 | #ifdef CONFIG_TICK_ONESHOT | 89 | #ifdef CONFIG_TICK_ONESHOT | 
| 42 | extern void tick_setup_oneshot(struct clock_event_device *newdev, | 90 | extern void tick_setup_oneshot(struct clock_event_device *newdev, | 
| 43 | void (*handler)(struct clock_event_device *), | 91 | void (*handler)(struct clock_event_device *), | 
| @@ -46,58 +94,42 @@ extern int tick_program_event(ktime_t expires, int force); | |||
| 46 | extern void tick_oneshot_notify(void); | 94 | extern void tick_oneshot_notify(void); | 
| 47 | extern int tick_switch_to_oneshot(void (*handler)(struct clock_event_device *)); | 95 | extern int tick_switch_to_oneshot(void (*handler)(struct clock_event_device *)); | 
| 48 | extern void tick_resume_oneshot(void); | 96 | extern void tick_resume_oneshot(void); | 
| 49 | # ifdef CONFIG_GENERIC_CLOCKEVENTS_BROADCAST | 97 | static inline bool tick_oneshot_possible(void) { return true; } | 
| 98 | extern int tick_oneshot_mode_active(void); | ||
| 99 | extern void tick_clock_notify(void); | ||
| 100 | extern int tick_check_oneshot_change(int allow_nohz); | ||
| 101 | extern int tick_init_highres(void); | ||
| 102 | #else /* !CONFIG_TICK_ONESHOT: */ | ||
| 103 | static inline | ||
| 104 | void tick_setup_oneshot(struct clock_event_device *newdev, | ||
| 105 | void (*handler)(struct clock_event_device *), | ||
| 106 | ktime_t nextevt) { BUG(); } | ||
| 107 | static inline void tick_resume_oneshot(void) { BUG(); } | ||
| 108 | static inline int tick_program_event(ktime_t expires, int force) { return 0; } | ||
| 109 | static inline void tick_oneshot_notify(void) { } | ||
| 110 | static inline bool tick_oneshot_possible(void) { return false; } | ||
| 111 | static inline int tick_oneshot_mode_active(void) { return 0; } | ||
| 112 | static inline void tick_clock_notify(void) { } | ||
| 113 | static inline int tick_check_oneshot_change(int allow_nohz) { return 0; } | ||
| 114 | #endif /* !CONFIG_TICK_ONESHOT */ | ||
| 115 | |||
| 116 | /* Functions related to oneshot broadcasting */ | ||
| 117 | #if defined(CONFIG_GENERIC_CLOCKEVENTS_BROADCAST) && defined(CONFIG_TICK_ONESHOT) | ||
| 50 | extern void tick_broadcast_setup_oneshot(struct clock_event_device *bc); | 118 | extern void tick_broadcast_setup_oneshot(struct clock_event_device *bc); | 
| 51 | extern int tick_broadcast_oneshot_control(unsigned long reason); | ||
| 52 | extern void tick_broadcast_switch_to_oneshot(void); | 119 | extern void tick_broadcast_switch_to_oneshot(void); | 
| 53 | extern void tick_shutdown_broadcast_oneshot(unsigned int *cpup); | 120 | extern void tick_shutdown_broadcast_oneshot(unsigned int cpu); | 
| 54 | extern int tick_resume_broadcast_oneshot(struct clock_event_device *bc); | ||
| 55 | extern int tick_broadcast_oneshot_active(void); | 121 | extern int tick_broadcast_oneshot_active(void); | 
| 56 | extern void tick_check_oneshot_broadcast_this_cpu(void); | 122 | extern void tick_check_oneshot_broadcast_this_cpu(void); | 
| 57 | bool tick_broadcast_oneshot_available(void); | 123 | bool tick_broadcast_oneshot_available(void); | 
| 58 | # else /* BROADCAST */ | 124 | extern struct cpumask *tick_get_broadcast_oneshot_mask(void); | 
| 59 | static inline void tick_broadcast_setup_oneshot(struct clock_event_device *bc) | 125 | #else /* !(BROADCAST && ONESHOT): */ | 
| 60 | { | 126 | static inline void tick_broadcast_setup_oneshot(struct clock_event_device *bc) { BUG(); } | 
| 61 | BUG(); | ||
| 62 | } | ||
| 63 | static inline int tick_broadcast_oneshot_control(unsigned long reason) { return 0; } | ||
| 64 | static inline void tick_broadcast_switch_to_oneshot(void) { } | 127 | static inline void tick_broadcast_switch_to_oneshot(void) { } | 
| 65 | static inline void tick_shutdown_broadcast_oneshot(unsigned int *cpup) { } | 128 | static inline void tick_shutdown_broadcast_oneshot(unsigned int cpu) { } | 
| 66 | static inline int tick_broadcast_oneshot_active(void) { return 0; } | 129 | static inline int tick_broadcast_oneshot_active(void) { return 0; } | 
| 67 | static inline void tick_check_oneshot_broadcast_this_cpu(void) { } | 130 | static inline void tick_check_oneshot_broadcast_this_cpu(void) { } | 
| 68 | static inline bool tick_broadcast_oneshot_available(void) { return true; } | 131 | static inline bool tick_broadcast_oneshot_available(void) { return tick_oneshot_possible(); } | 
| 69 | # endif /* !BROADCAST */ | 132 | #endif /* !(BROADCAST && ONESHOT) */ | 
| 70 | |||
| 71 | #else /* !ONESHOT */ | ||
| 72 | static inline | ||
| 73 | void tick_setup_oneshot(struct clock_event_device *newdev, | ||
| 74 | void (*handler)(struct clock_event_device *), | ||
| 75 | ktime_t nextevt) | ||
| 76 | { | ||
| 77 | BUG(); | ||
| 78 | } | ||
| 79 | static inline void tick_resume_oneshot(void) | ||
| 80 | { | ||
| 81 | BUG(); | ||
| 82 | } | ||
| 83 | static inline int tick_program_event(ktime_t expires, int force) | ||
| 84 | { | ||
| 85 | return 0; | ||
| 86 | } | ||
| 87 | static inline void tick_oneshot_notify(void) { } | ||
| 88 | static inline void tick_broadcast_setup_oneshot(struct clock_event_device *bc) | ||
| 89 | { | ||
| 90 | BUG(); | ||
| 91 | } | ||
| 92 | static inline int tick_broadcast_oneshot_control(unsigned long reason) { return 0; } | ||
| 93 | static inline void tick_shutdown_broadcast_oneshot(unsigned int *cpup) { } | ||
| 94 | static inline int tick_resume_broadcast_oneshot(struct clock_event_device *bc) | ||
| 95 | { | ||
| 96 | return 0; | ||
| 97 | } | ||
| 98 | static inline int tick_broadcast_oneshot_active(void) { return 0; } | ||
| 99 | static inline bool tick_broadcast_oneshot_available(void) { return false; } | ||
| 100 | #endif /* !TICK_ONESHOT */ | ||
| 101 | 133 | ||
| 102 | /* NO_HZ_FULL internal */ | 134 | /* NO_HZ_FULL internal */ | 
| 103 | #ifdef CONFIG_NO_HZ_FULL | 135 | #ifdef CONFIG_NO_HZ_FULL | 
| @@ -105,68 +137,3 @@ extern void tick_nohz_init(void); | |||
| 105 | # else | 137 | # else | 
| 106 | static inline void tick_nohz_init(void) { } | 138 | static inline void tick_nohz_init(void) { } | 
| 107 | #endif | 139 | #endif | 
| 108 | |||
| 109 | /* | ||
| 110 | * Broadcasting support | ||
| 111 | */ | ||
| 112 | #ifdef CONFIG_GENERIC_CLOCKEVENTS_BROADCAST | ||
| 113 | extern int tick_device_uses_broadcast(struct clock_event_device *dev, int cpu); | ||
| 114 | extern void tick_install_broadcast_device(struct clock_event_device *dev); | ||
| 115 | extern int tick_is_broadcast_device(struct clock_event_device *dev); | ||
| 116 | extern void tick_broadcast_on_off(unsigned long reason, int *oncpu); | ||
| 117 | extern void tick_shutdown_broadcast(unsigned int *cpup); | ||
| 118 | extern void tick_suspend_broadcast(void); | ||
| 119 | extern int tick_resume_broadcast(void); | ||
| 120 | extern void tick_broadcast_init(void); | ||
| 121 | extern void | ||
| 122 | tick_set_periodic_handler(struct clock_event_device *dev, int broadcast); | ||
| 123 | int tick_broadcast_update_freq(struct clock_event_device *dev, u32 freq); | ||
| 124 | |||
| 125 | #else /* !BROADCAST */ | ||
| 126 | |||
| 127 | static inline void tick_install_broadcast_device(struct clock_event_device *dev) | ||
| 128 | { | ||
| 129 | } | ||
| 130 | |||
| 131 | static inline int tick_is_broadcast_device(struct clock_event_device *dev) | ||
| 132 | { | ||
| 133 | return 0; | ||
| 134 | } | ||
| 135 | static inline int tick_device_uses_broadcast(struct clock_event_device *dev, | ||
| 136 | int cpu) | ||
| 137 | { | ||
| 138 | return 0; | ||
| 139 | } | ||
| 140 | static inline void tick_do_periodic_broadcast(struct clock_event_device *d) { } | ||
| 141 | static inline void tick_broadcast_on_off(unsigned long reason, int *oncpu) { } | ||
| 142 | static inline void tick_shutdown_broadcast(unsigned int *cpup) { } | ||
| 143 | static inline void tick_suspend_broadcast(void) { } | ||
| 144 | static inline int tick_resume_broadcast(void) { return 0; } | ||
| 145 | static inline void tick_broadcast_init(void) { } | ||
| 146 | static inline int tick_broadcast_update_freq(struct clock_event_device *dev, | ||
| 147 | u32 freq) { return -ENODEV; } | ||
| 148 | |||
| 149 | /* | ||
| 150 | * Set the periodic handler in non broadcast mode | ||
| 151 | */ | ||
| 152 | static inline void tick_set_periodic_handler(struct clock_event_device *dev, | ||
| 153 | int broadcast) | ||
| 154 | { | ||
| 155 | dev->event_handler = tick_handle_periodic; | ||
| 156 | } | ||
| 157 | #endif /* !BROADCAST */ | ||
| 158 | |||
| 159 | /* | ||
| 160 | * Check, if the device is functional or a dummy for broadcast | ||
| 161 | */ | ||
| 162 | static inline int tick_device_is_functional(struct clock_event_device *dev) | ||
| 163 | { | ||
| 164 | return !(dev->features & CLOCK_EVT_FEAT_DUMMY); | ||
| 165 | } | ||
| 166 | |||
| 167 | int __clockevents_update_freq(struct clock_event_device *dev, u32 freq); | ||
| 168 | |||
| 169 | #endif | ||
| 170 | |||
| 171 | extern void do_timer(unsigned long ticks); | ||
| 172 | extern void update_wall_time(void); | ||
diff --git a/kernel/time/tick-oneshot.c b/kernel/time/tick-oneshot.c index 7ce740e78e1b..67a64b1670bf 100644 --- a/kernel/time/tick-oneshot.c +++ b/kernel/time/tick-oneshot.c  | |||
| @@ -38,7 +38,7 @@ void tick_resume_oneshot(void) | |||
| 38 | { | 38 | { | 
| 39 | struct clock_event_device *dev = __this_cpu_read(tick_cpu_device.evtdev); | 39 | struct clock_event_device *dev = __this_cpu_read(tick_cpu_device.evtdev); | 
| 40 | 40 | ||
| 41 | clockevents_set_mode(dev, CLOCK_EVT_MODE_ONESHOT); | 41 | clockevents_set_state(dev, CLOCK_EVT_STATE_ONESHOT); | 
| 42 | clockevents_program_event(dev, ktime_get(), true); | 42 | clockevents_program_event(dev, ktime_get(), true); | 
| 43 | } | 43 | } | 
| 44 | 44 | ||
| @@ -50,7 +50,7 @@ void tick_setup_oneshot(struct clock_event_device *newdev, | |||
| 50 | ktime_t next_event) | 50 | ktime_t next_event) | 
| 51 | { | 51 | { | 
| 52 | newdev->event_handler = handler; | 52 | newdev->event_handler = handler; | 
| 53 | clockevents_set_mode(newdev, CLOCK_EVT_MODE_ONESHOT); | 53 | clockevents_set_state(newdev, CLOCK_EVT_STATE_ONESHOT); | 
| 54 | clockevents_program_event(newdev, next_event, true); | 54 | clockevents_program_event(newdev, next_event, true); | 
| 55 | } | 55 | } | 
| 56 | 56 | ||
| @@ -81,7 +81,7 @@ int tick_switch_to_oneshot(void (*handler)(struct clock_event_device *)) | |||
| 81 | 81 | ||
| 82 | td->mode = TICKDEV_MODE_ONESHOT; | 82 | td->mode = TICKDEV_MODE_ONESHOT; | 
| 83 | dev->event_handler = handler; | 83 | dev->event_handler = handler; | 
| 84 | clockevents_set_mode(dev, CLOCK_EVT_MODE_ONESHOT); | 84 | clockevents_set_state(dev, CLOCK_EVT_STATE_ONESHOT); | 
| 85 | tick_broadcast_switch_to_oneshot(); | 85 | tick_broadcast_switch_to_oneshot(); | 
| 86 | return 0; | 86 | return 0; | 
| 87 | } | 87 | } | 
diff --git a/kernel/time/tick-sched.c b/kernel/time/tick-sched.c index a4c4edac4528..914259128145 100644 --- a/kernel/time/tick-sched.c +++ b/kernel/time/tick-sched.c  | |||
| @@ -34,7 +34,7 @@ | |||
| 34 | /* | 34 | /* | 
| 35 | * Per cpu nohz control structure | 35 | * Per cpu nohz control structure | 
| 36 | */ | 36 | */ | 
| 37 | DEFINE_PER_CPU(struct tick_sched, tick_cpu_sched); | 37 | static DEFINE_PER_CPU(struct tick_sched, tick_cpu_sched); | 
| 38 | 38 | ||
| 39 | /* | 39 | /* | 
| 40 | * The time, when the last jiffy update happened. Protected by jiffies_lock. | 40 | * The time, when the last jiffy update happened. Protected by jiffies_lock. | 
| @@ -416,6 +416,11 @@ static int __init setup_tick_nohz(char *str) | |||
| 416 | 416 | ||
| 417 | __setup("nohz=", setup_tick_nohz); | 417 | __setup("nohz=", setup_tick_nohz); | 
| 418 | 418 | ||
| 419 | int tick_nohz_tick_stopped(void) | ||
| 420 | { | ||
| 421 | return __this_cpu_read(tick_cpu_sched.tick_stopped); | ||
| 422 | } | ||
| 423 | |||
| 419 | /** | 424 | /** | 
| 420 | * tick_nohz_update_jiffies - update jiffies when idle was interrupted | 425 | * tick_nohz_update_jiffies - update jiffies when idle was interrupted | 
| 421 | * | 426 | * | 
diff --git a/kernel/time/tick-sched.h b/kernel/time/tick-sched.h new file mode 100644 index 000000000000..28b5da3e1a17 --- /dev/null +++ b/kernel/time/tick-sched.h  | |||
| @@ -0,0 +1,74 @@ | |||
| 1 | #ifndef _TICK_SCHED_H | ||
| 2 | #define _TICK_SCHED_H | ||
| 3 | |||
| 4 | #include <linux/hrtimer.h> | ||
| 5 | |||
| 6 | enum tick_device_mode { | ||
| 7 | TICKDEV_MODE_PERIODIC, | ||
| 8 | TICKDEV_MODE_ONESHOT, | ||
| 9 | }; | ||
| 10 | |||
| 11 | struct tick_device { | ||
| 12 | struct clock_event_device *evtdev; | ||
| 13 | enum tick_device_mode mode; | ||
| 14 | }; | ||
| 15 | |||
| 16 | enum tick_nohz_mode { | ||
| 17 | NOHZ_MODE_INACTIVE, | ||
| 18 | NOHZ_MODE_LOWRES, | ||
| 19 | NOHZ_MODE_HIGHRES, | ||
| 20 | }; | ||
| 21 | |||
| 22 | /** | ||
| 23 | * struct tick_sched - sched tick emulation and no idle tick control/stats | ||
| 24 | * @sched_timer: hrtimer to schedule the periodic tick in high | ||
| 25 | * resolution mode | ||
| 26 | * @last_tick: Store the last tick expiry time when the tick | ||
| 27 | * timer is modified for nohz sleeps. This is necessary | ||
| 28 | * to resume the tick timer operation in the timeline | ||
| 29 | * when the CPU returns from nohz sleep. | ||
| 30 | * @tick_stopped: Indicator that the idle tick has been stopped | ||
| 31 | * @idle_jiffies: jiffies at the entry to idle for idle time accounting | ||
| 32 | * @idle_calls: Total number of idle calls | ||
| 33 | * @idle_sleeps: Number of idle calls, where the sched tick was stopped | ||
| 34 | * @idle_entrytime: Time when the idle call was entered | ||
| 35 | * @idle_waketime: Time when the idle was interrupted | ||
| 36 | * @idle_exittime: Time when the idle state was left | ||
| 37 | * @idle_sleeptime: Sum of the time slept in idle with sched tick stopped | ||
| 38 | * @iowait_sleeptime: Sum of the time slept in idle with sched tick stopped, with IO outstanding | ||
| 39 | * @sleep_length: Duration of the current idle sleep | ||
| 40 | * @do_timer_lst: CPU was the last one doing do_timer before going idle | ||
| 41 | */ | ||
| 42 | struct tick_sched { | ||
| 43 | struct hrtimer sched_timer; | ||
| 44 | unsigned long check_clocks; | ||
| 45 | enum tick_nohz_mode nohz_mode; | ||
| 46 | ktime_t last_tick; | ||
| 47 | int inidle; | ||
| 48 | int tick_stopped; | ||
| 49 | unsigned long idle_jiffies; | ||
| 50 | unsigned long idle_calls; | ||
| 51 | unsigned long idle_sleeps; | ||
| 52 | int idle_active; | ||
| 53 | ktime_t idle_entrytime; | ||
| 54 | ktime_t idle_waketime; | ||
| 55 | ktime_t idle_exittime; | ||
| 56 | ktime_t idle_sleeptime; | ||
| 57 | ktime_t iowait_sleeptime; | ||
| 58 | ktime_t sleep_length; | ||
| 59 | unsigned long last_jiffies; | ||
| 60 | unsigned long next_jiffies; | ||
| 61 | ktime_t idle_expires; | ||
| 62 | int do_timer_last; | ||
| 63 | }; | ||
| 64 | |||
| 65 | extern struct tick_sched *tick_get_tick_sched(int cpu); | ||
| 66 | |||
| 67 | extern void tick_setup_sched_timer(void); | ||
| 68 | #if defined CONFIG_NO_HZ_COMMON || defined CONFIG_HIGH_RES_TIMERS | ||
| 69 | extern void tick_cancel_sched_timer(int cpu); | ||
| 70 | #else | ||
| 71 | static inline void tick_cancel_sched_timer(int cpu) { } | ||
| 72 | #endif | ||
| 73 | |||
| 74 | #endif | ||
diff --git a/kernel/time/timekeeping.c b/kernel/time/timekeeping.c index 91db94136c10..946acb72179f 100644 --- a/kernel/time/timekeeping.c +++ b/kernel/time/timekeeping.c  | |||
| @@ -59,17 +59,15 @@ struct tk_fast { | |||
| 59 | }; | 59 | }; | 
| 60 | 60 | ||
| 61 | static struct tk_fast tk_fast_mono ____cacheline_aligned; | 61 | static struct tk_fast tk_fast_mono ____cacheline_aligned; | 
| 62 | static struct tk_fast tk_fast_raw ____cacheline_aligned; | ||
| 62 | 63 | ||
| 63 | /* flag for if timekeeping is suspended */ | 64 | /* flag for if timekeeping is suspended */ | 
| 64 | int __read_mostly timekeeping_suspended; | 65 | int __read_mostly timekeeping_suspended; | 
| 65 | 66 | ||
| 66 | /* Flag for if there is a persistent clock on this platform */ | ||
| 67 | bool __read_mostly persistent_clock_exist = false; | ||
| 68 | |||
| 69 | static inline void tk_normalize_xtime(struct timekeeper *tk) | 67 | static inline void tk_normalize_xtime(struct timekeeper *tk) | 
| 70 | { | 68 | { | 
| 71 | while (tk->tkr.xtime_nsec >= ((u64)NSEC_PER_SEC << tk->tkr.shift)) { | 69 | while (tk->tkr_mono.xtime_nsec >= ((u64)NSEC_PER_SEC << tk->tkr_mono.shift)) { | 
| 72 | tk->tkr.xtime_nsec -= (u64)NSEC_PER_SEC << tk->tkr.shift; | 70 | tk->tkr_mono.xtime_nsec -= (u64)NSEC_PER_SEC << tk->tkr_mono.shift; | 
| 73 | tk->xtime_sec++; | 71 | tk->xtime_sec++; | 
| 74 | } | 72 | } | 
| 75 | } | 73 | } | 
| @@ -79,20 +77,20 @@ static inline struct timespec64 tk_xtime(struct timekeeper *tk) | |||
| 79 | struct timespec64 ts; | 77 | struct timespec64 ts; | 
| 80 | 78 | ||
| 81 | ts.tv_sec = tk->xtime_sec; | 79 | ts.tv_sec = tk->xtime_sec; | 
| 82 | ts.tv_nsec = (long)(tk->tkr.xtime_nsec >> tk->tkr.shift); | 80 | ts.tv_nsec = (long)(tk->tkr_mono.xtime_nsec >> tk->tkr_mono.shift); | 
| 83 | return ts; | 81 | return ts; | 
| 84 | } | 82 | } | 
| 85 | 83 | ||
| 86 | static void tk_set_xtime(struct timekeeper *tk, const struct timespec64 *ts) | 84 | static void tk_set_xtime(struct timekeeper *tk, const struct timespec64 *ts) | 
| 87 | { | 85 | { | 
| 88 | tk->xtime_sec = ts->tv_sec; | 86 | tk->xtime_sec = ts->tv_sec; | 
| 89 | tk->tkr.xtime_nsec = (u64)ts->tv_nsec << tk->tkr.shift; | 87 | tk->tkr_mono.xtime_nsec = (u64)ts->tv_nsec << tk->tkr_mono.shift; | 
| 90 | } | 88 | } | 
| 91 | 89 | ||
| 92 | static void tk_xtime_add(struct timekeeper *tk, const struct timespec64 *ts) | 90 | static void tk_xtime_add(struct timekeeper *tk, const struct timespec64 *ts) | 
| 93 | { | 91 | { | 
| 94 | tk->xtime_sec += ts->tv_sec; | 92 | tk->xtime_sec += ts->tv_sec; | 
| 95 | tk->tkr.xtime_nsec += (u64)ts->tv_nsec << tk->tkr.shift; | 93 | tk->tkr_mono.xtime_nsec += (u64)ts->tv_nsec << tk->tkr_mono.shift; | 
| 96 | tk_normalize_xtime(tk); | 94 | tk_normalize_xtime(tk); | 
| 97 | } | 95 | } | 
| 98 | 96 | ||
| @@ -118,6 +116,117 @@ static inline void tk_update_sleep_time(struct timekeeper *tk, ktime_t delta) | |||
| 118 | tk->offs_boot = ktime_add(tk->offs_boot, delta); | 116 | tk->offs_boot = ktime_add(tk->offs_boot, delta); | 
| 119 | } | 117 | } | 
| 120 | 118 | ||
| 119 | #ifdef CONFIG_DEBUG_TIMEKEEPING | ||
| 120 | #define WARNING_FREQ (HZ*300) /* 5 minute rate-limiting */ | ||
| 121 | /* | ||
| 122 | * These simple flag variables are managed | ||
| 123 | * without locks, which is racy, but ok since | ||
| 124 | * we don't really care about being super | ||
| 125 | * precise about how many events were seen, | ||
| 126 | * just that a problem was observed. | ||
| 127 | */ | ||
| 128 | static int timekeeping_underflow_seen; | ||
| 129 | static int timekeeping_overflow_seen; | ||
| 130 | |||
| 131 | /* last_warning is only modified under the timekeeping lock */ | ||
| 132 | static long timekeeping_last_warning; | ||
| 133 | |||
| 134 | static void timekeeping_check_update(struct timekeeper *tk, cycle_t offset) | ||
| 135 | { | ||
| 136 | |||
| 137 | cycle_t max_cycles = tk->tkr_mono.clock->max_cycles; | ||
| 138 | const char *name = tk->tkr_mono.clock->name; | ||
| 139 | |||
| 140 | if (offset > max_cycles) { | ||
| 141 | printk_deferred("WARNING: timekeeping: Cycle offset (%lld) is larger than allowed by the '%s' clock's max_cycles value (%lld): time overflow danger\n", | ||
| 142 | offset, name, max_cycles); | ||
| 143 | printk_deferred(" timekeeping: Your kernel is sick, but tries to cope by capping time updates\n"); | ||
| 144 | } else { | ||
| 145 | if (offset > (max_cycles >> 1)) { | ||
| 146 | printk_deferred("INFO: timekeeping: Cycle offset (%lld) is larger than the the '%s' clock's 50%% safety margin (%lld)\n", | ||
| 147 | offset, name, max_cycles >> 1); | ||
| 148 | printk_deferred(" timekeeping: Your kernel is still fine, but is feeling a bit nervous\n"); | ||
| 149 | } | ||
| 150 | } | ||
| 151 | |||
| 152 | if (timekeeping_underflow_seen) { | ||
| 153 | if (jiffies - timekeeping_last_warning > WARNING_FREQ) { | ||
| 154 | printk_deferred("WARNING: Underflow in clocksource '%s' observed, time update ignored.\n", name); | ||
| 155 | printk_deferred(" Please report this, consider using a different clocksource, if possible.\n"); | ||
| 156 | printk_deferred(" Your kernel is probably still fine.\n"); | ||
| 157 | timekeeping_last_warning = jiffies; | ||
| 158 | } | ||
| 159 | timekeeping_underflow_seen = 0; | ||
| 160 | } | ||
| 161 | |||
| 162 | if (timekeeping_overflow_seen) { | ||
| 163 | if (jiffies - timekeeping_last_warning > WARNING_FREQ) { | ||
| 164 | printk_deferred("WARNING: Overflow in clocksource '%s' observed, time update capped.\n", name); | ||
| 165 | printk_deferred(" Please report this, consider using a different clocksource, if possible.\n"); | ||
| 166 | printk_deferred(" Your kernel is probably still fine.\n"); | ||
| 167 | timekeeping_last_warning = jiffies; | ||
| 168 | } | ||
| 169 | timekeeping_overflow_seen = 0; | ||
| 170 | } | ||
| 171 | } | ||
| 172 | |||
| 173 | static inline cycle_t timekeeping_get_delta(struct tk_read_base *tkr) | ||
| 174 | { | ||
| 175 | cycle_t now, last, mask, max, delta; | ||
| 176 | unsigned int seq; | ||
| 177 | |||
| 178 | /* | ||
| 179 | * Since we're called holding a seqlock, the data may shift | ||
| 180 | * under us while we're doing the calculation. This can cause | ||
| 181 | * false positives, since we'd note a problem but throw the | ||
| 182 | * results away. So nest another seqlock here to atomically | ||
| 183 | * grab the points we are checking with. | ||
| 184 | */ | ||
| 185 | do { | ||
| 186 | seq = read_seqcount_begin(&tk_core.seq); | ||
| 187 | now = tkr->read(tkr->clock); | ||
| 188 | last = tkr->cycle_last; | ||
| 189 | mask = tkr->mask; | ||
| 190 | max = tkr->clock->max_cycles; | ||
| 191 | } while (read_seqcount_retry(&tk_core.seq, seq)); | ||
| 192 | |||
| 193 | delta = clocksource_delta(now, last, mask); | ||
| 194 | |||
| 195 | /* | ||
| 196 | * Try to catch underflows by checking if we are seeing small | ||
| 197 | * mask-relative negative values. | ||
| 198 | */ | ||
| 199 | if (unlikely((~delta & mask) < (mask >> 3))) { | ||
| 200 | timekeeping_underflow_seen = 1; | ||
| 201 | delta = 0; | ||
| 202 | } | ||
| 203 | |||
| 204 | /* Cap delta value to the max_cycles values to avoid mult overflows */ | ||
| 205 | if (unlikely(delta > max)) { | ||
| 206 | timekeeping_overflow_seen = 1; | ||
| 207 | delta = tkr->clock->max_cycles; | ||
| 208 | } | ||
| 209 | |||
| 210 | return delta; | ||
| 211 | } | ||
| 212 | #else | ||
| 213 | static inline void timekeeping_check_update(struct timekeeper *tk, cycle_t offset) | ||
| 214 | { | ||
| 215 | } | ||
| 216 | static inline cycle_t timekeeping_get_delta(struct tk_read_base *tkr) | ||
| 217 | { | ||
| 218 | cycle_t cycle_now, delta; | ||
| 219 | |||
| 220 | /* read clocksource */ | ||
| 221 | cycle_now = tkr->read(tkr->clock); | ||
| 222 | |||
| 223 | /* calculate the delta since the last update_wall_time */ | ||
| 224 | delta = clocksource_delta(cycle_now, tkr->cycle_last, tkr->mask); | ||
| 225 | |||
| 226 | return delta; | ||
| 227 | } | ||
| 228 | #endif | ||
| 229 | |||
| 121 | /** | 230 | /** | 
| 122 | * tk_setup_internals - Set up internals to use clocksource clock. | 231 | * tk_setup_internals - Set up internals to use clocksource clock. | 
| 123 | * | 232 | * | 
| @@ -135,11 +244,16 @@ static void tk_setup_internals(struct timekeeper *tk, struct clocksource *clock) | |||
| 135 | u64 tmp, ntpinterval; | 244 | u64 tmp, ntpinterval; | 
| 136 | struct clocksource *old_clock; | 245 | struct clocksource *old_clock; | 
| 137 | 246 | ||
| 138 | old_clock = tk->tkr.clock; | 247 | old_clock = tk->tkr_mono.clock; | 
| 139 | tk->tkr.clock = clock; | 248 | tk->tkr_mono.clock = clock; | 
| 140 | tk->tkr.read = clock->read; | 249 | tk->tkr_mono.read = clock->read; | 
| 141 | tk->tkr.mask = clock->mask; | 250 | tk->tkr_mono.mask = clock->mask; | 
| 142 | tk->tkr.cycle_last = tk->tkr.read(clock); | 251 | tk->tkr_mono.cycle_last = tk->tkr_mono.read(clock); | 
| 252 | |||
| 253 | tk->tkr_raw.clock = clock; | ||
| 254 | tk->tkr_raw.read = clock->read; | ||
| 255 | tk->tkr_raw.mask = clock->mask; | ||
| 256 | tk->tkr_raw.cycle_last = tk->tkr_mono.cycle_last; | ||
| 143 | 257 | ||
| 144 | /* Do the ns -> cycle conversion first, using original mult */ | 258 | /* Do the ns -> cycle conversion first, using original mult */ | 
| 145 | tmp = NTP_INTERVAL_LENGTH; | 259 | tmp = NTP_INTERVAL_LENGTH; | 
| @@ -163,11 +277,14 @@ static void tk_setup_internals(struct timekeeper *tk, struct clocksource *clock) | |||
| 163 | if (old_clock) { | 277 | if (old_clock) { | 
| 164 | int shift_change = clock->shift - old_clock->shift; | 278 | int shift_change = clock->shift - old_clock->shift; | 
| 165 | if (shift_change < 0) | 279 | if (shift_change < 0) | 
| 166 | tk->tkr.xtime_nsec >>= -shift_change; | 280 | tk->tkr_mono.xtime_nsec >>= -shift_change; | 
| 167 | else | 281 | else | 
| 168 | tk->tkr.xtime_nsec <<= shift_change; | 282 | tk->tkr_mono.xtime_nsec <<= shift_change; | 
| 169 | } | 283 | } | 
| 170 | tk->tkr.shift = clock->shift; | 284 | tk->tkr_raw.xtime_nsec = 0; | 
| 285 | |||
| 286 | tk->tkr_mono.shift = clock->shift; | ||
| 287 | tk->tkr_raw.shift = clock->shift; | ||
| 171 | 288 | ||
| 172 | tk->ntp_error = 0; | 289 | tk->ntp_error = 0; | 
| 173 | tk->ntp_error_shift = NTP_SCALE_SHIFT - clock->shift; | 290 | tk->ntp_error_shift = NTP_SCALE_SHIFT - clock->shift; | 
| @@ -178,7 +295,8 @@ static void tk_setup_internals(struct timekeeper *tk, struct clocksource *clock) | |||
| 178 | * active clocksource. These value will be adjusted via NTP | 295 | * active clocksource. These value will be adjusted via NTP | 
| 179 | * to counteract clock drifting. | 296 | * to counteract clock drifting. | 
| 180 | */ | 297 | */ | 
| 181 | tk->tkr.mult = clock->mult; | 298 | tk->tkr_mono.mult = clock->mult; | 
| 299 | tk->tkr_raw.mult = clock->mult; | ||
| 182 | tk->ntp_err_mult = 0; | 300 | tk->ntp_err_mult = 0; | 
| 183 | } | 301 | } | 
| 184 | 302 | ||
| @@ -193,14 +311,10 @@ static inline u32 arch_gettimeoffset(void) { return 0; } | |||
| 193 | 311 | ||
| 194 | static inline s64 timekeeping_get_ns(struct tk_read_base *tkr) | 312 | static inline s64 timekeeping_get_ns(struct tk_read_base *tkr) | 
| 195 | { | 313 | { | 
| 196 | cycle_t cycle_now, delta; | 314 | cycle_t delta; | 
| 197 | s64 nsec; | 315 | s64 nsec; | 
| 198 | 316 | ||
| 199 | /* read clocksource: */ | 317 | delta = timekeeping_get_delta(tkr); | 
| 200 | cycle_now = tkr->read(tkr->clock); | ||
| 201 | |||
| 202 | /* calculate the delta since the last update_wall_time: */ | ||
| 203 | delta = clocksource_delta(cycle_now, tkr->cycle_last, tkr->mask); | ||
| 204 | 318 | ||
| 205 | nsec = delta * tkr->mult + tkr->xtime_nsec; | 319 | nsec = delta * tkr->mult + tkr->xtime_nsec; | 
| 206 | nsec >>= tkr->shift; | 320 | nsec >>= tkr->shift; | 
| @@ -209,25 +323,6 @@ static inline s64 timekeeping_get_ns(struct tk_read_base *tkr) | |||
| 209 | return nsec + arch_gettimeoffset(); | 323 | return nsec + arch_gettimeoffset(); | 
| 210 | } | 324 | } | 
| 211 | 325 | ||
| 212 | static inline s64 timekeeping_get_ns_raw(struct timekeeper *tk) | ||
| 213 | { | ||
| 214 | struct clocksource *clock = tk->tkr.clock; | ||
| 215 | cycle_t cycle_now, delta; | ||
| 216 | s64 nsec; | ||
| 217 | |||
| 218 | /* read clocksource: */ | ||
| 219 | cycle_now = tk->tkr.read(clock); | ||
| 220 | |||
| 221 | /* calculate the delta since the last update_wall_time: */ | ||
| 222 | delta = clocksource_delta(cycle_now, tk->tkr.cycle_last, tk->tkr.mask); | ||
| 223 | |||
| 224 | /* convert delta to nanoseconds. */ | ||
| 225 | nsec = clocksource_cyc2ns(delta, clock->mult, clock->shift); | ||
| 226 | |||
| 227 | /* If arch requires, add in get_arch_timeoffset() */ | ||
| 228 | return nsec + arch_gettimeoffset(); | ||
| 229 | } | ||
| 230 | |||
| 231 | /** | 326 | /** | 
| 232 | * update_fast_timekeeper - Update the fast and NMI safe monotonic timekeeper. | 327 | * update_fast_timekeeper - Update the fast and NMI safe monotonic timekeeper. | 
| 233 | * @tkr: Timekeeping readout base from which we take the update | 328 | * @tkr: Timekeeping readout base from which we take the update | 
| @@ -267,18 +362,18 @@ static inline s64 timekeeping_get_ns_raw(struct timekeeper *tk) | |||
| 267 | * slightly wrong timestamp (a few nanoseconds). See | 362 | * slightly wrong timestamp (a few nanoseconds). See | 
| 268 | * @ktime_get_mono_fast_ns. | 363 | * @ktime_get_mono_fast_ns. | 
| 269 | */ | 364 | */ | 
| 270 | static void update_fast_timekeeper(struct tk_read_base *tkr) | 365 | static void update_fast_timekeeper(struct tk_read_base *tkr, struct tk_fast *tkf) | 
| 271 | { | 366 | { | 
| 272 | struct tk_read_base *base = tk_fast_mono.base; | 367 | struct tk_read_base *base = tkf->base; | 
| 273 | 368 | ||
| 274 | /* Force readers off to base[1] */ | 369 | /* Force readers off to base[1] */ | 
| 275 | raw_write_seqcount_latch(&tk_fast_mono.seq); | 370 | raw_write_seqcount_latch(&tkf->seq); | 
| 276 | 371 | ||
| 277 | /* Update base[0] */ | 372 | /* Update base[0] */ | 
| 278 | memcpy(base, tkr, sizeof(*base)); | 373 | memcpy(base, tkr, sizeof(*base)); | 
| 279 | 374 | ||
| 280 | /* Force readers back to base[0] */ | 375 | /* Force readers back to base[0] */ | 
| 281 | raw_write_seqcount_latch(&tk_fast_mono.seq); | 376 | raw_write_seqcount_latch(&tkf->seq); | 
| 282 | 377 | ||
| 283 | /* Update base[1] */ | 378 | /* Update base[1] */ | 
| 284 | memcpy(base + 1, base, sizeof(*base)); | 379 | memcpy(base + 1, base, sizeof(*base)); | 
| @@ -316,22 +411,33 @@ static void update_fast_timekeeper(struct tk_read_base *tkr) | |||
| 316 | * of the following timestamps. Callers need to be aware of that and | 411 | * of the following timestamps. Callers need to be aware of that and | 
| 317 | * deal with it. | 412 | * deal with it. | 
| 318 | */ | 413 | */ | 
| 319 | u64 notrace ktime_get_mono_fast_ns(void) | 414 | static __always_inline u64 __ktime_get_fast_ns(struct tk_fast *tkf) | 
| 320 | { | 415 | { | 
| 321 | struct tk_read_base *tkr; | 416 | struct tk_read_base *tkr; | 
| 322 | unsigned int seq; | 417 | unsigned int seq; | 
| 323 | u64 now; | 418 | u64 now; | 
| 324 | 419 | ||
| 325 | do { | 420 | do { | 
| 326 | seq = raw_read_seqcount(&tk_fast_mono.seq); | 421 | seq = raw_read_seqcount(&tkf->seq); | 
| 327 | tkr = tk_fast_mono.base + (seq & 0x01); | 422 | tkr = tkf->base + (seq & 0x01); | 
| 328 | now = ktime_to_ns(tkr->base_mono) + timekeeping_get_ns(tkr); | 423 | now = ktime_to_ns(tkr->base) + timekeeping_get_ns(tkr); | 
| 424 | } while (read_seqcount_retry(&tkf->seq, seq)); | ||
| 329 | 425 | ||
| 330 | } while (read_seqcount_retry(&tk_fast_mono.seq, seq)); | ||
| 331 | return now; | 426 | return now; | 
| 332 | } | 427 | } | 
| 428 | |||
| 429 | u64 ktime_get_mono_fast_ns(void) | ||
| 430 | { | ||
| 431 | return __ktime_get_fast_ns(&tk_fast_mono); | ||
| 432 | } | ||
| 333 | EXPORT_SYMBOL_GPL(ktime_get_mono_fast_ns); | 433 | EXPORT_SYMBOL_GPL(ktime_get_mono_fast_ns); | 
| 334 | 434 | ||
| 435 | u64 ktime_get_raw_fast_ns(void) | ||
| 436 | { | ||
| 437 | return __ktime_get_fast_ns(&tk_fast_raw); | ||
| 438 | } | ||
| 439 | EXPORT_SYMBOL_GPL(ktime_get_raw_fast_ns); | ||
| 440 | |||
| 335 | /* Suspend-time cycles value for halted fast timekeeper. */ | 441 | /* Suspend-time cycles value for halted fast timekeeper. */ | 
| 336 | static cycle_t cycles_at_suspend; | 442 | static cycle_t cycles_at_suspend; | 
| 337 | 443 | ||
| @@ -353,12 +459,17 @@ static cycle_t dummy_clock_read(struct clocksource *cs) | |||
| 353 | static void halt_fast_timekeeper(struct timekeeper *tk) | 459 | static void halt_fast_timekeeper(struct timekeeper *tk) | 
| 354 | { | 460 | { | 
| 355 | static struct tk_read_base tkr_dummy; | 461 | static struct tk_read_base tkr_dummy; | 
| 356 | struct tk_read_base *tkr = &tk->tkr; | 462 | struct tk_read_base *tkr = &tk->tkr_mono; | 
| 357 | 463 | ||
| 358 | memcpy(&tkr_dummy, tkr, sizeof(tkr_dummy)); | 464 | memcpy(&tkr_dummy, tkr, sizeof(tkr_dummy)); | 
| 359 | cycles_at_suspend = tkr->read(tkr->clock); | 465 | cycles_at_suspend = tkr->read(tkr->clock); | 
| 360 | tkr_dummy.read = dummy_clock_read; | 466 | tkr_dummy.read = dummy_clock_read; | 
| 361 | update_fast_timekeeper(&tkr_dummy); | 467 | update_fast_timekeeper(&tkr_dummy, &tk_fast_mono); | 
| 468 | |||
| 469 | tkr = &tk->tkr_raw; | ||
| 470 | memcpy(&tkr_dummy, tkr, sizeof(tkr_dummy)); | ||
| 471 | tkr_dummy.read = dummy_clock_read; | ||
| 472 | update_fast_timekeeper(&tkr_dummy, &tk_fast_raw); | ||
| 362 | } | 473 | } | 
| 363 | 474 | ||
| 364 | #ifdef CONFIG_GENERIC_TIME_VSYSCALL_OLD | 475 | #ifdef CONFIG_GENERIC_TIME_VSYSCALL_OLD | 
| @@ -369,8 +480,8 @@ static inline void update_vsyscall(struct timekeeper *tk) | |||
| 369 | 480 | ||
| 370 | xt = timespec64_to_timespec(tk_xtime(tk)); | 481 | xt = timespec64_to_timespec(tk_xtime(tk)); | 
| 371 | wm = timespec64_to_timespec(tk->wall_to_monotonic); | 482 | wm = timespec64_to_timespec(tk->wall_to_monotonic); | 
| 372 | update_vsyscall_old(&xt, &wm, tk->tkr.clock, tk->tkr.mult, | 483 | update_vsyscall_old(&xt, &wm, tk->tkr_mono.clock, tk->tkr_mono.mult, | 
| 373 | tk->tkr.cycle_last); | 484 | tk->tkr_mono.cycle_last); | 
| 374 | } | 485 | } | 
| 375 | 486 | ||
| 376 | static inline void old_vsyscall_fixup(struct timekeeper *tk) | 487 | static inline void old_vsyscall_fixup(struct timekeeper *tk) | 
| @@ -387,11 +498,11 @@ static inline void old_vsyscall_fixup(struct timekeeper *tk) | |||
| 387 | * (shifted nanoseconds), and CONFIG_GENERIC_TIME_VSYSCALL_OLD | 498 | * (shifted nanoseconds), and CONFIG_GENERIC_TIME_VSYSCALL_OLD | 
| 388 | * users are removed, this can be killed. | 499 | * users are removed, this can be killed. | 
| 389 | */ | 500 | */ | 
| 390 | remainder = tk->tkr.xtime_nsec & ((1ULL << tk->tkr.shift) - 1); | 501 | remainder = tk->tkr_mono.xtime_nsec & ((1ULL << tk->tkr_mono.shift) - 1); | 
| 391 | tk->tkr.xtime_nsec -= remainder; | 502 | tk->tkr_mono.xtime_nsec -= remainder; | 
| 392 | tk->tkr.xtime_nsec += 1ULL << tk->tkr.shift; | 503 | tk->tkr_mono.xtime_nsec += 1ULL << tk->tkr_mono.shift; | 
| 393 | tk->ntp_error += remainder << tk->ntp_error_shift; | 504 | tk->ntp_error += remainder << tk->ntp_error_shift; | 
| 394 | tk->ntp_error -= (1ULL << tk->tkr.shift) << tk->ntp_error_shift; | 505 | tk->ntp_error -= (1ULL << tk->tkr_mono.shift) << tk->ntp_error_shift; | 
| 395 | } | 506 | } | 
| 396 | #else | 507 | #else | 
| 397 | #define old_vsyscall_fixup(tk) | 508 | #define old_vsyscall_fixup(tk) | 
| @@ -456,17 +567,17 @@ static inline void tk_update_ktime_data(struct timekeeper *tk) | |||
| 456 | */ | 567 | */ | 
| 457 | seconds = (u64)(tk->xtime_sec + tk->wall_to_monotonic.tv_sec); | 568 | seconds = (u64)(tk->xtime_sec + tk->wall_to_monotonic.tv_sec); | 
| 458 | nsec = (u32) tk->wall_to_monotonic.tv_nsec; | 569 | nsec = (u32) tk->wall_to_monotonic.tv_nsec; | 
| 459 | tk->tkr.base_mono = ns_to_ktime(seconds * NSEC_PER_SEC + nsec); | 570 | tk->tkr_mono.base = ns_to_ktime(seconds * NSEC_PER_SEC + nsec); | 
| 460 | 571 | ||
| 461 | /* Update the monotonic raw base */ | 572 | /* Update the monotonic raw base */ | 
| 462 | tk->base_raw = timespec64_to_ktime(tk->raw_time); | 573 | tk->tkr_raw.base = timespec64_to_ktime(tk->raw_time); | 
| 463 | 574 | ||
| 464 | /* | 575 | /* | 
| 465 | * The sum of the nanoseconds portions of xtime and | 576 | * The sum of the nanoseconds portions of xtime and | 
| 466 | * wall_to_monotonic can be greater/equal one second. Take | 577 | * wall_to_monotonic can be greater/equal one second. Take | 
| 467 | * this into account before updating tk->ktime_sec. | 578 | * this into account before updating tk->ktime_sec. | 
| 468 | */ | 579 | */ | 
| 469 | nsec += (u32)(tk->tkr.xtime_nsec >> tk->tkr.shift); | 580 | nsec += (u32)(tk->tkr_mono.xtime_nsec >> tk->tkr_mono.shift); | 
| 470 | if (nsec >= NSEC_PER_SEC) | 581 | if (nsec >= NSEC_PER_SEC) | 
| 471 | seconds++; | 582 | seconds++; | 
| 472 | tk->ktime_sec = seconds; | 583 | tk->ktime_sec = seconds; | 
| @@ -489,7 +600,8 @@ static void timekeeping_update(struct timekeeper *tk, unsigned int action) | |||
| 489 | memcpy(&shadow_timekeeper, &tk_core.timekeeper, | 600 | memcpy(&shadow_timekeeper, &tk_core.timekeeper, | 
| 490 | sizeof(tk_core.timekeeper)); | 601 | sizeof(tk_core.timekeeper)); | 
| 491 | 602 | ||
| 492 | update_fast_timekeeper(&tk->tkr); | 603 | update_fast_timekeeper(&tk->tkr_mono, &tk_fast_mono); | 
| 604 | update_fast_timekeeper(&tk->tkr_raw, &tk_fast_raw); | ||
| 493 | } | 605 | } | 
| 494 | 606 | ||
| 495 | /** | 607 | /** | 
| @@ -501,22 +613,23 @@ static void timekeeping_update(struct timekeeper *tk, unsigned int action) | |||
| 501 | */ | 613 | */ | 
| 502 | static void timekeeping_forward_now(struct timekeeper *tk) | 614 | static void timekeeping_forward_now(struct timekeeper *tk) | 
| 503 | { | 615 | { | 
| 504 | struct clocksource *clock = tk->tkr.clock; | 616 | struct clocksource *clock = tk->tkr_mono.clock; | 
| 505 | cycle_t cycle_now, delta; | 617 | cycle_t cycle_now, delta; | 
| 506 | s64 nsec; | 618 | s64 nsec; | 
| 507 | 619 | ||
| 508 | cycle_now = tk->tkr.read(clock); | 620 | cycle_now = tk->tkr_mono.read(clock); | 
| 509 | delta = clocksource_delta(cycle_now, tk->tkr.cycle_last, tk->tkr.mask); | 621 | delta = clocksource_delta(cycle_now, tk->tkr_mono.cycle_last, tk->tkr_mono.mask); | 
| 510 | tk->tkr.cycle_last = cycle_now; | 622 | tk->tkr_mono.cycle_last = cycle_now; | 
| 623 | tk->tkr_raw.cycle_last = cycle_now; | ||
| 511 | 624 | ||
| 512 | tk->tkr.xtime_nsec += delta * tk->tkr.mult; | 625 | tk->tkr_mono.xtime_nsec += delta * tk->tkr_mono.mult; | 
| 513 | 626 | ||
| 514 | /* If arch requires, add in get_arch_timeoffset() */ | 627 | /* If arch requires, add in get_arch_timeoffset() */ | 
| 515 | tk->tkr.xtime_nsec += (u64)arch_gettimeoffset() << tk->tkr.shift; | 628 | tk->tkr_mono.xtime_nsec += (u64)arch_gettimeoffset() << tk->tkr_mono.shift; | 
| 516 | 629 | ||
| 517 | tk_normalize_xtime(tk); | 630 | tk_normalize_xtime(tk); | 
| 518 | 631 | ||
| 519 | nsec = clocksource_cyc2ns(delta, clock->mult, clock->shift); | 632 | nsec = clocksource_cyc2ns(delta, tk->tkr_raw.mult, tk->tkr_raw.shift); | 
| 520 | timespec64_add_ns(&tk->raw_time, nsec); | 633 | timespec64_add_ns(&tk->raw_time, nsec); | 
| 521 | } | 634 | } | 
| 522 | 635 | ||
| @@ -537,7 +650,7 @@ int __getnstimeofday64(struct timespec64 *ts) | |||
| 537 | seq = read_seqcount_begin(&tk_core.seq); | 650 | seq = read_seqcount_begin(&tk_core.seq); | 
| 538 | 651 | ||
| 539 | ts->tv_sec = tk->xtime_sec; | 652 | ts->tv_sec = tk->xtime_sec; | 
| 540 | nsecs = timekeeping_get_ns(&tk->tkr); | 653 | nsecs = timekeeping_get_ns(&tk->tkr_mono); | 
| 541 | 654 | ||
| 542 | } while (read_seqcount_retry(&tk_core.seq, seq)); | 655 | } while (read_seqcount_retry(&tk_core.seq, seq)); | 
| 543 | 656 | ||
| @@ -577,8 +690,8 @@ ktime_t ktime_get(void) | |||
| 577 | 690 | ||
| 578 | do { | 691 | do { | 
| 579 | seq = read_seqcount_begin(&tk_core.seq); | 692 | seq = read_seqcount_begin(&tk_core.seq); | 
| 580 | base = tk->tkr.base_mono; | 693 | base = tk->tkr_mono.base; | 
| 581 | nsecs = timekeeping_get_ns(&tk->tkr); | 694 | nsecs = timekeeping_get_ns(&tk->tkr_mono); | 
| 582 | 695 | ||
| 583 | } while (read_seqcount_retry(&tk_core.seq, seq)); | 696 | } while (read_seqcount_retry(&tk_core.seq, seq)); | 
| 584 | 697 | ||
| @@ -603,8 +716,8 @@ ktime_t ktime_get_with_offset(enum tk_offsets offs) | |||
| 603 | 716 | ||
| 604 | do { | 717 | do { | 
| 605 | seq = read_seqcount_begin(&tk_core.seq); | 718 | seq = read_seqcount_begin(&tk_core.seq); | 
| 606 | base = ktime_add(tk->tkr.base_mono, *offset); | 719 | base = ktime_add(tk->tkr_mono.base, *offset); | 
| 607 | nsecs = timekeeping_get_ns(&tk->tkr); | 720 | nsecs = timekeeping_get_ns(&tk->tkr_mono); | 
| 608 | 721 | ||
| 609 | } while (read_seqcount_retry(&tk_core.seq, seq)); | 722 | } while (read_seqcount_retry(&tk_core.seq, seq)); | 
| 610 | 723 | ||
| @@ -645,8 +758,8 @@ ktime_t ktime_get_raw(void) | |||
| 645 | 758 | ||
| 646 | do { | 759 | do { | 
| 647 | seq = read_seqcount_begin(&tk_core.seq); | 760 | seq = read_seqcount_begin(&tk_core.seq); | 
| 648 | base = tk->base_raw; | 761 | base = tk->tkr_raw.base; | 
| 649 | nsecs = timekeeping_get_ns_raw(tk); | 762 | nsecs = timekeeping_get_ns(&tk->tkr_raw); | 
| 650 | 763 | ||
| 651 | } while (read_seqcount_retry(&tk_core.seq, seq)); | 764 | } while (read_seqcount_retry(&tk_core.seq, seq)); | 
| 652 | 765 | ||
| @@ -674,7 +787,7 @@ void ktime_get_ts64(struct timespec64 *ts) | |||
| 674 | do { | 787 | do { | 
| 675 | seq = read_seqcount_begin(&tk_core.seq); | 788 | seq = read_seqcount_begin(&tk_core.seq); | 
| 676 | ts->tv_sec = tk->xtime_sec; | 789 | ts->tv_sec = tk->xtime_sec; | 
| 677 | nsec = timekeeping_get_ns(&tk->tkr); | 790 | nsec = timekeeping_get_ns(&tk->tkr_mono); | 
| 678 | tomono = tk->wall_to_monotonic; | 791 | tomono = tk->wall_to_monotonic; | 
| 679 | 792 | ||
| 680 | } while (read_seqcount_retry(&tk_core.seq, seq)); | 793 | } while (read_seqcount_retry(&tk_core.seq, seq)); | 
| @@ -759,8 +872,8 @@ void getnstime_raw_and_real(struct timespec *ts_raw, struct timespec *ts_real) | |||
| 759 | ts_real->tv_sec = tk->xtime_sec; | 872 | ts_real->tv_sec = tk->xtime_sec; | 
| 760 | ts_real->tv_nsec = 0; | 873 | ts_real->tv_nsec = 0; | 
| 761 | 874 | ||
| 762 | nsecs_raw = timekeeping_get_ns_raw(tk); | 875 | nsecs_raw = timekeeping_get_ns(&tk->tkr_raw); | 
| 763 | nsecs_real = timekeeping_get_ns(&tk->tkr); | 876 | nsecs_real = timekeeping_get_ns(&tk->tkr_mono); | 
| 764 | 877 | ||
| 765 | } while (read_seqcount_retry(&tk_core.seq, seq)); | 878 | } while (read_seqcount_retry(&tk_core.seq, seq)); | 
| 766 | 879 | ||
| @@ -943,7 +1056,7 @@ static int change_clocksource(void *data) | |||
| 943 | */ | 1056 | */ | 
| 944 | if (try_module_get(new->owner)) { | 1057 | if (try_module_get(new->owner)) { | 
| 945 | if (!new->enable || new->enable(new) == 0) { | 1058 | if (!new->enable || new->enable(new) == 0) { | 
| 946 | old = tk->tkr.clock; | 1059 | old = tk->tkr_mono.clock; | 
| 947 | tk_setup_internals(tk, new); | 1060 | tk_setup_internals(tk, new); | 
| 948 | if (old->disable) | 1061 | if (old->disable) | 
| 949 | old->disable(old); | 1062 | old->disable(old); | 
| @@ -971,11 +1084,11 @@ int timekeeping_notify(struct clocksource *clock) | |||
| 971 | { | 1084 | { | 
| 972 | struct timekeeper *tk = &tk_core.timekeeper; | 1085 | struct timekeeper *tk = &tk_core.timekeeper; | 
| 973 | 1086 | ||
| 974 | if (tk->tkr.clock == clock) | 1087 | if (tk->tkr_mono.clock == clock) | 
| 975 | return 0; | 1088 | return 0; | 
| 976 | stop_machine(change_clocksource, clock, NULL); | 1089 | stop_machine(change_clocksource, clock, NULL); | 
| 977 | tick_clock_notify(); | 1090 | tick_clock_notify(); | 
| 978 | return tk->tkr.clock == clock ? 0 : -1; | 1091 | return tk->tkr_mono.clock == clock ? 0 : -1; | 
| 979 | } | 1092 | } | 
| 980 | 1093 | ||
| 981 | /** | 1094 | /** | 
| @@ -993,7 +1106,7 @@ void getrawmonotonic64(struct timespec64 *ts) | |||
| 993 | 1106 | ||
| 994 | do { | 1107 | do { | 
| 995 | seq = read_seqcount_begin(&tk_core.seq); | 1108 | seq = read_seqcount_begin(&tk_core.seq); | 
| 996 | nsecs = timekeeping_get_ns_raw(tk); | 1109 | nsecs = timekeeping_get_ns(&tk->tkr_raw); | 
| 997 | ts64 = tk->raw_time; | 1110 | ts64 = tk->raw_time; | 
| 998 | 1111 | ||
| 999 | } while (read_seqcount_retry(&tk_core.seq, seq)); | 1112 | } while (read_seqcount_retry(&tk_core.seq, seq)); | 
| @@ -1016,7 +1129,7 @@ int timekeeping_valid_for_hres(void) | |||
| 1016 | do { | 1129 | do { | 
| 1017 | seq = read_seqcount_begin(&tk_core.seq); | 1130 | seq = read_seqcount_begin(&tk_core.seq); | 
| 1018 | 1131 | ||
| 1019 | ret = tk->tkr.clock->flags & CLOCK_SOURCE_VALID_FOR_HRES; | 1132 | ret = tk->tkr_mono.clock->flags & CLOCK_SOURCE_VALID_FOR_HRES; | 
| 1020 | 1133 | ||
| 1021 | } while (read_seqcount_retry(&tk_core.seq, seq)); | 1134 | } while (read_seqcount_retry(&tk_core.seq, seq)); | 
| 1022 | 1135 | ||
| @@ -1035,7 +1148,7 @@ u64 timekeeping_max_deferment(void) | |||
| 1035 | do { | 1148 | do { | 
| 1036 | seq = read_seqcount_begin(&tk_core.seq); | 1149 | seq = read_seqcount_begin(&tk_core.seq); | 
| 1037 | 1150 | ||
| 1038 | ret = tk->tkr.clock->max_idle_ns; | 1151 | ret = tk->tkr_mono.clock->max_idle_ns; | 
| 1039 | 1152 | ||
| 1040 | } while (read_seqcount_retry(&tk_core.seq, seq)); | 1153 | } while (read_seqcount_retry(&tk_core.seq, seq)); | 
| 1041 | 1154 | ||
| @@ -1057,6 +1170,14 @@ void __weak read_persistent_clock(struct timespec *ts) | |||
| 1057 | ts->tv_nsec = 0; | 1170 | ts->tv_nsec = 0; | 
| 1058 | } | 1171 | } | 
| 1059 | 1172 | ||
| 1173 | void __weak read_persistent_clock64(struct timespec64 *ts64) | ||
| 1174 | { | ||
| 1175 | struct timespec ts; | ||
| 1176 | |||
| 1177 | read_persistent_clock(&ts); | ||
| 1178 | *ts64 = timespec_to_timespec64(ts); | ||
| 1179 | } | ||
| 1180 | |||
| 1060 | /** | 1181 | /** | 
| 1061 | * read_boot_clock - Return time of the system start. | 1182 | * read_boot_clock - Return time of the system start. | 
| 1062 | * | 1183 | * | 
| @@ -1072,6 +1193,20 @@ void __weak read_boot_clock(struct timespec *ts) | |||
| 1072 | ts->tv_nsec = 0; | 1193 | ts->tv_nsec = 0; | 
| 1073 | } | 1194 | } | 
| 1074 | 1195 | ||
| 1196 | void __weak read_boot_clock64(struct timespec64 *ts64) | ||
| 1197 | { | ||
| 1198 | struct timespec ts; | ||
| 1199 | |||
| 1200 | read_boot_clock(&ts); | ||
| 1201 | *ts64 = timespec_to_timespec64(ts); | ||
| 1202 | } | ||
| 1203 | |||
| 1204 | /* Flag for if timekeeping_resume() has injected sleeptime */ | ||
| 1205 | static bool sleeptime_injected; | ||
| 1206 | |||
| 1207 | /* Flag for if there is a persistent clock on this platform */ | ||
| 1208 | static bool persistent_clock_exists; | ||
| 1209 | |||
| 1075 | /* | 1210 | /* | 
| 1076 | * timekeeping_init - Initializes the clocksource and common timekeeping values | 1211 | * timekeeping_init - Initializes the clocksource and common timekeeping values | 
| 1077 | */ | 1212 | */ | 
| @@ -1081,20 +1216,17 @@ void __init timekeeping_init(void) | |||
| 1081 | struct clocksource *clock; | 1216 | struct clocksource *clock; | 
| 1082 | unsigned long flags; | 1217 | unsigned long flags; | 
| 1083 | struct timespec64 now, boot, tmp; | 1218 | struct timespec64 now, boot, tmp; | 
| 1084 | struct timespec ts; | ||
| 1085 | 1219 | ||
| 1086 | read_persistent_clock(&ts); | 1220 | read_persistent_clock64(&now); | 
| 1087 | now = timespec_to_timespec64(ts); | ||
| 1088 | if (!timespec64_valid_strict(&now)) { | 1221 | if (!timespec64_valid_strict(&now)) { | 
| 1089 | pr_warn("WARNING: Persistent clock returned invalid value!\n" | 1222 | pr_warn("WARNING: Persistent clock returned invalid value!\n" | 
| 1090 | " Check your CMOS/BIOS settings.\n"); | 1223 | " Check your CMOS/BIOS settings.\n"); | 
| 1091 | now.tv_sec = 0; | 1224 | now.tv_sec = 0; | 
| 1092 | now.tv_nsec = 0; | 1225 | now.tv_nsec = 0; | 
| 1093 | } else if (now.tv_sec || now.tv_nsec) | 1226 | } else if (now.tv_sec || now.tv_nsec) | 
| 1094 | persistent_clock_exist = true; | 1227 | persistent_clock_exists = true; | 
| 1095 | 1228 | ||
| 1096 | read_boot_clock(&ts); | 1229 | read_boot_clock64(&boot); | 
| 1097 | boot = timespec_to_timespec64(ts); | ||
| 1098 | if (!timespec64_valid_strict(&boot)) { | 1230 | if (!timespec64_valid_strict(&boot)) { | 
| 1099 | pr_warn("WARNING: Boot clock returned invalid value!\n" | 1231 | pr_warn("WARNING: Boot clock returned invalid value!\n" | 
| 1100 | " Check your CMOS/BIOS settings.\n"); | 1232 | " Check your CMOS/BIOS settings.\n"); | 
| @@ -1114,7 +1246,6 @@ void __init timekeeping_init(void) | |||
| 1114 | tk_set_xtime(tk, &now); | 1246 | tk_set_xtime(tk, &now); | 
| 1115 | tk->raw_time.tv_sec = 0; | 1247 | tk->raw_time.tv_sec = 0; | 
| 1116 | tk->raw_time.tv_nsec = 0; | 1248 | tk->raw_time.tv_nsec = 0; | 
| 1117 | tk->base_raw.tv64 = 0; | ||
| 1118 | if (boot.tv_sec == 0 && boot.tv_nsec == 0) | 1249 | if (boot.tv_sec == 0 && boot.tv_nsec == 0) | 
| 1119 | boot = tk_xtime(tk); | 1250 | boot = tk_xtime(tk); | 
| 1120 | 1251 | ||
| @@ -1127,7 +1258,7 @@ void __init timekeeping_init(void) | |||
| 1127 | raw_spin_unlock_irqrestore(&timekeeper_lock, flags); | 1258 | raw_spin_unlock_irqrestore(&timekeeper_lock, flags); | 
| 1128 | } | 1259 | } | 
| 1129 | 1260 | ||
| 1130 | /* time in seconds when suspend began */ | 1261 | /* time in seconds when suspend began for persistent clock */ | 
| 1131 | static struct timespec64 timekeeping_suspend_time; | 1262 | static struct timespec64 timekeeping_suspend_time; | 
| 1132 | 1263 | ||
| 1133 | /** | 1264 | /** | 
| @@ -1152,12 +1283,49 @@ static void __timekeeping_inject_sleeptime(struct timekeeper *tk, | |||
| 1152 | tk_debug_account_sleep_time(delta); | 1283 | tk_debug_account_sleep_time(delta); | 
| 1153 | } | 1284 | } | 
| 1154 | 1285 | ||
| 1286 | #if defined(CONFIG_PM_SLEEP) && defined(CONFIG_RTC_HCTOSYS_DEVICE) | ||
| 1287 | /** | ||
| 1288 | * We have three kinds of time sources to use for sleep time | ||
| 1289 | * injection, the preference order is: | ||
| 1290 | * 1) non-stop clocksource | ||
| 1291 | * 2) persistent clock (ie: RTC accessible when irqs are off) | ||
| 1292 | * 3) RTC | ||
| 1293 | * | ||
| 1294 | * 1) and 2) are used by timekeeping, 3) by RTC subsystem. | ||
| 1295 | * If system has neither 1) nor 2), 3) will be used finally. | ||
| 1296 | * | ||
| 1297 | * | ||
| 1298 | * If timekeeping has injected sleeptime via either 1) or 2), | ||
| 1299 | * 3) becomes needless, so in this case we don't need to call | ||
| 1300 | * rtc_resume(), and this is what timekeeping_rtc_skipresume() | ||
| 1301 | * means. | ||
| 1302 | */ | ||
| 1303 | bool timekeeping_rtc_skipresume(void) | ||
| 1304 | { | ||
| 1305 | return sleeptime_injected; | ||
| 1306 | } | ||
| 1307 | |||
| 1308 | /** | ||
| 1309 | * 1) can be determined whether to use or not only when doing | ||
| 1310 | * timekeeping_resume() which is invoked after rtc_suspend(), | ||
| 1311 | * so we can't skip rtc_suspend() surely if system has 1). | ||
| 1312 | * | ||
| 1313 | * But if system has 2), 2) will definitely be used, so in this | ||
| 1314 | * case we don't need to call rtc_suspend(), and this is what | ||
| 1315 | * timekeeping_rtc_skipsuspend() means. | ||
| 1316 | */ | ||
| 1317 | bool timekeeping_rtc_skipsuspend(void) | ||
| 1318 | { | ||
| 1319 | return persistent_clock_exists; | ||
| 1320 | } | ||
| 1321 | |||
| 1155 | /** | 1322 | /** | 
| 1156 | * timekeeping_inject_sleeptime64 - Adds suspend interval to timeekeeping values | 1323 | * timekeeping_inject_sleeptime64 - Adds suspend interval to timeekeeping values | 
| 1157 | * @delta: pointer to a timespec64 delta value | 1324 | * @delta: pointer to a timespec64 delta value | 
| 1158 | * | 1325 | * | 
| 1159 | * This hook is for architectures that cannot support read_persistent_clock | 1326 | * This hook is for architectures that cannot support read_persistent_clock64 | 
| 1160 | * because their RTC/persistent clock is only accessible when irqs are enabled. | 1327 | * because their RTC/persistent clock is only accessible when irqs are enabled. | 
| 1328 | * and also don't have an effective nonstop clocksource. | ||
| 1161 | * | 1329 | * | 
| 1162 | * This function should only be called by rtc_resume(), and allows | 1330 | * This function should only be called by rtc_resume(), and allows | 
| 1163 | * a suspend offset to be injected into the timekeeping values. | 1331 | * a suspend offset to be injected into the timekeeping values. | 
| @@ -1167,13 +1335,6 @@ void timekeeping_inject_sleeptime64(struct timespec64 *delta) | |||
| 1167 | struct timekeeper *tk = &tk_core.timekeeper; | 1335 | struct timekeeper *tk = &tk_core.timekeeper; | 
| 1168 | unsigned long flags; | 1336 | unsigned long flags; | 
| 1169 | 1337 | ||
| 1170 | /* | ||
| 1171 | * Make sure we don't set the clock twice, as timekeeping_resume() | ||
| 1172 | * already did it | ||
| 1173 | */ | ||
| 1174 | if (has_persistent_clock()) | ||
| 1175 | return; | ||
| 1176 | |||
| 1177 | raw_spin_lock_irqsave(&timekeeper_lock, flags); | 1338 | raw_spin_lock_irqsave(&timekeeper_lock, flags); | 
| 1178 | write_seqcount_begin(&tk_core.seq); | 1339 | write_seqcount_begin(&tk_core.seq); | 
| 1179 | 1340 | ||
| @@ -1189,26 +1350,21 @@ void timekeeping_inject_sleeptime64(struct timespec64 *delta) | |||
| 1189 | /* signal hrtimers about time change */ | 1350 | /* signal hrtimers about time change */ | 
| 1190 | clock_was_set(); | 1351 | clock_was_set(); | 
| 1191 | } | 1352 | } | 
| 1353 | #endif | ||
| 1192 | 1354 | ||
| 1193 | /** | 1355 | /** | 
| 1194 | * timekeeping_resume - Resumes the generic timekeeping subsystem. | 1356 | * timekeeping_resume - Resumes the generic timekeeping subsystem. | 
| 1195 | * | ||
| 1196 | * This is for the generic clocksource timekeeping. | ||
| 1197 | * xtime/wall_to_monotonic/jiffies/etc are | ||
| 1198 | * still managed by arch specific suspend/resume code. | ||
| 1199 | */ | 1357 | */ | 
| 1200 | void timekeeping_resume(void) | 1358 | void timekeeping_resume(void) | 
| 1201 | { | 1359 | { | 
| 1202 | struct timekeeper *tk = &tk_core.timekeeper; | 1360 | struct timekeeper *tk = &tk_core.timekeeper; | 
| 1203 | struct clocksource *clock = tk->tkr.clock; | 1361 | struct clocksource *clock = tk->tkr_mono.clock; | 
| 1204 | unsigned long flags; | 1362 | unsigned long flags; | 
| 1205 | struct timespec64 ts_new, ts_delta; | 1363 | struct timespec64 ts_new, ts_delta; | 
| 1206 | struct timespec tmp; | ||
| 1207 | cycle_t cycle_now, cycle_delta; | 1364 | cycle_t cycle_now, cycle_delta; | 
| 1208 | bool suspendtime_found = false; | ||
| 1209 | 1365 | ||
| 1210 | read_persistent_clock(&tmp); | 1366 | sleeptime_injected = false; | 
| 1211 | ts_new = timespec_to_timespec64(tmp); | 1367 | read_persistent_clock64(&ts_new); | 
| 1212 | 1368 | ||
| 1213 | clockevents_resume(); | 1369 | clockevents_resume(); | 
| 1214 | clocksource_resume(); | 1370 | clocksource_resume(); | 
| @@ -1228,16 +1384,16 @@ void timekeeping_resume(void) | |||
| 1228 | * The less preferred source will only be tried if there is no better | 1384 | * The less preferred source will only be tried if there is no better | 
| 1229 | * usable source. The rtc part is handled separately in rtc core code. | 1385 | * usable source. The rtc part is handled separately in rtc core code. | 
| 1230 | */ | 1386 | */ | 
| 1231 | cycle_now = tk->tkr.read(clock); | 1387 | cycle_now = tk->tkr_mono.read(clock); | 
| 1232 | if ((clock->flags & CLOCK_SOURCE_SUSPEND_NONSTOP) && | 1388 | if ((clock->flags & CLOCK_SOURCE_SUSPEND_NONSTOP) && | 
| 1233 | cycle_now > tk->tkr.cycle_last) { | 1389 | cycle_now > tk->tkr_mono.cycle_last) { | 
| 1234 | u64 num, max = ULLONG_MAX; | 1390 | u64 num, max = ULLONG_MAX; | 
| 1235 | u32 mult = clock->mult; | 1391 | u32 mult = clock->mult; | 
| 1236 | u32 shift = clock->shift; | 1392 | u32 shift = clock->shift; | 
| 1237 | s64 nsec = 0; | 1393 | s64 nsec = 0; | 
| 1238 | 1394 | ||
| 1239 | cycle_delta = clocksource_delta(cycle_now, tk->tkr.cycle_last, | 1395 | cycle_delta = clocksource_delta(cycle_now, tk->tkr_mono.cycle_last, | 
| 1240 | tk->tkr.mask); | 1396 | tk->tkr_mono.mask); | 
| 1241 | 1397 | ||
| 1242 | /* | 1398 | /* | 
| 1243 | * "cycle_delta * mutl" may cause 64 bits overflow, if the | 1399 | * "cycle_delta * mutl" may cause 64 bits overflow, if the | 
| @@ -1253,17 +1409,19 @@ void timekeeping_resume(void) | |||
| 1253 | nsec += ((u64) cycle_delta * mult) >> shift; | 1409 | nsec += ((u64) cycle_delta * mult) >> shift; | 
| 1254 | 1410 | ||
| 1255 | ts_delta = ns_to_timespec64(nsec); | 1411 | ts_delta = ns_to_timespec64(nsec); | 
| 1256 | suspendtime_found = true; | 1412 | sleeptime_injected = true; | 
| 1257 | } else if (timespec64_compare(&ts_new, &timekeeping_suspend_time) > 0) { | 1413 | } else if (timespec64_compare(&ts_new, &timekeeping_suspend_time) > 0) { | 
| 1258 | ts_delta = timespec64_sub(ts_new, timekeeping_suspend_time); | 1414 | ts_delta = timespec64_sub(ts_new, timekeeping_suspend_time); | 
| 1259 | suspendtime_found = true; | 1415 | sleeptime_injected = true; | 
| 1260 | } | 1416 | } | 
| 1261 | 1417 | ||
| 1262 | if (suspendtime_found) | 1418 | if (sleeptime_injected) | 
| 1263 | __timekeeping_inject_sleeptime(tk, &ts_delta); | 1419 | __timekeeping_inject_sleeptime(tk, &ts_delta); | 
| 1264 | 1420 | ||
| 1265 | /* Re-base the last cycle value */ | 1421 | /* Re-base the last cycle value */ | 
| 1266 | tk->tkr.cycle_last = cycle_now; | 1422 | tk->tkr_mono.cycle_last = cycle_now; | 
| 1423 | tk->tkr_raw.cycle_last = cycle_now; | ||
| 1424 | |||
| 1267 | tk->ntp_error = 0; | 1425 | tk->ntp_error = 0; | 
| 1268 | timekeeping_suspended = 0; | 1426 | timekeeping_suspended = 0; | 
| 1269 | timekeeping_update(tk, TK_MIRROR | TK_CLOCK_WAS_SET); | 1427 | timekeeping_update(tk, TK_MIRROR | TK_CLOCK_WAS_SET); | 
| @@ -1272,9 +1430,7 @@ void timekeeping_resume(void) | |||
| 1272 | 1430 | ||
| 1273 | touch_softlockup_watchdog(); | 1431 | touch_softlockup_watchdog(); | 
| 1274 | 1432 | ||
| 1275 | clockevents_notify(CLOCK_EVT_NOTIFY_RESUME, NULL); | 1433 | tick_resume(); | 
| 1276 | |||
| 1277 | /* Resume hrtimers */ | ||
| 1278 | hrtimers_resume(); | 1434 | hrtimers_resume(); | 
| 1279 | } | 1435 | } | 
| 1280 | 1436 | ||
| @@ -1284,10 +1440,8 @@ int timekeeping_suspend(void) | |||
| 1284 | unsigned long flags; | 1440 | unsigned long flags; | 
| 1285 | struct timespec64 delta, delta_delta; | 1441 | struct timespec64 delta, delta_delta; | 
| 1286 | static struct timespec64 old_delta; | 1442 | static struct timespec64 old_delta; | 
| 1287 | struct timespec tmp; | ||
| 1288 | 1443 | ||
| 1289 | read_persistent_clock(&tmp); | 1444 | read_persistent_clock64(&timekeeping_suspend_time); | 
| 1290 | timekeeping_suspend_time = timespec_to_timespec64(tmp); | ||
| 1291 | 1445 | ||
| 1292 | /* | 1446 | /* | 
| 1293 | * On some systems the persistent_clock can not be detected at | 1447 | * On some systems the persistent_clock can not be detected at | 
| @@ -1295,31 +1449,33 @@ int timekeeping_suspend(void) | |||
| 1295 | * value returned, update the persistent_clock_exists flag. | 1449 | * value returned, update the persistent_clock_exists flag. | 
| 1296 | */ | 1450 | */ | 
| 1297 | if (timekeeping_suspend_time.tv_sec || timekeeping_suspend_time.tv_nsec) | 1451 | if (timekeeping_suspend_time.tv_sec || timekeeping_suspend_time.tv_nsec) | 
| 1298 | persistent_clock_exist = true; | 1452 | persistent_clock_exists = true; | 
| 1299 | 1453 | ||
| 1300 | raw_spin_lock_irqsave(&timekeeper_lock, flags); | 1454 | raw_spin_lock_irqsave(&timekeeper_lock, flags); | 
| 1301 | write_seqcount_begin(&tk_core.seq); | 1455 | write_seqcount_begin(&tk_core.seq); | 
| 1302 | timekeeping_forward_now(tk); | 1456 | timekeeping_forward_now(tk); | 
| 1303 | timekeeping_suspended = 1; | 1457 | timekeeping_suspended = 1; | 
| 1304 | 1458 | ||
| 1305 | /* | 1459 | if (persistent_clock_exists) { | 
| 1306 | * To avoid drift caused by repeated suspend/resumes, | ||
| 1307 | * which each can add ~1 second drift error, | ||
| 1308 | * try to compensate so the difference in system time | ||
| 1309 | * and persistent_clock time stays close to constant. | ||
| 1310 | */ | ||
| 1311 | delta = timespec64_sub(tk_xtime(tk), timekeeping_suspend_time); | ||
| 1312 | delta_delta = timespec64_sub(delta, old_delta); | ||
| 1313 | if (abs(delta_delta.tv_sec) >= 2) { | ||
| 1314 | /* | 1460 | /* | 
| 1315 | * if delta_delta is too large, assume time correction | 1461 | * To avoid drift caused by repeated suspend/resumes, | 
| 1316 | * has occured and set old_delta to the current delta. | 1462 | * which each can add ~1 second drift error, | 
| 1463 | * try to compensate so the difference in system time | ||
| 1464 | * and persistent_clock time stays close to constant. | ||
| 1317 | */ | 1465 | */ | 
| 1318 | old_delta = delta; | 1466 | delta = timespec64_sub(tk_xtime(tk), timekeeping_suspend_time); | 
| 1319 | } else { | 1467 | delta_delta = timespec64_sub(delta, old_delta); | 
| 1320 | /* Otherwise try to adjust old_system to compensate */ | 1468 | if (abs(delta_delta.tv_sec) >= 2) { | 
| 1321 | timekeeping_suspend_time = | 1469 | /* | 
| 1322 | timespec64_add(timekeeping_suspend_time, delta_delta); | 1470 | * if delta_delta is too large, assume time correction | 
| 1471 | * has occurred and set old_delta to the current delta. | ||
| 1472 | */ | ||
| 1473 | old_delta = delta; | ||
| 1474 | } else { | ||
| 1475 | /* Otherwise try to adjust old_system to compensate */ | ||
| 1476 | timekeeping_suspend_time = | ||
| 1477 | timespec64_add(timekeeping_suspend_time, delta_delta); | ||
| 1478 | } | ||
| 1323 | } | 1479 | } | 
| 1324 | 1480 | ||
| 1325 | timekeeping_update(tk, TK_MIRROR); | 1481 | timekeeping_update(tk, TK_MIRROR); | 
| @@ -1327,7 +1483,7 @@ int timekeeping_suspend(void) | |||
| 1327 | write_seqcount_end(&tk_core.seq); | 1483 | write_seqcount_end(&tk_core.seq); | 
| 1328 | raw_spin_unlock_irqrestore(&timekeeper_lock, flags); | 1484 | raw_spin_unlock_irqrestore(&timekeeper_lock, flags); | 
| 1329 | 1485 | ||
| 1330 | clockevents_notify(CLOCK_EVT_NOTIFY_SUSPEND, NULL); | 1486 | tick_suspend(); | 
| 1331 | clocksource_suspend(); | 1487 | clocksource_suspend(); | 
| 1332 | clockevents_suspend(); | 1488 | clockevents_suspend(); | 
| 1333 | 1489 | ||
| @@ -1416,15 +1572,15 @@ static __always_inline void timekeeping_apply_adjustment(struct timekeeper *tk, | |||
| 1416 | * | 1572 | * | 
| 1417 | * XXX - TODO: Doc ntp_error calculation. | 1573 | * XXX - TODO: Doc ntp_error calculation. | 
| 1418 | */ | 1574 | */ | 
| 1419 | if ((mult_adj > 0) && (tk->tkr.mult + mult_adj < mult_adj)) { | 1575 | if ((mult_adj > 0) && (tk->tkr_mono.mult + mult_adj < mult_adj)) { | 
| 1420 | /* NTP adjustment caused clocksource mult overflow */ | 1576 | /* NTP adjustment caused clocksource mult overflow */ | 
| 1421 | WARN_ON_ONCE(1); | 1577 | WARN_ON_ONCE(1); | 
| 1422 | return; | 1578 | return; | 
| 1423 | } | 1579 | } | 
| 1424 | 1580 | ||
| 1425 | tk->tkr.mult += mult_adj; | 1581 | tk->tkr_mono.mult += mult_adj; | 
| 1426 | tk->xtime_interval += interval; | 1582 | tk->xtime_interval += interval; | 
| 1427 | tk->tkr.xtime_nsec -= offset; | 1583 | tk->tkr_mono.xtime_nsec -= offset; | 
| 1428 | tk->ntp_error -= (interval - offset) << tk->ntp_error_shift; | 1584 | tk->ntp_error -= (interval - offset) << tk->ntp_error_shift; | 
| 1429 | } | 1585 | } | 
| 1430 | 1586 | ||
| @@ -1486,13 +1642,13 @@ static void timekeeping_adjust(struct timekeeper *tk, s64 offset) | |||
| 1486 | tk->ntp_err_mult = 0; | 1642 | tk->ntp_err_mult = 0; | 
| 1487 | } | 1643 | } | 
| 1488 | 1644 | ||
| 1489 | if (unlikely(tk->tkr.clock->maxadj && | 1645 | if (unlikely(tk->tkr_mono.clock->maxadj && | 
| 1490 | (abs(tk->tkr.mult - tk->tkr.clock->mult) | 1646 | (abs(tk->tkr_mono.mult - tk->tkr_mono.clock->mult) | 
| 1491 | > tk->tkr.clock->maxadj))) { | 1647 | > tk->tkr_mono.clock->maxadj))) { | 
| 1492 | printk_once(KERN_WARNING | 1648 | printk_once(KERN_WARNING | 
| 1493 | "Adjusting %s more than 11%% (%ld vs %ld)\n", | 1649 | "Adjusting %s more than 11%% (%ld vs %ld)\n", | 
| 1494 | tk->tkr.clock->name, (long)tk->tkr.mult, | 1650 | tk->tkr_mono.clock->name, (long)tk->tkr_mono.mult, | 
| 1495 | (long)tk->tkr.clock->mult + tk->tkr.clock->maxadj); | 1651 | (long)tk->tkr_mono.clock->mult + tk->tkr_mono.clock->maxadj); | 
| 1496 | } | 1652 | } | 
| 1497 | 1653 | ||
| 1498 | /* | 1654 | /* | 
| @@ -1509,9 +1665,9 @@ static void timekeeping_adjust(struct timekeeper *tk, s64 offset) | |||
| 1509 | * We'll correct this error next time through this function, when | 1665 | * We'll correct this error next time through this function, when | 
| 1510 | * xtime_nsec is not as small. | 1666 | * xtime_nsec is not as small. | 
| 1511 | */ | 1667 | */ | 
| 1512 | if (unlikely((s64)tk->tkr.xtime_nsec < 0)) { | 1668 | if (unlikely((s64)tk->tkr_mono.xtime_nsec < 0)) { | 
| 1513 | s64 neg = -(s64)tk->tkr.xtime_nsec; | 1669 | s64 neg = -(s64)tk->tkr_mono.xtime_nsec; | 
| 1514 | tk->tkr.xtime_nsec = 0; | 1670 | tk->tkr_mono.xtime_nsec = 0; | 
| 1515 | tk->ntp_error += neg << tk->ntp_error_shift; | 1671 | tk->ntp_error += neg << tk->ntp_error_shift; | 
| 1516 | } | 1672 | } | 
| 1517 | } | 1673 | } | 
| @@ -1526,13 +1682,13 @@ static void timekeeping_adjust(struct timekeeper *tk, s64 offset) | |||
| 1526 | */ | 1682 | */ | 
| 1527 | static inline unsigned int accumulate_nsecs_to_secs(struct timekeeper *tk) | 1683 | static inline unsigned int accumulate_nsecs_to_secs(struct timekeeper *tk) | 
| 1528 | { | 1684 | { | 
| 1529 | u64 nsecps = (u64)NSEC_PER_SEC << tk->tkr.shift; | 1685 | u64 nsecps = (u64)NSEC_PER_SEC << tk->tkr_mono.shift; | 
| 1530 | unsigned int clock_set = 0; | 1686 | unsigned int clock_set = 0; | 
| 1531 | 1687 | ||
| 1532 | while (tk->tkr.xtime_nsec >= nsecps) { | 1688 | while (tk->tkr_mono.xtime_nsec >= nsecps) { | 
| 1533 | int leap; | 1689 | int leap; | 
| 1534 | 1690 | ||
| 1535 | tk->tkr.xtime_nsec -= nsecps; | 1691 | tk->tkr_mono.xtime_nsec -= nsecps; | 
| 1536 | tk->xtime_sec++; | 1692 | tk->xtime_sec++; | 
| 1537 | 1693 | ||
| 1538 | /* Figure out if its a leap sec and apply if needed */ | 1694 | /* Figure out if its a leap sec and apply if needed */ | 
| @@ -1577,9 +1733,10 @@ static cycle_t logarithmic_accumulation(struct timekeeper *tk, cycle_t offset, | |||
| 1577 | 1733 | ||
| 1578 | /* Accumulate one shifted interval */ | 1734 | /* Accumulate one shifted interval */ | 
| 1579 | offset -= interval; | 1735 | offset -= interval; | 
| 1580 | tk->tkr.cycle_last += interval; | 1736 | tk->tkr_mono.cycle_last += interval; | 
| 1737 | tk->tkr_raw.cycle_last += interval; | ||
| 1581 | 1738 | ||
| 1582 | tk->tkr.xtime_nsec += tk->xtime_interval << shift; | 1739 | tk->tkr_mono.xtime_nsec += tk->xtime_interval << shift; | 
| 1583 | *clock_set |= accumulate_nsecs_to_secs(tk); | 1740 | *clock_set |= accumulate_nsecs_to_secs(tk); | 
| 1584 | 1741 | ||
| 1585 | /* Accumulate raw time */ | 1742 | /* Accumulate raw time */ | 
| @@ -1622,14 +1779,17 @@ void update_wall_time(void) | |||
| 1622 | #ifdef CONFIG_ARCH_USES_GETTIMEOFFSET | 1779 | #ifdef CONFIG_ARCH_USES_GETTIMEOFFSET | 
| 1623 | offset = real_tk->cycle_interval; | 1780 | offset = real_tk->cycle_interval; | 
| 1624 | #else | 1781 | #else | 
| 1625 | offset = clocksource_delta(tk->tkr.read(tk->tkr.clock), | 1782 | offset = clocksource_delta(tk->tkr_mono.read(tk->tkr_mono.clock), | 
| 1626 | tk->tkr.cycle_last, tk->tkr.mask); | 1783 | tk->tkr_mono.cycle_last, tk->tkr_mono.mask); | 
| 1627 | #endif | 1784 | #endif | 
| 1628 | 1785 | ||
| 1629 | /* Check if there's really nothing to do */ | 1786 | /* Check if there's really nothing to do */ | 
| 1630 | if (offset < real_tk->cycle_interval) | 1787 | if (offset < real_tk->cycle_interval) | 
| 1631 | goto out; | 1788 | goto out; | 
| 1632 | 1789 | ||
| 1790 | /* Do some additional sanity checking */ | ||
| 1791 | timekeeping_check_update(real_tk, offset); | ||
| 1792 | |||
| 1633 | /* | 1793 | /* | 
| 1634 | * With NO_HZ we may have to accumulate many cycle_intervals | 1794 | * With NO_HZ we may have to accumulate many cycle_intervals | 
| 1635 | * (think "ticks") worth of time at once. To do this efficiently, | 1795 | * (think "ticks") worth of time at once. To do this efficiently, | 
| @@ -1784,8 +1944,8 @@ ktime_t ktime_get_update_offsets_tick(ktime_t *offs_real, ktime_t *offs_boot, | |||
| 1784 | do { | 1944 | do { | 
| 1785 | seq = read_seqcount_begin(&tk_core.seq); | 1945 | seq = read_seqcount_begin(&tk_core.seq); | 
| 1786 | 1946 | ||
| 1787 | base = tk->tkr.base_mono; | 1947 | base = tk->tkr_mono.base; | 
| 1788 | nsecs = tk->tkr.xtime_nsec >> tk->tkr.shift; | 1948 | nsecs = tk->tkr_mono.xtime_nsec >> tk->tkr_mono.shift; | 
| 1789 | 1949 | ||
| 1790 | *offs_real = tk->offs_real; | 1950 | *offs_real = tk->offs_real; | 
| 1791 | *offs_boot = tk->offs_boot; | 1951 | *offs_boot = tk->offs_boot; | 
| @@ -1816,8 +1976,8 @@ ktime_t ktime_get_update_offsets_now(ktime_t *offs_real, ktime_t *offs_boot, | |||
| 1816 | do { | 1976 | do { | 
| 1817 | seq = read_seqcount_begin(&tk_core.seq); | 1977 | seq = read_seqcount_begin(&tk_core.seq); | 
| 1818 | 1978 | ||
| 1819 | base = tk->tkr.base_mono; | 1979 | base = tk->tkr_mono.base; | 
| 1820 | nsecs = timekeeping_get_ns(&tk->tkr); | 1980 | nsecs = timekeeping_get_ns(&tk->tkr_mono); | 
| 1821 | 1981 | ||
| 1822 | *offs_real = tk->offs_real; | 1982 | *offs_real = tk->offs_real; | 
| 1823 | *offs_boot = tk->offs_boot; | 1983 | *offs_boot = tk->offs_boot; | 
diff --git a/kernel/time/timekeeping.h b/kernel/time/timekeeping.h index 1d91416055d5..ead8794b9a4e 100644 --- a/kernel/time/timekeeping.h +++ b/kernel/time/timekeeping.h  | |||
| @@ -19,4 +19,11 @@ extern void timekeeping_clocktai(struct timespec *ts); | |||
| 19 | extern int timekeeping_suspend(void); | 19 | extern int timekeeping_suspend(void); | 
| 20 | extern void timekeeping_resume(void); | 20 | extern void timekeeping_resume(void); | 
| 21 | 21 | ||
| 22 | extern void do_timer(unsigned long ticks); | ||
| 23 | extern void update_wall_time(void); | ||
| 24 | |||
| 25 | extern seqlock_t jiffies_lock; | ||
| 26 | |||
| 27 | #define CS_NAME_LEN 32 | ||
| 28 | |||
| 22 | #endif | 29 | #endif | 
diff --git a/kernel/time/timer.c b/kernel/time/timer.c index 2d3f5c504939..2ece3aa5069c 100644 --- a/kernel/time/timer.c +++ b/kernel/time/timer.c  | |||
| @@ -90,8 +90,18 @@ struct tvec_base { | |||
| 90 | struct tvec tv5; | 90 | struct tvec tv5; | 
| 91 | } ____cacheline_aligned; | 91 | } ____cacheline_aligned; | 
| 92 | 92 | ||
| 93 | /* | ||
| 94 | * __TIMER_INITIALIZER() needs to set ->base to a valid pointer (because we've | ||
| 95 | * made NULL special, hint: lock_timer_base()) and we cannot get a compile time | ||
| 96 | * pointer to per-cpu entries because we don't know where we'll map the section, | ||
| 97 | * even for the boot cpu. | ||
| 98 | * | ||
| 99 | * And so we use boot_tvec_bases for boot CPU and per-cpu __tvec_bases for the | ||
| 100 | * rest of them. | ||
| 101 | */ | ||
| 93 | struct tvec_base boot_tvec_bases; | 102 | struct tvec_base boot_tvec_bases; | 
| 94 | EXPORT_SYMBOL(boot_tvec_bases); | 103 | EXPORT_SYMBOL(boot_tvec_bases); | 
| 104 | |||
| 95 | static DEFINE_PER_CPU(struct tvec_base *, tvec_bases) = &boot_tvec_bases; | 105 | static DEFINE_PER_CPU(struct tvec_base *, tvec_bases) = &boot_tvec_bases; | 
| 96 | 106 | ||
| 97 | /* Functions below help us manage 'deferrable' flag */ | 107 | /* Functions below help us manage 'deferrable' flag */ | 
| @@ -1027,6 +1037,8 @@ int try_to_del_timer_sync(struct timer_list *timer) | |||
| 1027 | EXPORT_SYMBOL(try_to_del_timer_sync); | 1037 | EXPORT_SYMBOL(try_to_del_timer_sync); | 
| 1028 | 1038 | ||
| 1029 | #ifdef CONFIG_SMP | 1039 | #ifdef CONFIG_SMP | 
| 1040 | static DEFINE_PER_CPU(struct tvec_base, __tvec_bases); | ||
| 1041 | |||
| 1030 | /** | 1042 | /** | 
| 1031 | * del_timer_sync - deactivate a timer and wait for the handler to finish. | 1043 | * del_timer_sync - deactivate a timer and wait for the handler to finish. | 
| 1032 | * @timer: the timer to be deactivated | 1044 | * @timer: the timer to be deactivated | 
| @@ -1532,64 +1544,6 @@ signed long __sched schedule_timeout_uninterruptible(signed long timeout) | |||
| 1532 | } | 1544 | } | 
| 1533 | EXPORT_SYMBOL(schedule_timeout_uninterruptible); | 1545 | EXPORT_SYMBOL(schedule_timeout_uninterruptible); | 
| 1534 | 1546 | ||
| 1535 | static int init_timers_cpu(int cpu) | ||
| 1536 | { | ||
| 1537 | int j; | ||
| 1538 | struct tvec_base *base; | ||
| 1539 | static char tvec_base_done[NR_CPUS]; | ||
| 1540 | |||
| 1541 | if (!tvec_base_done[cpu]) { | ||
| 1542 | static char boot_done; | ||
| 1543 | |||
| 1544 | if (boot_done) { | ||
| 1545 | /* | ||
| 1546 | * The APs use this path later in boot | ||
| 1547 | */ | ||
| 1548 | base = kzalloc_node(sizeof(*base), GFP_KERNEL, | ||
| 1549 | cpu_to_node(cpu)); | ||
| 1550 | if (!base) | ||
| 1551 | return -ENOMEM; | ||
| 1552 | |||
| 1553 | /* Make sure tvec_base has TIMER_FLAG_MASK bits free */ | ||
| 1554 | if (WARN_ON(base != tbase_get_base(base))) { | ||
| 1555 | kfree(base); | ||
| 1556 | return -ENOMEM; | ||
| 1557 | } | ||
| 1558 | per_cpu(tvec_bases, cpu) = base; | ||
| 1559 | } else { | ||
| 1560 | /* | ||
| 1561 | * This is for the boot CPU - we use compile-time | ||
| 1562 | * static initialisation because per-cpu memory isn't | ||
| 1563 | * ready yet and because the memory allocators are not | ||
| 1564 | * initialised either. | ||
| 1565 | */ | ||
| 1566 | boot_done = 1; | ||
| 1567 | base = &boot_tvec_bases; | ||
| 1568 | } | ||
| 1569 | spin_lock_init(&base->lock); | ||
| 1570 | tvec_base_done[cpu] = 1; | ||
| 1571 | base->cpu = cpu; | ||
| 1572 | } else { | ||
| 1573 | base = per_cpu(tvec_bases, cpu); | ||
| 1574 | } | ||
| 1575 | |||
| 1576 | |||
| 1577 | for (j = 0; j < TVN_SIZE; j++) { | ||
| 1578 | INIT_LIST_HEAD(base->tv5.vec + j); | ||
| 1579 | INIT_LIST_HEAD(base->tv4.vec + j); | ||
| 1580 | INIT_LIST_HEAD(base->tv3.vec + j); | ||
| 1581 | INIT_LIST_HEAD(base->tv2.vec + j); | ||
| 1582 | } | ||
| 1583 | for (j = 0; j < TVR_SIZE; j++) | ||
| 1584 | INIT_LIST_HEAD(base->tv1.vec + j); | ||
| 1585 | |||
| 1586 | base->timer_jiffies = jiffies; | ||
| 1587 | base->next_timer = base->timer_jiffies; | ||
| 1588 | base->active_timers = 0; | ||
| 1589 | base->all_timers = 0; | ||
| 1590 | return 0; | ||
| 1591 | } | ||
| 1592 | |||
| 1593 | #ifdef CONFIG_HOTPLUG_CPU | 1547 | #ifdef CONFIG_HOTPLUG_CPU | 
| 1594 | static void migrate_timer_list(struct tvec_base *new_base, struct list_head *head) | 1548 | static void migrate_timer_list(struct tvec_base *new_base, struct list_head *head) | 
| 1595 | { | 1549 | { | 
| @@ -1631,55 +1585,86 @@ static void migrate_timers(int cpu) | |||
| 1631 | migrate_timer_list(new_base, old_base->tv5.vec + i); | 1585 | migrate_timer_list(new_base, old_base->tv5.vec + i); | 
| 1632 | } | 1586 | } | 
| 1633 | 1587 | ||
| 1588 | old_base->active_timers = 0; | ||
| 1589 | old_base->all_timers = 0; | ||
| 1590 | |||
| 1634 | spin_unlock(&old_base->lock); | 1591 | spin_unlock(&old_base->lock); | 
| 1635 | spin_unlock_irq(&new_base->lock); | 1592 | spin_unlock_irq(&new_base->lock); | 
| 1636 | put_cpu_var(tvec_bases); | 1593 | put_cpu_var(tvec_bases); | 
| 1637 | } | 1594 | } | 
| 1638 | #endif /* CONFIG_HOTPLUG_CPU */ | ||
| 1639 | 1595 | ||
| 1640 | static int timer_cpu_notify(struct notifier_block *self, | 1596 | static int timer_cpu_notify(struct notifier_block *self, | 
| 1641 | unsigned long action, void *hcpu) | 1597 | unsigned long action, void *hcpu) | 
| 1642 | { | 1598 | { | 
| 1643 | long cpu = (long)hcpu; | 1599 | switch (action) { | 
| 1644 | int err; | ||
| 1645 | |||
| 1646 | switch(action) { | ||
| 1647 | case CPU_UP_PREPARE: | ||
| 1648 | case CPU_UP_PREPARE_FROZEN: | ||
| 1649 | err = init_timers_cpu(cpu); | ||
| 1650 | if (err < 0) | ||
| 1651 | return notifier_from_errno(err); | ||
| 1652 | break; | ||
| 1653 | #ifdef CONFIG_HOTPLUG_CPU | ||
| 1654 | case CPU_DEAD: | 1600 | case CPU_DEAD: | 
| 1655 | case CPU_DEAD_FROZEN: | 1601 | case CPU_DEAD_FROZEN: | 
| 1656 | migrate_timers(cpu); | 1602 | migrate_timers((long)hcpu); | 
| 1657 | break; | 1603 | break; | 
| 1658 | #endif | ||
| 1659 | default: | 1604 | default: | 
| 1660 | break; | 1605 | break; | 
| 1661 | } | 1606 | } | 
| 1607 | |||
| 1662 | return NOTIFY_OK; | 1608 | return NOTIFY_OK; | 
| 1663 | } | 1609 | } | 
| 1664 | 1610 | ||
| 1665 | static struct notifier_block timers_nb = { | 1611 | static inline void timer_register_cpu_notifier(void) | 
| 1666 | .notifier_call = timer_cpu_notify, | 1612 | { | 
| 1667 | }; | 1613 | cpu_notifier(timer_cpu_notify, 0); | 
| 1614 | } | ||
| 1615 | #else | ||
| 1616 | static inline void timer_register_cpu_notifier(void) { } | ||
| 1617 | #endif /* CONFIG_HOTPLUG_CPU */ | ||
| 1668 | 1618 | ||
| 1619 | static void __init init_timer_cpu(struct tvec_base *base, int cpu) | ||
| 1620 | { | ||
| 1621 | int j; | ||
| 1669 | 1622 | ||
| 1670 | void __init init_timers(void) | 1623 | BUG_ON(base != tbase_get_base(base)); | 
| 1624 | |||
| 1625 | base->cpu = cpu; | ||
| 1626 | per_cpu(tvec_bases, cpu) = base; | ||
| 1627 | spin_lock_init(&base->lock); | ||
| 1628 | |||
| 1629 | for (j = 0; j < TVN_SIZE; j++) { | ||
| 1630 | INIT_LIST_HEAD(base->tv5.vec + j); | ||
| 1631 | INIT_LIST_HEAD(base->tv4.vec + j); | ||
| 1632 | INIT_LIST_HEAD(base->tv3.vec + j); | ||
| 1633 | INIT_LIST_HEAD(base->tv2.vec + j); | ||
| 1634 | } | ||
| 1635 | for (j = 0; j < TVR_SIZE; j++) | ||
| 1636 | INIT_LIST_HEAD(base->tv1.vec + j); | ||
| 1637 | |||
| 1638 | base->timer_jiffies = jiffies; | ||
| 1639 | base->next_timer = base->timer_jiffies; | ||
| 1640 | } | ||
| 1641 | |||
| 1642 | static void __init init_timer_cpus(void) | ||
| 1671 | { | 1643 | { | 
| 1672 | int err; | 1644 | struct tvec_base *base; | 
| 1645 | int local_cpu = smp_processor_id(); | ||
| 1646 | int cpu; | ||
| 1673 | 1647 | ||
| 1648 | for_each_possible_cpu(cpu) { | ||
| 1649 | if (cpu == local_cpu) | ||
| 1650 | base = &boot_tvec_bases; | ||
| 1651 | #ifdef CONFIG_SMP | ||
| 1652 | else | ||
| 1653 | base = per_cpu_ptr(&__tvec_bases, cpu); | ||
| 1654 | #endif | ||
| 1655 | |||
| 1656 | init_timer_cpu(base, cpu); | ||
| 1657 | } | ||
| 1658 | } | ||
| 1659 | |||
| 1660 | void __init init_timers(void) | ||
| 1661 | { | ||
| 1674 | /* ensure there are enough low bits for flags in timer->base pointer */ | 1662 | /* ensure there are enough low bits for flags in timer->base pointer */ | 
| 1675 | BUILD_BUG_ON(__alignof__(struct tvec_base) & TIMER_FLAG_MASK); | 1663 | BUILD_BUG_ON(__alignof__(struct tvec_base) & TIMER_FLAG_MASK); | 
| 1676 | 1664 | ||
| 1677 | err = timer_cpu_notify(&timers_nb, (unsigned long)CPU_UP_PREPARE, | 1665 | init_timer_cpus(); | 
| 1678 | (void *)(long)smp_processor_id()); | ||
| 1679 | BUG_ON(err != NOTIFY_OK); | ||
| 1680 | |||
| 1681 | init_timer_stats(); | 1666 | init_timer_stats(); | 
| 1682 | register_cpu_notifier(&timers_nb); | 1667 | timer_register_cpu_notifier(); | 
| 1683 | open_softirq(TIMER_SOFTIRQ, run_timer_softirq); | 1668 | open_softirq(TIMER_SOFTIRQ, run_timer_softirq); | 
| 1684 | } | 1669 | } | 
| 1685 | 1670 | ||
diff --git a/kernel/time/timer_list.c b/kernel/time/timer_list.c index 61ed862cdd37..e878c2e0ba45 100644 --- a/kernel/time/timer_list.c +++ b/kernel/time/timer_list.c  | |||
| @@ -16,10 +16,10 @@ | |||
| 16 | #include <linux/sched.h> | 16 | #include <linux/sched.h> | 
| 17 | #include <linux/seq_file.h> | 17 | #include <linux/seq_file.h> | 
| 18 | #include <linux/kallsyms.h> | 18 | #include <linux/kallsyms.h> | 
| 19 | #include <linux/tick.h> | ||
| 20 | 19 | ||
| 21 | #include <asm/uaccess.h> | 20 | #include <asm/uaccess.h> | 
| 22 | 21 | ||
| 22 | #include "tick-internal.h" | ||
| 23 | 23 | ||
| 24 | struct timer_list_iter { | 24 | struct timer_list_iter { | 
| 25 | int cpu; | 25 | int cpu; | 
| @@ -228,9 +228,35 @@ print_tickdevice(struct seq_file *m, struct tick_device *td, int cpu) | |||
| 228 | print_name_offset(m, dev->set_next_event); | 228 | print_name_offset(m, dev->set_next_event); | 
| 229 | SEQ_printf(m, "\n"); | 229 | SEQ_printf(m, "\n"); | 
| 230 | 230 | ||
| 231 | SEQ_printf(m, " set_mode: "); | 231 | if (dev->set_mode) { | 
| 232 | print_name_offset(m, dev->set_mode); | 232 | SEQ_printf(m, " set_mode: "); | 
| 233 | SEQ_printf(m, "\n"); | 233 | print_name_offset(m, dev->set_mode); | 
| 234 | SEQ_printf(m, "\n"); | ||
| 235 | } else { | ||
| 236 | if (dev->set_state_shutdown) { | ||
| 237 | SEQ_printf(m, " shutdown: "); | ||
| 238 | print_name_offset(m, dev->set_state_shutdown); | ||
| 239 | SEQ_printf(m, "\n"); | ||
| 240 | } | ||
| 241 | |||
| 242 | if (dev->set_state_periodic) { | ||
| 243 | SEQ_printf(m, " periodic: "); | ||
| 244 | print_name_offset(m, dev->set_state_periodic); | ||
| 245 | SEQ_printf(m, "\n"); | ||
| 246 | } | ||
| 247 | |||
| 248 | if (dev->set_state_oneshot) { | ||
| 249 | SEQ_printf(m, " oneshot: "); | ||
| 250 | print_name_offset(m, dev->set_state_oneshot); | ||
| 251 | SEQ_printf(m, "\n"); | ||
| 252 | } | ||
| 253 | |||
| 254 | if (dev->tick_resume) { | ||
| 255 | SEQ_printf(m, " resume: "); | ||
| 256 | print_name_offset(m, dev->tick_resume); | ||
| 257 | SEQ_printf(m, "\n"); | ||
| 258 | } | ||
| 259 | } | ||
| 234 | 260 | ||
| 235 | SEQ_printf(m, " event_handler: "); | 261 | SEQ_printf(m, " event_handler: "); | 
| 236 | print_name_offset(m, dev->event_handler); | 262 | print_name_offset(m, dev->event_handler); | 
