1
2
3
4
5
6
7
8
9
10
11
12
13
14#include <linux/cpu.h>
15#include <linux/err.h>
16#include <linux/hrtimer.h>
17#include <linux/interrupt.h>
18#include <linux/kernel_stat.h>
19#include <linux/percpu.h>
20#include <linux/profile.h>
21#include <linux/sched.h>
22#include <linux/module.h>
23
24#include <asm/irq_regs.h>
25
26#include "tick-internal.h"
27
28
29
30
31static DEFINE_PER_CPU(struct tick_sched, tick_cpu_sched);
32
33
34
35
36static ktime_t last_jiffies_update;
37
38struct tick_sched *tick_get_tick_sched(int cpu)
39{
40 return &per_cpu(tick_cpu_sched, cpu);
41}
42
43
44
45
46static void tick_do_update_jiffies64(ktime_t now)
47{
48 unsigned long ticks = 0;
49 ktime_t delta;
50
51
52
53
54 delta = ktime_sub(now, last_jiffies_update);
55 if (delta.tv64 < tick_period.tv64)
56 return;
57
58
59 write_seqlock(&xtime_lock);
60
61 delta = ktime_sub(now, last_jiffies_update);
62 if (delta.tv64 >= tick_period.tv64) {
63
64 delta = ktime_sub(delta, tick_period);
65 last_jiffies_update = ktime_add(last_jiffies_update,
66 tick_period);
67
68
69 if (unlikely(delta.tv64 >= tick_period.tv64)) {
70 s64 incr = ktime_to_ns(tick_period);
71
72 ticks = ktime_divns(delta, incr);
73
74 last_jiffies_update = ktime_add_ns(last_jiffies_update,
75 incr * ticks);
76 }
77 do_timer(++ticks);
78
79
80 tick_next_period = ktime_add(last_jiffies_update, tick_period);
81 }
82 write_sequnlock(&xtime_lock);
83}
84
85
86
87
88static ktime_t tick_init_jiffy_update(void)
89{
90 ktime_t period;
91
92 write_seqlock(&xtime_lock);
93
94 if (last_jiffies_update.tv64 == 0)
95 last_jiffies_update = tick_next_period;
96 period = last_jiffies_update;
97 write_sequnlock(&xtime_lock);
98 return period;
99}
100
101
102
103
104#ifdef CONFIG_NO_HZ
105
106
107
108static int tick_nohz_enabled __read_mostly = 1;
109
110
111
112
113static int __init setup_tick_nohz(char *str)
114{
115 if (!strcmp(str, "off"))
116 tick_nohz_enabled = 0;
117 else if (!strcmp(str, "on"))
118 tick_nohz_enabled = 1;
119 else
120 return 0;
121 return 1;
122}
123
124__setup("nohz=", setup_tick_nohz);
125
126
127
128
129
130
131
132
133
134
135
136static void tick_nohz_update_jiffies(ktime_t now)
137{
138 int cpu = smp_processor_id();
139 struct tick_sched *ts = &per_cpu(tick_cpu_sched, cpu);
140 unsigned long flags;
141
142 ts->idle_waketime = now;
143
144 local_irq_save(flags);
145 tick_do_update_jiffies64(now);
146 local_irq_restore(flags);
147
148 touch_softlockup_watchdog();
149}
150
151
152
153
154static void
155update_ts_time_stats(int cpu, struct tick_sched *ts, ktime_t now, u64 *last_update_time)
156{
157 ktime_t delta;
158
159 if (ts->idle_active) {
160 delta = ktime_sub(now, ts->idle_entrytime);
161 if (nr_iowait_cpu(cpu) > 0)
162 ts->iowait_sleeptime = ktime_add(ts->iowait_sleeptime, delta);
163 else
164 ts->idle_sleeptime = ktime_add(ts->idle_sleeptime, delta);
165 ts->idle_entrytime = now;
166 }
167
168 if (last_update_time)
169 *last_update_time = ktime_to_us(now);
170
171}
172
173static void tick_nohz_stop_idle(int cpu, ktime_t now)
174{
175 struct tick_sched *ts = &per_cpu(tick_cpu_sched, cpu);
176
177 update_ts_time_stats(cpu, ts, now, NULL);
178 ts->idle_active = 0;
179
180 sched_clock_idle_wakeup_event(0);
181}
182
183static ktime_t tick_nohz_start_idle(int cpu, struct tick_sched *ts)
184{
185 ktime_t now;
186
187 now = ktime_get();
188
189 update_ts_time_stats(cpu, ts, now, NULL);
190
191 ts->idle_entrytime = now;
192 ts->idle_active = 1;
193 sched_clock_idle_sleep_event();
194 return now;
195}
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211u64 get_cpu_idle_time_us(int cpu, u64 *last_update_time)
212{
213 struct tick_sched *ts = &per_cpu(tick_cpu_sched, cpu);
214 ktime_t now, idle;
215
216 if (!tick_nohz_enabled)
217 return -1;
218
219 now = ktime_get();
220 if (last_update_time) {
221 update_ts_time_stats(cpu, ts, now, last_update_time);
222 idle = ts->idle_sleeptime;
223 } else {
224 if (ts->idle_active && !nr_iowait_cpu(cpu)) {
225 ktime_t delta = ktime_sub(now, ts->idle_entrytime);
226
227 idle = ktime_add(ts->idle_sleeptime, delta);
228 } else {
229 idle = ts->idle_sleeptime;
230 }
231 }
232
233 return ktime_to_us(idle);
234
235}
236EXPORT_SYMBOL_GPL(get_cpu_idle_time_us);
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252u64 get_cpu_iowait_time_us(int cpu, u64 *last_update_time)
253{
254 struct tick_sched *ts = &per_cpu(tick_cpu_sched, cpu);
255 ktime_t now, iowait;
256
257 if (!tick_nohz_enabled)
258 return -1;
259
260 now = ktime_get();
261 if (last_update_time) {
262 update_ts_time_stats(cpu, ts, now, last_update_time);
263 iowait = ts->iowait_sleeptime;
264 } else {
265 if (ts->idle_active && nr_iowait_cpu(cpu) > 0) {
266 ktime_t delta = ktime_sub(now, ts->idle_entrytime);
267
268 iowait = ktime_add(ts->iowait_sleeptime, delta);
269 } else {
270 iowait = ts->iowait_sleeptime;
271 }
272 }
273
274 return ktime_to_us(iowait);
275}
276EXPORT_SYMBOL_GPL(get_cpu_iowait_time_us);
277
278
279
280
281
282
283
284
285void tick_nohz_stop_sched_tick(int inidle)
286{
287 unsigned long seq, last_jiffies, next_jiffies, delta_jiffies, flags;
288 struct tick_sched *ts;
289 ktime_t last_update, expires, now;
290 struct clock_event_device *dev = __get_cpu_var(tick_cpu_device).evtdev;
291 u64 time_delta;
292 int cpu;
293
294 local_irq_save(flags);
295
296 cpu = smp_processor_id();
297 ts = &per_cpu(tick_cpu_sched, cpu);
298
299
300
301
302
303
304 if (!inidle && !ts->inidle)
305 goto end;
306
307
308
309
310
311
312 ts->inidle = 1;
313
314 now = tick_nohz_start_idle(cpu, ts);
315
316
317
318
319
320
321
322
323 if (unlikely(!cpu_online(cpu))) {
324 if (cpu == tick_do_timer_cpu)
325 tick_do_timer_cpu = TICK_DO_TIMER_NONE;
326 }
327
328 if (unlikely(ts->nohz_mode == NOHZ_MODE_INACTIVE))
329 goto end;
330
331 if (need_resched())
332 goto end;
333
334 if (unlikely(local_softirq_pending() && cpu_online(cpu))) {
335 static int ratelimit;
336
337 if (ratelimit < 10) {
338 printk(KERN_ERR "NOHZ: local_softirq_pending %02x\n",
339 (unsigned int) local_softirq_pending());
340 ratelimit++;
341 }
342 goto end;
343 }
344
345 ts->idle_calls++;
346
347 do {
348 seq = read_seqbegin(&xtime_lock);
349 last_update = last_jiffies_update;
350 last_jiffies = jiffies;
351 time_delta = timekeeping_max_deferment();
352 } while (read_seqretry(&xtime_lock, seq));
353
354 if (rcu_needs_cpu(cpu) || printk_needs_cpu(cpu) ||
355 arch_needs_cpu(cpu)) {
356 next_jiffies = last_jiffies + 1;
357 delta_jiffies = 1;
358 } else {
359
360 next_jiffies = get_next_timer_interrupt(last_jiffies);
361 delta_jiffies = next_jiffies - last_jiffies;
362 }
363
364
365
366
367 if (!ts->tick_stopped && delta_jiffies == 1)
368 goto out;
369
370
371 if ((long)delta_jiffies >= 1) {
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386 if (cpu == tick_do_timer_cpu) {
387 tick_do_timer_cpu = TICK_DO_TIMER_NONE;
388 ts->do_timer_last = 1;
389 } else if (tick_do_timer_cpu != TICK_DO_TIMER_NONE) {
390 time_delta = KTIME_MAX;
391 ts->do_timer_last = 0;
392 } else if (!ts->do_timer_last) {
393 time_delta = KTIME_MAX;
394 }
395
396
397
398
399
400
401
402
403 if (likely(delta_jiffies < NEXT_TIMER_MAX_DELTA)) {
404
405
406
407
408
409
410
411 time_delta = min_t(u64, time_delta,
412 tick_period.tv64 * delta_jiffies);
413 }
414
415 if (time_delta < KTIME_MAX)
416 expires = ktime_add_ns(last_update, time_delta);
417 else
418 expires.tv64 = KTIME_MAX;
419
420
421 if (ts->tick_stopped && ktime_equal(expires, dev->next_event))
422 goto out;
423
424
425
426
427
428
429
430
431 if (!ts->tick_stopped) {
432 select_nohz_load_balancer(1);
433
434 ts->idle_tick = hrtimer_get_expires(&ts->sched_timer);
435 ts->tick_stopped = 1;
436 ts->idle_jiffies = last_jiffies;
437 rcu_enter_nohz();
438 }
439
440 ts->idle_sleeps++;
441
442
443 ts->idle_expires = expires;
444
445
446
447
448
449 if (unlikely(expires.tv64 == KTIME_MAX)) {
450 if (ts->nohz_mode == NOHZ_MODE_HIGHRES)
451 hrtimer_cancel(&ts->sched_timer);
452 goto out;
453 }
454
455 if (ts->nohz_mode == NOHZ_MODE_HIGHRES) {
456 hrtimer_start(&ts->sched_timer, expires,
457 HRTIMER_MODE_ABS_PINNED);
458
459 if (hrtimer_active(&ts->sched_timer))
460 goto out;
461 } else if (!tick_program_event(expires, 0))
462 goto out;
463
464
465
466
467
468 tick_do_update_jiffies64(ktime_get());
469 }
470 raise_softirq_irqoff(TIMER_SOFTIRQ);
471out:
472 ts->next_jiffies = next_jiffies;
473 ts->last_jiffies = last_jiffies;
474 ts->sleep_length = ktime_sub(dev->next_event, now);
475end:
476 local_irq_restore(flags);
477}
478
479
480
481
482
483
484ktime_t tick_nohz_get_sleep_length(void)
485{
486 struct tick_sched *ts = &__get_cpu_var(tick_cpu_sched);
487
488 return ts->sleep_length;
489}
490
491static void tick_nohz_restart(struct tick_sched *ts, ktime_t now)
492{
493 hrtimer_cancel(&ts->sched_timer);
494 hrtimer_set_expires(&ts->sched_timer, ts->idle_tick);
495
496 while (1) {
497
498 hrtimer_forward(&ts->sched_timer, now, tick_period);
499
500 if (ts->nohz_mode == NOHZ_MODE_HIGHRES) {
501 hrtimer_start_expires(&ts->sched_timer,
502 HRTIMER_MODE_ABS_PINNED);
503
504 if (hrtimer_active(&ts->sched_timer))
505 break;
506 } else {
507 if (!tick_program_event(
508 hrtimer_get_expires(&ts->sched_timer), 0))
509 break;
510 }
511
512 tick_do_update_jiffies64(now);
513 now = ktime_get();
514 }
515}
516
517
518
519
520
521
522void tick_nohz_restart_sched_tick(void)
523{
524 int cpu = smp_processor_id();
525 struct tick_sched *ts = &per_cpu(tick_cpu_sched, cpu);
526#ifndef CONFIG_VIRT_CPU_ACCOUNTING
527 unsigned long ticks;
528#endif
529 ktime_t now;
530
531 local_irq_disable();
532 if (ts->idle_active || (ts->inidle && ts->tick_stopped))
533 now = ktime_get();
534
535 if (ts->idle_active)
536 tick_nohz_stop_idle(cpu, now);
537
538 if (!ts->inidle || !ts->tick_stopped) {
539 ts->inidle = 0;
540 local_irq_enable();
541 return;
542 }
543
544 ts->inidle = 0;
545
546 rcu_exit_nohz();
547
548
549 select_nohz_load_balancer(0);
550 tick_do_update_jiffies64(now);
551
552#ifndef CONFIG_VIRT_CPU_ACCOUNTING
553
554
555
556
557
558 ticks = jiffies - ts->idle_jiffies;
559
560
561
562 if (ticks && ticks < LONG_MAX)
563 account_idle_ticks(ticks);
564#endif
565
566 touch_softlockup_watchdog();
567
568
569
570 ts->tick_stopped = 0;
571 ts->idle_exittime = now;
572
573 tick_nohz_restart(ts, now);
574
575 local_irq_enable();
576}
577
578static int tick_nohz_reprogram(struct tick_sched *ts, ktime_t now)
579{
580 hrtimer_forward(&ts->sched_timer, now, tick_period);
581 return tick_program_event(hrtimer_get_expires(&ts->sched_timer), 0);
582}
583
584
585
586
587static void tick_nohz_handler(struct clock_event_device *dev)
588{
589 struct tick_sched *ts = &__get_cpu_var(tick_cpu_sched);
590 struct pt_regs *regs = get_irq_regs();
591 int cpu = smp_processor_id();
592 ktime_t now = ktime_get();
593
594 dev->next_event.tv64 = KTIME_MAX;
595
596
597
598
599
600
601
602
603 if (unlikely(tick_do_timer_cpu == TICK_DO_TIMER_NONE))
604 tick_do_timer_cpu = cpu;
605
606
607 if (tick_do_timer_cpu == cpu)
608 tick_do_update_jiffies64(now);
609
610
611
612
613
614
615
616
617
618 if (ts->tick_stopped) {
619 touch_softlockup_watchdog();
620 ts->idle_jiffies++;
621 }
622
623 update_process_times(user_mode(regs));
624 profile_tick(CPU_PROFILING);
625
626 while (tick_nohz_reprogram(ts, now)) {
627 now = ktime_get();
628 tick_do_update_jiffies64(now);
629 }
630}
631
632
633
634
635static void tick_nohz_switch_to_nohz(void)
636{
637 struct tick_sched *ts = &__get_cpu_var(tick_cpu_sched);
638 ktime_t next;
639
640 if (!tick_nohz_enabled)
641 return;
642
643 local_irq_disable();
644 if (tick_switch_to_oneshot(tick_nohz_handler)) {
645 local_irq_enable();
646 return;
647 }
648
649 ts->nohz_mode = NOHZ_MODE_LOWRES;
650
651
652
653
654
655 hrtimer_init(&ts->sched_timer, CLOCK_MONOTONIC, HRTIMER_MODE_ABS);
656
657 next = tick_init_jiffy_update();
658
659 for (;;) {
660 hrtimer_set_expires(&ts->sched_timer, next);
661 if (!tick_program_event(next, 0))
662 break;
663 next = ktime_add(next, tick_period);
664 }
665 local_irq_enable();
666}
667
668
669
670
671
672
673
674
675
676
677
678
679static void tick_nohz_kick_tick(int cpu, ktime_t now)
680{
681#if 0
682
683
684 struct tick_sched *ts = &per_cpu(tick_cpu_sched, cpu);
685 ktime_t delta;
686
687
688
689
690
691 delta = ktime_sub(hrtimer_get_expires(&ts->sched_timer), now);
692 if (delta.tv64 <= tick_period.tv64)
693 return;
694
695 tick_nohz_restart(ts, now);
696#endif
697}
698
699static inline void tick_check_nohz(int cpu)
700{
701 struct tick_sched *ts = &per_cpu(tick_cpu_sched, cpu);
702 ktime_t now;
703
704 if (!ts->idle_active && !ts->tick_stopped)
705 return;
706 now = ktime_get();
707 if (ts->idle_active)
708 tick_nohz_stop_idle(cpu, now);
709 if (ts->tick_stopped) {
710 tick_nohz_update_jiffies(now);
711 tick_nohz_kick_tick(cpu, now);
712 }
713}
714
715#else
716
717static inline void tick_nohz_switch_to_nohz(void) { }
718static inline void tick_check_nohz(int cpu) { }
719
720#endif
721
722
723
724
725void tick_check_idle(int cpu)
726{
727 tick_check_oneshot_broadcast(cpu);
728 tick_check_nohz(cpu);
729}
730
731
732
733
734#ifdef CONFIG_HIGH_RES_TIMERS
735
736
737
738
739static enum hrtimer_restart tick_sched_timer(struct hrtimer *timer)
740{
741 struct tick_sched *ts =
742 container_of(timer, struct tick_sched, sched_timer);
743 struct pt_regs *regs = get_irq_regs();
744 ktime_t now = ktime_get();
745 int cpu = smp_processor_id();
746
747#ifdef CONFIG_NO_HZ
748
749
750
751
752
753
754
755 if (unlikely(tick_do_timer_cpu == TICK_DO_TIMER_NONE))
756 tick_do_timer_cpu = cpu;
757#endif
758
759
760 if (tick_do_timer_cpu == cpu)
761 tick_do_update_jiffies64(now);
762
763
764
765
766
767 if (regs) {
768
769
770
771
772
773
774
775
776 if (ts->tick_stopped) {
777 touch_softlockup_watchdog();
778 ts->idle_jiffies++;
779 }
780 update_process_times(user_mode(regs));
781 profile_tick(CPU_PROFILING);
782 }
783
784 hrtimer_forward(timer, now, tick_period);
785
786 return HRTIMER_RESTART;
787}
788
789
790
791
792void tick_setup_sched_timer(void)
793{
794 struct tick_sched *ts = &__get_cpu_var(tick_cpu_sched);
795 ktime_t now = ktime_get();
796
797
798
799
800 hrtimer_init(&ts->sched_timer, CLOCK_MONOTONIC, HRTIMER_MODE_ABS);
801 ts->sched_timer.function = tick_sched_timer;
802
803
804 hrtimer_set_expires(&ts->sched_timer, tick_init_jiffy_update());
805
806 for (;;) {
807 hrtimer_forward(&ts->sched_timer, now, tick_period);
808 hrtimer_start_expires(&ts->sched_timer,
809 HRTIMER_MODE_ABS_PINNED);
810
811 if (hrtimer_active(&ts->sched_timer))
812 break;
813 now = ktime_get();
814 }
815
816#ifdef CONFIG_NO_HZ
817 if (tick_nohz_enabled)
818 ts->nohz_mode = NOHZ_MODE_HIGHRES;
819#endif
820}
821#endif
822
823#if defined CONFIG_NO_HZ || defined CONFIG_HIGH_RES_TIMERS
824void tick_cancel_sched_timer(int cpu)
825{
826 struct tick_sched *ts = &per_cpu(tick_cpu_sched, cpu);
827
828# ifdef CONFIG_HIGH_RES_TIMERS
829 if (ts->sched_timer.base)
830 hrtimer_cancel(&ts->sched_timer);
831# endif
832
833 ts->nohz_mode = NOHZ_MODE_INACTIVE;
834}
835#endif
836
837
838
839
840void tick_clock_notify(void)
841{
842 int cpu;
843
844 for_each_possible_cpu(cpu)
845 set_bit(0, &per_cpu(tick_cpu_sched, cpu).check_clocks);
846}
847
848
849
850
851void tick_oneshot_notify(void)
852{
853 struct tick_sched *ts = &__get_cpu_var(tick_cpu_sched);
854
855 set_bit(0, &ts->check_clocks);
856}
857
858
859
860
861
862
863
864
865
866int tick_check_oneshot_change(int allow_nohz)
867{
868 struct tick_sched *ts = &__get_cpu_var(tick_cpu_sched);
869
870 if (!test_and_clear_bit(0, &ts->check_clocks))
871 return 0;
872
873 if (ts->nohz_mode != NOHZ_MODE_INACTIVE)
874 return 0;
875
876 if (!timekeeping_valid_for_hres() || !tick_is_oneshot_available())
877 return 0;
878
879 if (!allow_nohz)
880 return 1;
881
882 tick_nohz_switch_to_nohz();
883 return 0;
884}
885