1 | /* SPDX-License-Identifier: GPL-2.0 */ |
2 | #ifndef _LINUX_SCHED_CLOCK_H |
3 | #define _LINUX_SCHED_CLOCK_H |
4 | |
5 | #include <linux/smp.h> |
6 | |
7 | /* |
8 | * Do not use outside of architecture code which knows its limitations. |
9 | * |
10 | * sched_clock() has no promise of monotonicity or bounded drift between |
11 | * CPUs, use (which you should not) requires disabling IRQs. |
12 | * |
13 | * Please use one of the three interfaces below. |
14 | */ |
15 | extern u64 sched_clock(void); |
16 | |
17 | #if defined(CONFIG_ARCH_WANTS_NO_INSTR) || defined(CONFIG_GENERIC_SCHED_CLOCK) |
18 | extern u64 sched_clock_noinstr(void); |
19 | #else |
20 | static __always_inline u64 sched_clock_noinstr(void) |
21 | { |
22 | return sched_clock(); |
23 | } |
24 | #endif |
25 | |
26 | /* |
27 | * See the comment in kernel/sched/clock.c |
28 | */ |
29 | extern u64 running_clock(void); |
30 | extern u64 sched_clock_cpu(int cpu); |
31 | |
32 | |
33 | extern void sched_clock_init(void); |
34 | |
35 | #ifndef CONFIG_HAVE_UNSTABLE_SCHED_CLOCK |
36 | static inline void sched_clock_tick(void) |
37 | { |
38 | } |
39 | |
40 | static inline void clear_sched_clock_stable(void) |
41 | { |
42 | } |
43 | |
44 | static inline void sched_clock_idle_sleep_event(void) |
45 | { |
46 | } |
47 | |
48 | static inline void sched_clock_idle_wakeup_event(void) |
49 | { |
50 | } |
51 | |
52 | static inline u64 cpu_clock(int cpu) |
53 | { |
54 | return sched_clock(); |
55 | } |
56 | |
57 | static __always_inline u64 local_clock_noinstr(void) |
58 | { |
59 | return sched_clock_noinstr(); |
60 | } |
61 | |
62 | static __always_inline u64 local_clock(void) |
63 | { |
64 | return sched_clock(); |
65 | } |
66 | #else |
67 | extern int sched_clock_stable(void); |
68 | extern void clear_sched_clock_stable(void); |
69 | |
70 | /* |
71 | * When sched_clock_stable(), __sched_clock_offset provides the offset |
72 | * between local_clock() and sched_clock(). |
73 | */ |
74 | extern u64 __sched_clock_offset; |
75 | |
76 | extern void sched_clock_tick(void); |
77 | extern void sched_clock_tick_stable(void); |
78 | extern void sched_clock_idle_sleep_event(void); |
79 | extern void sched_clock_idle_wakeup_event(void); |
80 | |
81 | /* |
82 | * As outlined in clock.c, provides a fast, high resolution, nanosecond |
83 | * time source that is monotonic per cpu argument and has bounded drift |
84 | * between cpus. |
85 | * |
86 | * ######################### BIG FAT WARNING ########################## |
87 | * # when comparing cpu_clock(i) to cpu_clock(j) for i != j, time can # |
88 | * # go backwards !! # |
89 | * #################################################################### |
90 | */ |
91 | static inline u64 cpu_clock(int cpu) |
92 | { |
93 | return sched_clock_cpu(cpu); |
94 | } |
95 | |
96 | extern u64 local_clock_noinstr(void); |
97 | extern u64 local_clock(void); |
98 | |
99 | #endif |
100 | |
101 | #ifdef CONFIG_IRQ_TIME_ACCOUNTING |
102 | /* |
103 | * An i/f to runtime opt-in for irq time accounting based off of sched_clock. |
104 | * The reason for this explicit opt-in is not to have perf penalty with |
105 | * slow sched_clocks. |
106 | */ |
107 | extern void enable_sched_clock_irqtime(void); |
108 | extern void disable_sched_clock_irqtime(void); |
109 | #else |
110 | static inline void enable_sched_clock_irqtime(void) {} |
111 | static inline void disable_sched_clock_irqtime(void) {} |
112 | #endif |
113 | |
114 | #endif /* _LINUX_SCHED_CLOCK_H */ |
115 | |