diff options
| author | Jiri Kosina <jkosina@suse.cz> | 2014-11-20 08:42:02 -0500 |
|---|---|---|
| committer | Jiri Kosina <jkosina@suse.cz> | 2014-11-20 08:42:02 -0500 |
| commit | a02001086bbfb4da35d1228bebc2f1b442db455f (patch) | |
| tree | 62ab47936cef06fd08657ca5b6cd1df98c19be57 /kernel/time | |
| parent | eff264efeeb0898408e8c9df72d8a32621035bed (diff) | |
| parent | fc14f9c1272f62c3e8d01300f52467c0d9af50f9 (diff) | |
Merge Linus' tree to be be to apply submitted patches to newer code than
current trivial.git base
Diffstat (limited to 'kernel/time')
| -rw-r--r-- | kernel/time/alarmtimer.c | 34 | ||||
| -rw-r--r-- | kernel/time/clockevents.c | 2 | ||||
| -rw-r--r-- | kernel/time/hrtimer.c | 23 | ||||
| -rw-r--r-- | kernel/time/posix-cpu-timers.c | 14 | ||||
| -rw-r--r-- | kernel/time/posix-timers.c | 1 | ||||
| -rw-r--r-- | kernel/time/tick-broadcast.c | 2 | ||||
| -rw-r--r-- | kernel/time/tick-common.c | 7 | ||||
| -rw-r--r-- | kernel/time/tick-internal.h | 7 | ||||
| -rw-r--r-- | kernel/time/tick-oneshot.c | 2 | ||||
| -rw-r--r-- | kernel/time/tick-sched.c | 100 | ||||
| -rw-r--r-- | kernel/time/time.c | 56 | ||||
| -rw-r--r-- | kernel/time/timekeeping.c | 10 | ||||
| -rw-r--r-- | kernel/time/timer.c | 4 |
13 files changed, 156 insertions, 106 deletions
diff --git a/kernel/time/alarmtimer.c b/kernel/time/alarmtimer.c index 4aec4a457431..a7077d3ae52f 100644 --- a/kernel/time/alarmtimer.c +++ b/kernel/time/alarmtimer.c | |||
| @@ -464,18 +464,26 @@ static enum alarmtimer_type clock2alarm(clockid_t clockid) | |||
| 464 | static enum alarmtimer_restart alarm_handle_timer(struct alarm *alarm, | 464 | static enum alarmtimer_restart alarm_handle_timer(struct alarm *alarm, |
| 465 | ktime_t now) | 465 | ktime_t now) |
| 466 | { | 466 | { |
| 467 | unsigned long flags; | ||
| 467 | struct k_itimer *ptr = container_of(alarm, struct k_itimer, | 468 | struct k_itimer *ptr = container_of(alarm, struct k_itimer, |
| 468 | it.alarm.alarmtimer); | 469 | it.alarm.alarmtimer); |
| 469 | if (posix_timer_event(ptr, 0) != 0) | 470 | enum alarmtimer_restart result = ALARMTIMER_NORESTART; |
| 470 | ptr->it_overrun++; | 471 | |
| 472 | spin_lock_irqsave(&ptr->it_lock, flags); | ||
| 473 | if ((ptr->it_sigev_notify & ~SIGEV_THREAD_ID) != SIGEV_NONE) { | ||
| 474 | if (posix_timer_event(ptr, 0) != 0) | ||
| 475 | ptr->it_overrun++; | ||
| 476 | } | ||
| 471 | 477 | ||
| 472 | /* Re-add periodic timers */ | 478 | /* Re-add periodic timers */ |
| 473 | if (ptr->it.alarm.interval.tv64) { | 479 | if (ptr->it.alarm.interval.tv64) { |
| 474 | ptr->it_overrun += alarm_forward(alarm, now, | 480 | ptr->it_overrun += alarm_forward(alarm, now, |
| 475 | ptr->it.alarm.interval); | 481 | ptr->it.alarm.interval); |
| 476 | return ALARMTIMER_RESTART; | 482 | result = ALARMTIMER_RESTART; |
| 477 | } | 483 | } |
| 478 | return ALARMTIMER_NORESTART; | 484 | spin_unlock_irqrestore(&ptr->it_lock, flags); |
| 485 | |||
| 486 | return result; | ||
| 479 | } | 487 | } |
| 480 | 488 | ||
| 481 | /** | 489 | /** |
| @@ -541,18 +549,22 @@ static int alarm_timer_create(struct k_itimer *new_timer) | |||
| 541 | * @new_timer: k_itimer pointer | 549 | * @new_timer: k_itimer pointer |
| 542 | * @cur_setting: itimerspec data to fill | 550 | * @cur_setting: itimerspec data to fill |
| 543 | * | 551 | * |
| 544 | * Copies the itimerspec data out from the k_itimer | 552 | * Copies out the current itimerspec data |
| 545 | */ | 553 | */ |
| 546 | static void alarm_timer_get(struct k_itimer *timr, | 554 | static void alarm_timer_get(struct k_itimer *timr, |
| 547 | struct itimerspec *cur_setting) | 555 | struct itimerspec *cur_setting) |
| 548 | { | 556 | { |
| 549 | memset(cur_setting, 0, sizeof(struct itimerspec)); | 557 | ktime_t relative_expiry_time = |
| 558 | alarm_expires_remaining(&(timr->it.alarm.alarmtimer)); | ||
| 559 | |||
| 560 | if (ktime_to_ns(relative_expiry_time) > 0) { | ||
| 561 | cur_setting->it_value = ktime_to_timespec(relative_expiry_time); | ||
| 562 | } else { | ||
| 563 | cur_setting->it_value.tv_sec = 0; | ||
| 564 | cur_setting->it_value.tv_nsec = 0; | ||
| 565 | } | ||
| 550 | 566 | ||
| 551 | cur_setting->it_interval = | 567 | cur_setting->it_interval = ktime_to_timespec(timr->it.alarm.interval); |
| 552 | ktime_to_timespec(timr->it.alarm.interval); | ||
| 553 | cur_setting->it_value = | ||
| 554 | ktime_to_timespec(timr->it.alarm.alarmtimer.node.expires); | ||
| 555 | return; | ||
| 556 | } | 568 | } |
| 557 | 569 | ||
| 558 | /** | 570 | /** |
diff --git a/kernel/time/clockevents.c b/kernel/time/clockevents.c index 9c94c19f1305..55449909f114 100644 --- a/kernel/time/clockevents.c +++ b/kernel/time/clockevents.c | |||
| @@ -72,7 +72,7 @@ static u64 cev_delta2ns(unsigned long latch, struct clock_event_device *evt, | |||
| 72 | * Also omit the add if it would overflow the u64 boundary. | 72 | * Also omit the add if it would overflow the u64 boundary. |
| 73 | */ | 73 | */ |
| 74 | if ((~0ULL - clc > rnd) && | 74 | if ((~0ULL - clc > rnd) && |
| 75 | (!ismax || evt->mult <= (1U << evt->shift))) | 75 | (!ismax || evt->mult <= (1ULL << evt->shift))) |
| 76 | clc += rnd; | 76 | clc += rnd; |
| 77 | 77 | ||
| 78 | do_div(clc, evt->mult); | 78 | do_div(clc, evt->mult); |
diff --git a/kernel/time/hrtimer.c b/kernel/time/hrtimer.c index 1c2fe7de2842..37e50aadd471 100644 --- a/kernel/time/hrtimer.c +++ b/kernel/time/hrtimer.c | |||
| @@ -558,7 +558,7 @@ hrtimer_force_reprogram(struct hrtimer_cpu_base *cpu_base, int skip_equal) | |||
| 558 | static int hrtimer_reprogram(struct hrtimer *timer, | 558 | static int hrtimer_reprogram(struct hrtimer *timer, |
| 559 | struct hrtimer_clock_base *base) | 559 | struct hrtimer_clock_base *base) |
| 560 | { | 560 | { |
| 561 | struct hrtimer_cpu_base *cpu_base = &__get_cpu_var(hrtimer_bases); | 561 | struct hrtimer_cpu_base *cpu_base = this_cpu_ptr(&hrtimer_bases); |
| 562 | ktime_t expires = ktime_sub(hrtimer_get_expires(timer), base->offset); | 562 | ktime_t expires = ktime_sub(hrtimer_get_expires(timer), base->offset); |
| 563 | int res; | 563 | int res; |
| 564 | 564 | ||
| @@ -629,7 +629,7 @@ static inline ktime_t hrtimer_update_base(struct hrtimer_cpu_base *base) | |||
| 629 | */ | 629 | */ |
| 630 | static void retrigger_next_event(void *arg) | 630 | static void retrigger_next_event(void *arg) |
| 631 | { | 631 | { |
| 632 | struct hrtimer_cpu_base *base = &__get_cpu_var(hrtimer_bases); | 632 | struct hrtimer_cpu_base *base = this_cpu_ptr(&hrtimer_bases); |
| 633 | 633 | ||
| 634 | if (!hrtimer_hres_active()) | 634 | if (!hrtimer_hres_active()) |
| 635 | return; | 635 | return; |
| @@ -903,7 +903,7 @@ remove_hrtimer(struct hrtimer *timer, struct hrtimer_clock_base *base) | |||
| 903 | */ | 903 | */ |
| 904 | debug_deactivate(timer); | 904 | debug_deactivate(timer); |
| 905 | timer_stats_hrtimer_clear_start_info(timer); | 905 | timer_stats_hrtimer_clear_start_info(timer); |
| 906 | reprogram = base->cpu_base == &__get_cpu_var(hrtimer_bases); | 906 | reprogram = base->cpu_base == this_cpu_ptr(&hrtimer_bases); |
| 907 | /* | 907 | /* |
| 908 | * We must preserve the CALLBACK state flag here, | 908 | * We must preserve the CALLBACK state flag here, |
| 909 | * otherwise we could move the timer base in | 909 | * otherwise we could move the timer base in |
| @@ -963,7 +963,7 @@ int __hrtimer_start_range_ns(struct hrtimer *timer, ktime_t tim, | |||
| 963 | * on dynticks target. | 963 | * on dynticks target. |
| 964 | */ | 964 | */ |
| 965 | wake_up_nohz_cpu(new_base->cpu_base->cpu); | 965 | wake_up_nohz_cpu(new_base->cpu_base->cpu); |
| 966 | } else if (new_base->cpu_base == &__get_cpu_var(hrtimer_bases) && | 966 | } else if (new_base->cpu_base == this_cpu_ptr(&hrtimer_bases) && |
| 967 | hrtimer_reprogram(timer, new_base)) { | 967 | hrtimer_reprogram(timer, new_base)) { |
| 968 | /* | 968 | /* |
| 969 | * Only allow reprogramming if the new base is on this CPU. | 969 | * Only allow reprogramming if the new base is on this CPU. |
| @@ -1103,7 +1103,7 @@ EXPORT_SYMBOL_GPL(hrtimer_get_remaining); | |||
| 1103 | */ | 1103 | */ |
| 1104 | ktime_t hrtimer_get_next_event(void) | 1104 | ktime_t hrtimer_get_next_event(void) |
| 1105 | { | 1105 | { |
| 1106 | struct hrtimer_cpu_base *cpu_base = &__get_cpu_var(hrtimer_bases); | 1106 | struct hrtimer_cpu_base *cpu_base = this_cpu_ptr(&hrtimer_bases); |
| 1107 | struct hrtimer_clock_base *base = cpu_base->clock_base; | 1107 | struct hrtimer_clock_base *base = cpu_base->clock_base; |
| 1108 | ktime_t delta, mindelta = { .tv64 = KTIME_MAX }; | 1108 | ktime_t delta, mindelta = { .tv64 = KTIME_MAX }; |
| 1109 | unsigned long flags; | 1109 | unsigned long flags; |
| @@ -1144,7 +1144,7 @@ static void __hrtimer_init(struct hrtimer *timer, clockid_t clock_id, | |||
| 1144 | 1144 | ||
| 1145 | memset(timer, 0, sizeof(struct hrtimer)); | 1145 | memset(timer, 0, sizeof(struct hrtimer)); |
| 1146 | 1146 | ||
| 1147 | cpu_base = &__raw_get_cpu_var(hrtimer_bases); | 1147 | cpu_base = raw_cpu_ptr(&hrtimer_bases); |
| 1148 | 1148 | ||
| 1149 | if (clock_id == CLOCK_REALTIME && mode != HRTIMER_MODE_ABS) | 1149 | if (clock_id == CLOCK_REALTIME && mode != HRTIMER_MODE_ABS) |
| 1150 | clock_id = CLOCK_MONOTONIC; | 1150 | clock_id = CLOCK_MONOTONIC; |
| @@ -1187,7 +1187,7 @@ int hrtimer_get_res(const clockid_t which_clock, struct timespec *tp) | |||
| 1187 | struct hrtimer_cpu_base *cpu_base; | 1187 | struct hrtimer_cpu_base *cpu_base; |
| 1188 | int base = hrtimer_clockid_to_base(which_clock); | 1188 | int base = hrtimer_clockid_to_base(which_clock); |
| 1189 | 1189 | ||
| 1190 | cpu_base = &__raw_get_cpu_var(hrtimer_bases); | 1190 | cpu_base = raw_cpu_ptr(&hrtimer_bases); |
| 1191 | *tp = ktime_to_timespec(cpu_base->clock_base[base].resolution); | 1191 | *tp = ktime_to_timespec(cpu_base->clock_base[base].resolution); |
| 1192 | 1192 | ||
| 1193 | return 0; | 1193 | return 0; |
| @@ -1242,7 +1242,7 @@ static void __run_hrtimer(struct hrtimer *timer, ktime_t *now) | |||
| 1242 | */ | 1242 | */ |
| 1243 | void hrtimer_interrupt(struct clock_event_device *dev) | 1243 | void hrtimer_interrupt(struct clock_event_device *dev) |
| 1244 | { | 1244 | { |
| 1245 | struct hrtimer_cpu_base *cpu_base = &__get_cpu_var(hrtimer_bases); | 1245 | struct hrtimer_cpu_base *cpu_base = this_cpu_ptr(&hrtimer_bases); |
| 1246 | ktime_t expires_next, now, entry_time, delta; | 1246 | ktime_t expires_next, now, entry_time, delta; |
| 1247 | int i, retries = 0; | 1247 | int i, retries = 0; |
| 1248 | 1248 | ||
| @@ -1376,7 +1376,7 @@ static void __hrtimer_peek_ahead_timers(void) | |||
| 1376 | if (!hrtimer_hres_active()) | 1376 | if (!hrtimer_hres_active()) |
| 1377 | return; | 1377 | return; |
| 1378 | 1378 | ||
| 1379 | td = &__get_cpu_var(tick_cpu_device); | 1379 | td = this_cpu_ptr(&tick_cpu_device); |
| 1380 | if (td && td->evtdev) | 1380 | if (td && td->evtdev) |
| 1381 | hrtimer_interrupt(td->evtdev); | 1381 | hrtimer_interrupt(td->evtdev); |
| 1382 | } | 1382 | } |
| @@ -1440,7 +1440,7 @@ void hrtimer_run_pending(void) | |||
| 1440 | void hrtimer_run_queues(void) | 1440 | void hrtimer_run_queues(void) |
| 1441 | { | 1441 | { |
| 1442 | struct timerqueue_node *node; | 1442 | struct timerqueue_node *node; |
| 1443 | struct hrtimer_cpu_base *cpu_base = &__get_cpu_var(hrtimer_bases); | 1443 | struct hrtimer_cpu_base *cpu_base = this_cpu_ptr(&hrtimer_bases); |
| 1444 | struct hrtimer_clock_base *base; | 1444 | struct hrtimer_clock_base *base; |
| 1445 | int index, gettime = 1; | 1445 | int index, gettime = 1; |
| 1446 | 1446 | ||
| @@ -1679,7 +1679,7 @@ static void migrate_hrtimers(int scpu) | |||
| 1679 | 1679 | ||
| 1680 | local_irq_disable(); | 1680 | local_irq_disable(); |
| 1681 | old_base = &per_cpu(hrtimer_bases, scpu); | 1681 | old_base = &per_cpu(hrtimer_bases, scpu); |
| 1682 | new_base = &__get_cpu_var(hrtimer_bases); | 1682 | new_base = this_cpu_ptr(&hrtimer_bases); |
| 1683 | /* | 1683 | /* |
| 1684 | * The caller is globally serialized and nobody else | 1684 | * The caller is globally serialized and nobody else |
| 1685 | * takes two locks at once, deadlock is not possible. | 1685 | * takes two locks at once, deadlock is not possible. |
| @@ -1776,7 +1776,6 @@ schedule_hrtimeout_range_clock(ktime_t *expires, unsigned long delta, | |||
| 1776 | */ | 1776 | */ |
| 1777 | if (!expires) { | 1777 | if (!expires) { |
| 1778 | schedule(); | 1778 | schedule(); |
| 1779 | __set_current_state(TASK_RUNNING); | ||
| 1780 | return -EINTR; | 1779 | return -EINTR; |
| 1781 | } | 1780 | } |
| 1782 | 1781 | ||
diff --git a/kernel/time/posix-cpu-timers.c b/kernel/time/posix-cpu-timers.c index 3b8946416a5f..492b986195d5 100644 --- a/kernel/time/posix-cpu-timers.c +++ b/kernel/time/posix-cpu-timers.c | |||
| @@ -272,22 +272,8 @@ static int posix_cpu_clock_get_task(struct task_struct *tsk, | |||
| 272 | if (same_thread_group(tsk, current)) | 272 | if (same_thread_group(tsk, current)) |
| 273 | err = cpu_clock_sample(which_clock, tsk, &rtn); | 273 | err = cpu_clock_sample(which_clock, tsk, &rtn); |
| 274 | } else { | 274 | } else { |
| 275 | unsigned long flags; | ||
| 276 | struct sighand_struct *sighand; | ||
| 277 | |||
| 278 | /* | ||
| 279 | * while_each_thread() is not yet entirely RCU safe, | ||
| 280 | * keep locking the group while sampling process | ||
| 281 | * clock for now. | ||
| 282 | */ | ||
| 283 | sighand = lock_task_sighand(tsk, &flags); | ||
| 284 | if (!sighand) | ||
| 285 | return err; | ||
| 286 | |||
| 287 | if (tsk == current || thread_group_leader(tsk)) | 275 | if (tsk == current || thread_group_leader(tsk)) |
| 288 | err = cpu_clock_sample_group(which_clock, tsk, &rtn); | 276 | err = cpu_clock_sample_group(which_clock, tsk, &rtn); |
| 289 | |||
| 290 | unlock_task_sighand(tsk, &flags); | ||
| 291 | } | 277 | } |
| 292 | 278 | ||
| 293 | if (!err) | 279 | if (!err) |
diff --git a/kernel/time/posix-timers.c b/kernel/time/posix-timers.c index 42b463ad90f2..31ea01f42e1f 100644 --- a/kernel/time/posix-timers.c +++ b/kernel/time/posix-timers.c | |||
| @@ -636,6 +636,7 @@ SYSCALL_DEFINE3(timer_create, const clockid_t, which_clock, | |||
| 636 | goto out; | 636 | goto out; |
| 637 | } | 637 | } |
| 638 | } else { | 638 | } else { |
| 639 | memset(&event.sigev_value, 0, sizeof(event.sigev_value)); | ||
| 639 | event.sigev_notify = SIGEV_SIGNAL; | 640 | event.sigev_notify = SIGEV_SIGNAL; |
| 640 | event.sigev_signo = SIGALRM; | 641 | event.sigev_signo = SIGALRM; |
| 641 | event.sigev_value.sival_int = new_timer->it_id; | 642 | event.sigev_value.sival_int = new_timer->it_id; |
diff --git a/kernel/time/tick-broadcast.c b/kernel/time/tick-broadcast.c index 64c5990fd500..066f0ec05e48 100644 --- a/kernel/time/tick-broadcast.c +++ b/kernel/time/tick-broadcast.c | |||
| @@ -554,7 +554,7 @@ int tick_resume_broadcast_oneshot(struct clock_event_device *bc) | |||
| 554 | void tick_check_oneshot_broadcast_this_cpu(void) | 554 | void tick_check_oneshot_broadcast_this_cpu(void) |
| 555 | { | 555 | { |
| 556 | if (cpumask_test_cpu(smp_processor_id(), tick_broadcast_oneshot_mask)) { | 556 | if (cpumask_test_cpu(smp_processor_id(), tick_broadcast_oneshot_mask)) { |
| 557 | struct tick_device *td = &__get_cpu_var(tick_cpu_device); | 557 | struct tick_device *td = this_cpu_ptr(&tick_cpu_device); |
| 558 | 558 | ||
| 559 | /* | 559 | /* |
| 560 | * We might be in the middle of switching over from | 560 | * We might be in the middle of switching over from |
diff --git a/kernel/time/tick-common.c b/kernel/time/tick-common.c index 0a0608edeb26..7efeedf53ebd 100644 --- a/kernel/time/tick-common.c +++ b/kernel/time/tick-common.c | |||
| @@ -224,7 +224,7 @@ static void tick_setup_device(struct tick_device *td, | |||
| 224 | 224 | ||
| 225 | void tick_install_replacement(struct clock_event_device *newdev) | 225 | void tick_install_replacement(struct clock_event_device *newdev) |
| 226 | { | 226 | { |
| 227 | struct tick_device *td = &__get_cpu_var(tick_cpu_device); | 227 | struct tick_device *td = this_cpu_ptr(&tick_cpu_device); |
| 228 | int cpu = smp_processor_id(); | 228 | int cpu = smp_processor_id(); |
| 229 | 229 | ||
| 230 | clockevents_exchange_device(td->evtdev, newdev); | 230 | clockevents_exchange_device(td->evtdev, newdev); |
| @@ -374,14 +374,14 @@ void tick_shutdown(unsigned int *cpup) | |||
| 374 | 374 | ||
| 375 | void tick_suspend(void) | 375 | void tick_suspend(void) |
| 376 | { | 376 | { |
| 377 | struct tick_device *td = &__get_cpu_var(tick_cpu_device); | 377 | struct tick_device *td = this_cpu_ptr(&tick_cpu_device); |
| 378 | 378 | ||
| 379 | clockevents_shutdown(td->evtdev); | 379 | clockevents_shutdown(td->evtdev); |
| 380 | } | 380 | } |
| 381 | 381 | ||
| 382 | void tick_resume(void) | 382 | void tick_resume(void) |
| 383 | { | 383 | { |
| 384 | struct tick_device *td = &__get_cpu_var(tick_cpu_device); | 384 | struct tick_device *td = this_cpu_ptr(&tick_cpu_device); |
| 385 | int broadcast = tick_resume_broadcast(); | 385 | int broadcast = tick_resume_broadcast(); |
| 386 | 386 | ||
| 387 | clockevents_set_mode(td->evtdev, CLOCK_EVT_MODE_RESUME); | 387 | clockevents_set_mode(td->evtdev, CLOCK_EVT_MODE_RESUME); |
| @@ -400,4 +400,5 @@ void tick_resume(void) | |||
| 400 | void __init tick_init(void) | 400 | void __init tick_init(void) |
| 401 | { | 401 | { |
| 402 | tick_broadcast_init(); | 402 | tick_broadcast_init(); |
| 403 | tick_nohz_init(); | ||
| 403 | } | 404 | } |
diff --git a/kernel/time/tick-internal.h b/kernel/time/tick-internal.h index c19c1d84b6f3..366aeb4f2c66 100644 --- a/kernel/time/tick-internal.h +++ b/kernel/time/tick-internal.h | |||
| @@ -99,6 +99,13 @@ static inline int tick_broadcast_oneshot_active(void) { return 0; } | |||
| 99 | static inline bool tick_broadcast_oneshot_available(void) { return false; } | 99 | static inline bool tick_broadcast_oneshot_available(void) { return false; } |
| 100 | #endif /* !TICK_ONESHOT */ | 100 | #endif /* !TICK_ONESHOT */ |
| 101 | 101 | ||
| 102 | /* NO_HZ_FULL internal */ | ||
| 103 | #ifdef CONFIG_NO_HZ_FULL | ||
| 104 | extern void tick_nohz_init(void); | ||
| 105 | # else | ||
| 106 | static inline void tick_nohz_init(void) { } | ||
| 107 | #endif | ||
| 108 | |||
| 102 | /* | 109 | /* |
| 103 | * Broadcasting support | 110 | * Broadcasting support |
| 104 | */ | 111 | */ |
diff --git a/kernel/time/tick-oneshot.c b/kernel/time/tick-oneshot.c index 824109060a33..7ce740e78e1b 100644 --- a/kernel/time/tick-oneshot.c +++ b/kernel/time/tick-oneshot.c | |||
| @@ -59,7 +59,7 @@ void tick_setup_oneshot(struct clock_event_device *newdev, | |||
| 59 | */ | 59 | */ |
| 60 | int tick_switch_to_oneshot(void (*handler)(struct clock_event_device *)) | 60 | int tick_switch_to_oneshot(void (*handler)(struct clock_event_device *)) |
| 61 | { | 61 | { |
| 62 | struct tick_device *td = &__get_cpu_var(tick_cpu_device); | 62 | struct tick_device *td = this_cpu_ptr(&tick_cpu_device); |
| 63 | struct clock_event_device *dev = td->evtdev; | 63 | struct clock_event_device *dev = td->evtdev; |
| 64 | 64 | ||
| 65 | if (!dev || !(dev->features & CLOCK_EVT_FEAT_ONESHOT) || | 65 | if (!dev || !(dev->features & CLOCK_EVT_FEAT_ONESHOT) || |
diff --git a/kernel/time/tick-sched.c b/kernel/time/tick-sched.c index 99aa6ee3908f..7b5741fc4110 100644 --- a/kernel/time/tick-sched.c +++ b/kernel/time/tick-sched.c | |||
| @@ -205,7 +205,7 @@ static void tick_nohz_restart_sched_tick(struct tick_sched *ts, ktime_t now); | |||
| 205 | */ | 205 | */ |
| 206 | void __tick_nohz_full_check(void) | 206 | void __tick_nohz_full_check(void) |
| 207 | { | 207 | { |
| 208 | struct tick_sched *ts = &__get_cpu_var(tick_cpu_sched); | 208 | struct tick_sched *ts = this_cpu_ptr(&tick_cpu_sched); |
| 209 | 209 | ||
| 210 | if (tick_nohz_full_cpu(smp_processor_id())) { | 210 | if (tick_nohz_full_cpu(smp_processor_id())) { |
| 211 | if (ts->tick_stopped && !is_idle_task(current)) { | 211 | if (ts->tick_stopped && !is_idle_task(current)) { |
| @@ -225,6 +225,20 @@ static DEFINE_PER_CPU(struct irq_work, nohz_full_kick_work) = { | |||
| 225 | }; | 225 | }; |
| 226 | 226 | ||
| 227 | /* | 227 | /* |
| 228 | * Kick this CPU if it's full dynticks in order to force it to | ||
| 229 | * re-evaluate its dependency on the tick and restart it if necessary. | ||
| 230 | * This kick, unlike tick_nohz_full_kick_cpu() and tick_nohz_full_kick_all(), | ||
| 231 | * is NMI safe. | ||
| 232 | */ | ||
| 233 | void tick_nohz_full_kick(void) | ||
| 234 | { | ||
| 235 | if (!tick_nohz_full_cpu(smp_processor_id())) | ||
| 236 | return; | ||
| 237 | |||
| 238 | irq_work_queue(&__get_cpu_var(nohz_full_kick_work)); | ||
| 239 | } | ||
| 240 | |||
| 241 | /* | ||
| 228 | * Kick the CPU if it's full dynticks in order to force it to | 242 | * Kick the CPU if it's full dynticks in order to force it to |
| 229 | * re-evaluate its dependency on the tick and restart it if necessary. | 243 | * re-evaluate its dependency on the tick and restart it if necessary. |
| 230 | */ | 244 | */ |
| @@ -281,22 +295,12 @@ out: | |||
| 281 | /* Parse the boot-time nohz CPU list from the kernel parameters. */ | 295 | /* Parse the boot-time nohz CPU list from the kernel parameters. */ |
| 282 | static int __init tick_nohz_full_setup(char *str) | 296 | static int __init tick_nohz_full_setup(char *str) |
| 283 | { | 297 | { |
| 284 | int cpu; | ||
| 285 | |||
| 286 | alloc_bootmem_cpumask_var(&tick_nohz_full_mask); | 298 | alloc_bootmem_cpumask_var(&tick_nohz_full_mask); |
| 287 | alloc_bootmem_cpumask_var(&housekeeping_mask); | ||
| 288 | if (cpulist_parse(str, tick_nohz_full_mask) < 0) { | 299 | if (cpulist_parse(str, tick_nohz_full_mask) < 0) { |
| 289 | pr_warning("NOHZ: Incorrect nohz_full cpumask\n"); | 300 | pr_warning("NOHZ: Incorrect nohz_full cpumask\n"); |
| 301 | free_bootmem_cpumask_var(tick_nohz_full_mask); | ||
| 290 | return 1; | 302 | return 1; |
| 291 | } | 303 | } |
| 292 | |||
| 293 | cpu = smp_processor_id(); | ||
| 294 | if (cpumask_test_cpu(cpu, tick_nohz_full_mask)) { | ||
| 295 | pr_warning("NO_HZ: Clearing %d from nohz_full range for timekeeping\n", cpu); | ||
| 296 | cpumask_clear_cpu(cpu, tick_nohz_full_mask); | ||
| 297 | } | ||
| 298 | cpumask_andnot(housekeeping_mask, | ||
| 299 | cpu_possible_mask, tick_nohz_full_mask); | ||
| 300 | tick_nohz_full_running = true; | 304 | tick_nohz_full_running = true; |
| 301 | 305 | ||
| 302 | return 1; | 306 | return 1; |
| @@ -335,18 +339,11 @@ static int tick_nohz_init_all(void) | |||
| 335 | 339 | ||
| 336 | #ifdef CONFIG_NO_HZ_FULL_ALL | 340 | #ifdef CONFIG_NO_HZ_FULL_ALL |
| 337 | if (!alloc_cpumask_var(&tick_nohz_full_mask, GFP_KERNEL)) { | 341 | if (!alloc_cpumask_var(&tick_nohz_full_mask, GFP_KERNEL)) { |
| 338 | pr_err("NO_HZ: Can't allocate full dynticks cpumask\n"); | 342 | WARN(1, "NO_HZ: Can't allocate full dynticks cpumask\n"); |
| 339 | return err; | ||
| 340 | } | ||
| 341 | if (!alloc_cpumask_var(&housekeeping_mask, GFP_KERNEL)) { | ||
| 342 | pr_err("NO_HZ: Can't allocate not-full dynticks cpumask\n"); | ||
| 343 | return err; | 343 | return err; |
| 344 | } | 344 | } |
| 345 | err = 0; | 345 | err = 0; |
| 346 | cpumask_setall(tick_nohz_full_mask); | 346 | cpumask_setall(tick_nohz_full_mask); |
| 347 | cpumask_clear_cpu(smp_processor_id(), tick_nohz_full_mask); | ||
| 348 | cpumask_clear(housekeeping_mask); | ||
| 349 | cpumask_set_cpu(smp_processor_id(), housekeeping_mask); | ||
| 350 | tick_nohz_full_running = true; | 347 | tick_nohz_full_running = true; |
| 351 | #endif | 348 | #endif |
| 352 | return err; | 349 | return err; |
| @@ -361,6 +358,37 @@ void __init tick_nohz_init(void) | |||
| 361 | return; | 358 | return; |
| 362 | } | 359 | } |
| 363 | 360 | ||
| 361 | if (!alloc_cpumask_var(&housekeeping_mask, GFP_KERNEL)) { | ||
| 362 | WARN(1, "NO_HZ: Can't allocate not-full dynticks cpumask\n"); | ||
| 363 | cpumask_clear(tick_nohz_full_mask); | ||
| 364 | tick_nohz_full_running = false; | ||
| 365 | return; | ||
| 366 | } | ||
| 367 | |||
| 368 | /* | ||
| 369 | * Full dynticks uses irq work to drive the tick rescheduling on safe | ||
| 370 | * locking contexts. But then we need irq work to raise its own | ||
| 371 | * interrupts to avoid circular dependency on the tick | ||
| 372 | */ | ||
| 373 | if (!arch_irq_work_has_interrupt()) { | ||
| 374 | pr_warning("NO_HZ: Can't run full dynticks because arch doesn't " | ||
| 375 | "support irq work self-IPIs\n"); | ||
| 376 | cpumask_clear(tick_nohz_full_mask); | ||
| 377 | cpumask_copy(housekeeping_mask, cpu_possible_mask); | ||
| 378 | tick_nohz_full_running = false; | ||
| 379 | return; | ||
| 380 | } | ||
| 381 | |||
| 382 | cpu = smp_processor_id(); | ||
| 383 | |||
| 384 | if (cpumask_test_cpu(cpu, tick_nohz_full_mask)) { | ||
| 385 | pr_warning("NO_HZ: Clearing %d from nohz_full range for timekeeping\n", cpu); | ||
| 386 | cpumask_clear_cpu(cpu, tick_nohz_full_mask); | ||
| 387 | } | ||
| 388 | |||
| 389 | cpumask_andnot(housekeeping_mask, | ||
| 390 | cpu_possible_mask, tick_nohz_full_mask); | ||
| 391 | |||
| 364 | for_each_cpu(cpu, tick_nohz_full_mask) | 392 | for_each_cpu(cpu, tick_nohz_full_mask) |
| 365 | context_tracking_cpu_set(cpu); | 393 | context_tracking_cpu_set(cpu); |
| 366 | 394 | ||
| @@ -545,7 +573,7 @@ static ktime_t tick_nohz_stop_sched_tick(struct tick_sched *ts, | |||
| 545 | unsigned long seq, last_jiffies, next_jiffies, delta_jiffies; | 573 | unsigned long seq, last_jiffies, next_jiffies, delta_jiffies; |
| 546 | ktime_t last_update, expires, ret = { .tv64 = 0 }; | 574 | ktime_t last_update, expires, ret = { .tv64 = 0 }; |
| 547 | unsigned long rcu_delta_jiffies; | 575 | unsigned long rcu_delta_jiffies; |
| 548 | struct clock_event_device *dev = __get_cpu_var(tick_cpu_device).evtdev; | 576 | struct clock_event_device *dev = __this_cpu_read(tick_cpu_device.evtdev); |
| 549 | u64 time_delta; | 577 | u64 time_delta; |
| 550 | 578 | ||
| 551 | time_delta = timekeeping_max_deferment(); | 579 | time_delta = timekeeping_max_deferment(); |
| @@ -558,7 +586,7 @@ static ktime_t tick_nohz_stop_sched_tick(struct tick_sched *ts, | |||
| 558 | } while (read_seqretry(&jiffies_lock, seq)); | 586 | } while (read_seqretry(&jiffies_lock, seq)); |
| 559 | 587 | ||
| 560 | if (rcu_needs_cpu(cpu, &rcu_delta_jiffies) || | 588 | if (rcu_needs_cpu(cpu, &rcu_delta_jiffies) || |
| 561 | arch_needs_cpu(cpu) || irq_work_needs_cpu()) { | 589 | arch_needs_cpu() || irq_work_needs_cpu()) { |
| 562 | next_jiffies = last_jiffies + 1; | 590 | next_jiffies = last_jiffies + 1; |
| 563 | delta_jiffies = 1; | 591 | delta_jiffies = 1; |
| 564 | } else { | 592 | } else { |
| @@ -813,7 +841,7 @@ void tick_nohz_idle_enter(void) | |||
| 813 | 841 | ||
| 814 | local_irq_disable(); | 842 | local_irq_disable(); |
| 815 | 843 | ||
| 816 | ts = &__get_cpu_var(tick_cpu_sched); | 844 | ts = this_cpu_ptr(&tick_cpu_sched); |
| 817 | ts->inidle = 1; | 845 | ts->inidle = 1; |
| 818 | __tick_nohz_idle_enter(ts); | 846 | __tick_nohz_idle_enter(ts); |
| 819 | 847 | ||
| @@ -831,7 +859,7 @@ EXPORT_SYMBOL_GPL(tick_nohz_idle_enter); | |||
| 831 | */ | 859 | */ |
| 832 | void tick_nohz_irq_exit(void) | 860 | void tick_nohz_irq_exit(void) |
| 833 | { | 861 | { |
| 834 | struct tick_sched *ts = &__get_cpu_var(tick_cpu_sched); | 862 | struct tick_sched *ts = this_cpu_ptr(&tick_cpu_sched); |
| 835 | 863 | ||
| 836 | if (ts->inidle) | 864 | if (ts->inidle) |
| 837 | __tick_nohz_idle_enter(ts); | 865 | __tick_nohz_idle_enter(ts); |
| @@ -846,7 +874,7 @@ void tick_nohz_irq_exit(void) | |||
| 846 | */ | 874 | */ |
| 847 | ktime_t tick_nohz_get_sleep_length(void) | 875 | ktime_t tick_nohz_get_sleep_length(void) |
| 848 | { | 876 | { |
| 849 | struct tick_sched *ts = &__get_cpu_var(tick_cpu_sched); | 877 | struct tick_sched *ts = this_cpu_ptr(&tick_cpu_sched); |
| 850 | 878 | ||
| 851 | return ts->sleep_length; | 879 | return ts->sleep_length; |
| 852 | } | 880 | } |
| @@ -924,7 +952,7 @@ static void tick_nohz_account_idle_ticks(struct tick_sched *ts) | |||
| 924 | */ | 952 | */ |
| 925 | void tick_nohz_idle_exit(void) | 953 | void tick_nohz_idle_exit(void) |
| 926 | { | 954 | { |
| 927 | struct tick_sched *ts = &__get_cpu_var(tick_cpu_sched); | 955 | struct tick_sched *ts = this_cpu_ptr(&tick_cpu_sched); |
| 928 | ktime_t now; | 956 | ktime_t now; |
| 929 | 957 | ||
| 930 | local_irq_disable(); | 958 | local_irq_disable(); |
| @@ -959,7 +987,7 @@ static int tick_nohz_reprogram(struct tick_sched *ts, ktime_t now) | |||
| 959 | */ | 987 | */ |
| 960 | static void tick_nohz_handler(struct clock_event_device *dev) | 988 | static void tick_nohz_handler(struct clock_event_device *dev) |
| 961 | { | 989 | { |
| 962 | struct tick_sched *ts = &__get_cpu_var(tick_cpu_sched); | 990 | struct tick_sched *ts = this_cpu_ptr(&tick_cpu_sched); |
| 963 | struct pt_regs *regs = get_irq_regs(); | 991 | struct pt_regs *regs = get_irq_regs(); |
| 964 | ktime_t now = ktime_get(); | 992 | ktime_t now = ktime_get(); |
| 965 | 993 | ||
| @@ -968,6 +996,10 @@ static void tick_nohz_handler(struct clock_event_device *dev) | |||
| 968 | tick_sched_do_timer(now); | 996 | tick_sched_do_timer(now); |
| 969 | tick_sched_handle(ts, regs); | 997 | tick_sched_handle(ts, regs); |
| 970 | 998 | ||
| 999 | /* No need to reprogram if we are running tickless */ | ||
| 1000 | if (unlikely(ts->tick_stopped)) | ||
| 1001 | return; | ||
| 1002 | |||
| 971 | while (tick_nohz_reprogram(ts, now)) { | 1003 | while (tick_nohz_reprogram(ts, now)) { |
| 972 | now = ktime_get(); | 1004 | now = ktime_get(); |
| 973 | tick_do_update_jiffies64(now); | 1005 | tick_do_update_jiffies64(now); |
| @@ -979,7 +1011,7 @@ static void tick_nohz_handler(struct clock_event_device *dev) | |||
| 979 | */ | 1011 | */ |
| 980 | static void tick_nohz_switch_to_nohz(void) | 1012 | static void tick_nohz_switch_to_nohz(void) |
| 981 | { | 1013 | { |
| 982 | struct tick_sched *ts = &__get_cpu_var(tick_cpu_sched); | 1014 | struct tick_sched *ts = this_cpu_ptr(&tick_cpu_sched); |
| 983 | ktime_t next; | 1015 | ktime_t next; |
| 984 | 1016 | ||
| 985 | if (!tick_nohz_enabled) | 1017 | if (!tick_nohz_enabled) |
| @@ -1041,7 +1073,7 @@ static void tick_nohz_kick_tick(struct tick_sched *ts, ktime_t now) | |||
| 1041 | 1073 | ||
| 1042 | static inline void tick_nohz_irq_enter(void) | 1074 | static inline void tick_nohz_irq_enter(void) |
| 1043 | { | 1075 | { |
| 1044 | struct tick_sched *ts = &__get_cpu_var(tick_cpu_sched); | 1076 | struct tick_sched *ts = this_cpu_ptr(&tick_cpu_sched); |
| 1045 | ktime_t now; | 1077 | ktime_t now; |
| 1046 | 1078 | ||
| 1047 | if (!ts->idle_active && !ts->tick_stopped) | 1079 | if (!ts->idle_active && !ts->tick_stopped) |
| @@ -1095,6 +1127,10 @@ static enum hrtimer_restart tick_sched_timer(struct hrtimer *timer) | |||
| 1095 | if (regs) | 1127 | if (regs) |
| 1096 | tick_sched_handle(ts, regs); | 1128 | tick_sched_handle(ts, regs); |
| 1097 | 1129 | ||
| 1130 | /* No need to reprogram if we are in idle or full dynticks mode */ | ||
| 1131 | if (unlikely(ts->tick_stopped)) | ||
| 1132 | return HRTIMER_NORESTART; | ||
| 1133 | |||
| 1098 | hrtimer_forward(timer, now, tick_period); | 1134 | hrtimer_forward(timer, now, tick_period); |
| 1099 | 1135 | ||
| 1100 | return HRTIMER_RESTART; | 1136 | return HRTIMER_RESTART; |
| @@ -1115,7 +1151,7 @@ early_param("skew_tick", skew_tick); | |||
| 1115 | */ | 1151 | */ |
| 1116 | void tick_setup_sched_timer(void) | 1152 | void tick_setup_sched_timer(void) |
| 1117 | { | 1153 | { |
| 1118 | struct tick_sched *ts = &__get_cpu_var(tick_cpu_sched); | 1154 | struct tick_sched *ts = this_cpu_ptr(&tick_cpu_sched); |
| 1119 | ktime_t now = ktime_get(); | 1155 | ktime_t now = ktime_get(); |
| 1120 | 1156 | ||
| 1121 | /* | 1157 | /* |
| @@ -1184,7 +1220,7 @@ void tick_clock_notify(void) | |||
| 1184 | */ | 1220 | */ |
| 1185 | void tick_oneshot_notify(void) | 1221 | void tick_oneshot_notify(void) |
| 1186 | { | 1222 | { |
| 1187 | struct tick_sched *ts = &__get_cpu_var(tick_cpu_sched); | 1223 | struct tick_sched *ts = this_cpu_ptr(&tick_cpu_sched); |
| 1188 | 1224 | ||
| 1189 | set_bit(0, &ts->check_clocks); | 1225 | set_bit(0, &ts->check_clocks); |
| 1190 | } | 1226 | } |
| @@ -1199,7 +1235,7 @@ void tick_oneshot_notify(void) | |||
| 1199 | */ | 1235 | */ |
| 1200 | int tick_check_oneshot_change(int allow_nohz) | 1236 | int tick_check_oneshot_change(int allow_nohz) |
| 1201 | { | 1237 | { |
| 1202 | struct tick_sched *ts = &__get_cpu_var(tick_cpu_sched); | 1238 | struct tick_sched *ts = this_cpu_ptr(&tick_cpu_sched); |
| 1203 | 1239 | ||
| 1204 | if (!test_and_clear_bit(0, &ts->check_clocks)) | 1240 | if (!test_and_clear_bit(0, &ts->check_clocks)) |
| 1205 | return 0; | 1241 | return 0; |
diff --git a/kernel/time/time.c b/kernel/time/time.c index f0294ba14634..a9ae20fb0b11 100644 --- a/kernel/time/time.c +++ b/kernel/time/time.c | |||
| @@ -559,17 +559,20 @@ EXPORT_SYMBOL(usecs_to_jiffies); | |||
| 559 | * that a remainder subtract here would not do the right thing as the | 559 | * that a remainder subtract here would not do the right thing as the |
| 560 | * resolution values don't fall on second boundries. I.e. the line: | 560 | * resolution values don't fall on second boundries. I.e. the line: |
| 561 | * nsec -= nsec % TICK_NSEC; is NOT a correct resolution rounding. | 561 | * nsec -= nsec % TICK_NSEC; is NOT a correct resolution rounding. |
| 562 | * Note that due to the small error in the multiplier here, this | ||
| 563 | * rounding is incorrect for sufficiently large values of tv_nsec, but | ||
| 564 | * well formed timespecs should have tv_nsec < NSEC_PER_SEC, so we're | ||
| 565 | * OK. | ||
| 562 | * | 566 | * |
| 563 | * Rather, we just shift the bits off the right. | 567 | * Rather, we just shift the bits off the right. |
| 564 | * | 568 | * |
| 565 | * The >> (NSEC_JIFFIE_SC - SEC_JIFFIE_SC) converts the scaled nsec | 569 | * The >> (NSEC_JIFFIE_SC - SEC_JIFFIE_SC) converts the scaled nsec |
| 566 | * value to a scaled second value. | 570 | * value to a scaled second value. |
| 567 | */ | 571 | */ |
| 568 | unsigned long | 572 | static unsigned long |
| 569 | timespec_to_jiffies(const struct timespec *value) | 573 | __timespec_to_jiffies(unsigned long sec, long nsec) |
| 570 | { | 574 | { |
| 571 | unsigned long sec = value->tv_sec; | 575 | nsec = nsec + TICK_NSEC - 1; |
| 572 | long nsec = value->tv_nsec + TICK_NSEC - 1; | ||
| 573 | 576 | ||
| 574 | if (sec >= MAX_SEC_IN_JIFFIES){ | 577 | if (sec >= MAX_SEC_IN_JIFFIES){ |
| 575 | sec = MAX_SEC_IN_JIFFIES; | 578 | sec = MAX_SEC_IN_JIFFIES; |
| @@ -580,6 +583,13 @@ timespec_to_jiffies(const struct timespec *value) | |||
| 580 | (NSEC_JIFFIE_SC - SEC_JIFFIE_SC))) >> SEC_JIFFIE_SC; | 583 | (NSEC_JIFFIE_SC - SEC_JIFFIE_SC))) >> SEC_JIFFIE_SC; |
| 581 | 584 | ||
| 582 | } | 585 | } |
| 586 | |||
| 587 | unsigned long | ||
| 588 | timespec_to_jiffies(const struct timespec *value) | ||
| 589 | { | ||
| 590 | return __timespec_to_jiffies(value->tv_sec, value->tv_nsec); | ||
| 591 | } | ||
| 592 | |||
| 583 | EXPORT_SYMBOL(timespec_to_jiffies); | 593 | EXPORT_SYMBOL(timespec_to_jiffies); |
| 584 | 594 | ||
| 585 | void | 595 | void |
| @@ -596,31 +606,27 @@ jiffies_to_timespec(const unsigned long jiffies, struct timespec *value) | |||
| 596 | } | 606 | } |
| 597 | EXPORT_SYMBOL(jiffies_to_timespec); | 607 | EXPORT_SYMBOL(jiffies_to_timespec); |
| 598 | 608 | ||
| 599 | /* Same for "timeval" | 609 | /* |
| 600 | * | 610 | * We could use a similar algorithm to timespec_to_jiffies (with a |
| 601 | * Well, almost. The problem here is that the real system resolution is | 611 | * different multiplier for usec instead of nsec). But this has a |
| 602 | * in nanoseconds and the value being converted is in micro seconds. | 612 | * problem with rounding: we can't exactly add TICK_NSEC - 1 to the |
| 603 | * Also for some machines (those that use HZ = 1024, in-particular), | 613 | * usec value, since it's not necessarily integral. |
| 604 | * there is a LARGE error in the tick size in microseconds. | 614 | * |
| 605 | 615 | * We could instead round in the intermediate scaled representation | |
| 606 | * The solution we use is to do the rounding AFTER we convert the | 616 | * (i.e. in units of 1/2^(large scale) jiffies) but that's also |
| 607 | * microsecond part. Thus the USEC_ROUND, the bits to be shifted off. | 617 | * perilous: the scaling introduces a small positive error, which |
| 608 | * Instruction wise, this should cost only an additional add with carry | 618 | * combined with a division-rounding-upward (i.e. adding 2^(scale) - 1 |
| 609 | * instruction above the way it was done above. | 619 | * units to the intermediate before shifting) leads to accidental |
| 620 | * overflow and overestimates. | ||
| 621 | * | ||
| 622 | * At the cost of one additional multiplication by a constant, just | ||
| 623 | * use the timespec implementation. | ||
| 610 | */ | 624 | */ |
| 611 | unsigned long | 625 | unsigned long |
| 612 | timeval_to_jiffies(const struct timeval *value) | 626 | timeval_to_jiffies(const struct timeval *value) |
| 613 | { | 627 | { |
| 614 | unsigned long sec = value->tv_sec; | 628 | return __timespec_to_jiffies(value->tv_sec, |
| 615 | long usec = value->tv_usec; | 629 | value->tv_usec * NSEC_PER_USEC); |
| 616 | |||
| 617 | if (sec >= MAX_SEC_IN_JIFFIES){ | ||
| 618 | sec = MAX_SEC_IN_JIFFIES; | ||
| 619 | usec = 0; | ||
| 620 | } | ||
| 621 | return (((u64)sec * SEC_CONVERSION) + | ||
| 622 | (((u64)usec * USEC_CONVERSION + USEC_ROUND) >> | ||
| 623 | (USEC_JIFFIE_SC - SEC_JIFFIE_SC))) >> SEC_JIFFIE_SC; | ||
| 624 | } | 630 | } |
| 625 | EXPORT_SYMBOL(timeval_to_jiffies); | 631 | EXPORT_SYMBOL(timeval_to_jiffies); |
| 626 | 632 | ||
diff --git a/kernel/time/timekeeping.c b/kernel/time/timekeeping.c index f36b02838a47..ec1791fae965 100644 --- a/kernel/time/timekeeping.c +++ b/kernel/time/timekeeping.c | |||
| @@ -338,10 +338,11 @@ EXPORT_SYMBOL_GPL(ktime_get_mono_fast_ns); | |||
| 338 | 338 | ||
| 339 | static inline void update_vsyscall(struct timekeeper *tk) | 339 | static inline void update_vsyscall(struct timekeeper *tk) |
| 340 | { | 340 | { |
| 341 | struct timespec xt; | 341 | struct timespec xt, wm; |
| 342 | 342 | ||
| 343 | xt = timespec64_to_timespec(tk_xtime(tk)); | 343 | xt = timespec64_to_timespec(tk_xtime(tk)); |
| 344 | update_vsyscall_old(&xt, &tk->wall_to_monotonic, tk->tkr.clock, tk->tkr.mult, | 344 | wm = timespec64_to_timespec(tk->wall_to_monotonic); |
| 345 | update_vsyscall_old(&xt, &wm, tk->tkr.clock, tk->tkr.mult, | ||
| 345 | tk->tkr.cycle_last); | 346 | tk->tkr.cycle_last); |
| 346 | } | 347 | } |
| 347 | 348 | ||
| @@ -441,11 +442,12 @@ static void timekeeping_update(struct timekeeper *tk, unsigned int action) | |||
| 441 | tk->ntp_error = 0; | 442 | tk->ntp_error = 0; |
| 442 | ntp_clear(); | 443 | ntp_clear(); |
| 443 | } | 444 | } |
| 444 | update_vsyscall(tk); | ||
| 445 | update_pvclock_gtod(tk, action & TK_CLOCK_WAS_SET); | ||
| 446 | 445 | ||
| 447 | tk_update_ktime_data(tk); | 446 | tk_update_ktime_data(tk); |
| 448 | 447 | ||
| 448 | update_vsyscall(tk); | ||
| 449 | update_pvclock_gtod(tk, action & TK_CLOCK_WAS_SET); | ||
| 450 | |||
| 449 | if (action & TK_MIRROR) | 451 | if (action & TK_MIRROR) |
| 450 | memcpy(&shadow_timekeeper, &tk_core.timekeeper, | 452 | memcpy(&shadow_timekeeper, &tk_core.timekeeper, |
| 451 | sizeof(tk_core.timekeeper)); | 453 | sizeof(tk_core.timekeeper)); |
diff --git a/kernel/time/timer.c b/kernel/time/timer.c index aca5dfe2fa3d..3260ffdb368f 100644 --- a/kernel/time/timer.c +++ b/kernel/time/timer.c | |||
| @@ -655,7 +655,7 @@ static inline void debug_assert_init(struct timer_list *timer) | |||
| 655 | static void do_init_timer(struct timer_list *timer, unsigned int flags, | 655 | static void do_init_timer(struct timer_list *timer, unsigned int flags, |
| 656 | const char *name, struct lock_class_key *key) | 656 | const char *name, struct lock_class_key *key) |
| 657 | { | 657 | { |
| 658 | struct tvec_base *base = __raw_get_cpu_var(tvec_bases); | 658 | struct tvec_base *base = raw_cpu_read(tvec_bases); |
| 659 | 659 | ||
| 660 | timer->entry.next = NULL; | 660 | timer->entry.next = NULL; |
| 661 | timer->base = (void *)((unsigned long)base | flags); | 661 | timer->base = (void *)((unsigned long)base | flags); |
| @@ -1385,7 +1385,7 @@ void update_process_times(int user_tick) | |||
| 1385 | rcu_check_callbacks(cpu, user_tick); | 1385 | rcu_check_callbacks(cpu, user_tick); |
| 1386 | #ifdef CONFIG_IRQ_WORK | 1386 | #ifdef CONFIG_IRQ_WORK |
| 1387 | if (in_irq()) | 1387 | if (in_irq()) |
| 1388 | irq_work_run(); | 1388 | irq_work_tick(); |
| 1389 | #endif | 1389 | #endif |
| 1390 | scheduler_tick(); | 1390 | scheduler_tick(); |
| 1391 | run_posix_cpu_timers(p); | 1391 | run_posix_cpu_timers(p); |
