Branch data Line data Source code
1 : : /* SPDX-License-Identifier: GPL-2.0 */
2 : : #ifndef _LINUX_JIFFIES_H
3 : : #define _LINUX_JIFFIES_H
4 : :
5 : : #include <linux/cache.h>
6 : : #include <linux/math64.h>
7 : : #include <linux/kernel.h>
8 : : #include <linux/types.h>
9 : : #include <linux/time.h>
10 : : #include <linux/timex.h>
11 : : #include <asm/param.h> /* for HZ */
12 : : #include <generated/timeconst.h>
13 : :
14 : : /*
15 : : * The following defines establish the engineering parameters of the PLL
16 : : * model. The HZ variable establishes the timer interrupt frequency, 100 Hz
17 : : * for the SunOS kernel, 256 Hz for the Ultrix kernel and 1024 Hz for the
18 : : * OSF/1 kernel. The SHIFT_HZ define expresses the same value as the
19 : : * nearest power of two in order to avoid hardware multiply operations.
20 : : */
21 : : #if HZ >= 12 && HZ < 24
22 : : # define SHIFT_HZ 4
23 : : #elif HZ >= 24 && HZ < 48
24 : : # define SHIFT_HZ 5
25 : : #elif HZ >= 48 && HZ < 96
26 : : # define SHIFT_HZ 6
27 : : #elif HZ >= 96 && HZ < 192
28 : : # define SHIFT_HZ 7
29 : : #elif HZ >= 192 && HZ < 384
30 : : # define SHIFT_HZ 8
31 : : #elif HZ >= 384 && HZ < 768
32 : : # define SHIFT_HZ 9
33 : : #elif HZ >= 768 && HZ < 1536
34 : : # define SHIFT_HZ 10
35 : : #elif HZ >= 1536 && HZ < 3072
36 : : # define SHIFT_HZ 11
37 : : #elif HZ >= 3072 && HZ < 6144
38 : : # define SHIFT_HZ 12
39 : : #elif HZ >= 6144 && HZ < 12288
40 : : # define SHIFT_HZ 13
41 : : #else
42 : : # error Invalid value of HZ.
43 : : #endif
44 : :
45 : : /* Suppose we want to divide two numbers NOM and DEN: NOM/DEN, then we can
46 : : * improve accuracy by shifting LSH bits, hence calculating:
47 : : * (NOM << LSH) / DEN
48 : : * This however means trouble for large NOM, because (NOM << LSH) may no
49 : : * longer fit in 32 bits. The following way of calculating this gives us
50 : : * some slack, under the following conditions:
51 : : * - (NOM / DEN) fits in (32 - LSH) bits.
52 : : * - (NOM % DEN) fits in (32 - LSH) bits.
53 : : */
54 : : #define SH_DIV(NOM,DEN,LSH) ( (((NOM) / (DEN)) << (LSH)) \
55 : : + ((((NOM) % (DEN)) << (LSH)) + (DEN) / 2) / (DEN))
56 : :
57 : : /* LATCH is used in the interval timer and ftape setup. */
58 : : #define LATCH ((CLOCK_TICK_RATE + HZ/2) / HZ) /* For divider */
59 : :
60 : : extern int register_refined_jiffies(long clock_tick_rate);
61 : :
62 : : /* TICK_NSEC is the time between ticks in nsec assuming SHIFTED_HZ */
63 : : #define TICK_NSEC ((NSEC_PER_SEC+HZ/2)/HZ)
64 : :
65 : : /* TICK_USEC is the time between ticks in usec assuming SHIFTED_HZ */
66 : : #define TICK_USEC ((USEC_PER_SEC + HZ/2) / HZ)
67 : :
68 : : /* USER_TICK_USEC is the time between ticks in usec assuming fake USER_HZ */
69 : : #define USER_TICK_USEC ((1000000UL + USER_HZ/2) / USER_HZ)
70 : :
71 : : #ifndef __jiffy_arch_data
72 : : #define __jiffy_arch_data
73 : : #endif
74 : :
75 : : /*
76 : : * The 64-bit value is not atomic - you MUST NOT read it
77 : : * without sampling the sequence number in jiffies_lock.
78 : : * get_jiffies_64() will do this for you as appropriate.
79 : : */
80 : : extern u64 __cacheline_aligned_in_smp jiffies_64;
81 : : extern unsigned long volatile __cacheline_aligned_in_smp __jiffy_arch_data jiffies;
82 : :
83 : : #if (BITS_PER_LONG < 64)
84 : : u64 get_jiffies_64(void);
85 : : #else
86 : 2187 : static inline u64 get_jiffies_64(void)
87 : : {
88 [ + - # # : 2187 : return (u64)jiffies;
# # # # #
# ]
89 : : }
90 : : #endif
91 : :
92 : : /*
93 : : * These inlines deal with timer wrapping correctly. You are
94 : : * strongly encouraged to use them
95 : : * 1. Because people otherwise forget
96 : : * 2. Because if the timer wrap changes in future you won't have to
97 : : * alter your driver code.
98 : : *
99 : : * time_after(a,b) returns true if the time a is after time b.
100 : : *
101 : : * Do this with "<0" and ">=0" to only test the sign of the result. A
102 : : * good compiler would generate better code (and a really good compiler
103 : : * wouldn't care). Gcc is currently neither.
104 : : */
105 : : #define time_after(a,b) \
106 : : (typecheck(unsigned long, a) && \
107 : : typecheck(unsigned long, b) && \
108 : : ((long)((b) - (a)) < 0))
109 : : #define time_before(a,b) time_after(b,a)
110 : :
111 : : #define time_after_eq(a,b) \
112 : : (typecheck(unsigned long, a) && \
113 : : typecheck(unsigned long, b) && \
114 : : ((long)((a) - (b)) >= 0))
115 : : #define time_before_eq(a,b) time_after_eq(b,a)
116 : :
117 : : /*
118 : : * Calculate whether a is in the range of [b, c].
119 : : */
120 : : #define time_in_range(a,b,c) \
121 : : (time_after_eq(a,b) && \
122 : : time_before_eq(a,c))
123 : :
124 : : /*
125 : : * Calculate whether a is in the range of [b, c).
126 : : */
127 : : #define time_in_range_open(a,b,c) \
128 : : (time_after_eq(a,b) && \
129 : : time_before(a,c))
130 : :
131 : : /* Same as above, but does so with platform independent 64bit types.
132 : : * These must be used when utilizing jiffies_64 (i.e. return value of
133 : : * get_jiffies_64() */
134 : : #define time_after64(a,b) \
135 : : (typecheck(__u64, a) && \
136 : : typecheck(__u64, b) && \
137 : : ((__s64)((b) - (a)) < 0))
138 : : #define time_before64(a,b) time_after64(b,a)
139 : :
140 : : #define time_after_eq64(a,b) \
141 : : (typecheck(__u64, a) && \
142 : : typecheck(__u64, b) && \
143 : : ((__s64)((a) - (b)) >= 0))
144 : : #define time_before_eq64(a,b) time_after_eq64(b,a)
145 : :
146 : : #define time_in_range64(a, b, c) \
147 : : (time_after_eq64(a, b) && \
148 : : time_before_eq64(a, c))
149 : :
150 : : /*
151 : : * These four macros compare jiffies and 'a' for convenience.
152 : : */
153 : :
154 : : /* time_is_before_jiffies(a) return true if a is before jiffies */
155 : : #define time_is_before_jiffies(a) time_after(jiffies, a)
156 : : #define time_is_before_jiffies64(a) time_after64(get_jiffies_64(), a)
157 : :
158 : : /* time_is_after_jiffies(a) return true if a is after jiffies */
159 : : #define time_is_after_jiffies(a) time_before(jiffies, a)
160 : : #define time_is_after_jiffies64(a) time_before64(get_jiffies_64(), a)
161 : :
162 : : /* time_is_before_eq_jiffies(a) return true if a is before or equal to jiffies*/
163 : : #define time_is_before_eq_jiffies(a) time_after_eq(jiffies, a)
164 : : #define time_is_before_eq_jiffies64(a) time_after_eq64(get_jiffies_64(), a)
165 : :
166 : : /* time_is_after_eq_jiffies(a) return true if a is after or equal to jiffies*/
167 : : #define time_is_after_eq_jiffies(a) time_before_eq(jiffies, a)
168 : : #define time_is_after_eq_jiffies64(a) time_before_eq64(get_jiffies_64(), a)
169 : :
170 : : /*
171 : : * Have the 32 bit jiffies value wrap 5 minutes after boot
172 : : * so jiffies wrap bugs show up earlier.
173 : : */
174 : : #define INITIAL_JIFFIES ((unsigned long)(unsigned int) (-300*HZ))
175 : :
176 : : /*
177 : : * Change timeval to jiffies, trying to avoid the
178 : : * most obvious overflows..
179 : : *
180 : : * And some not so obvious.
181 : : *
182 : : * Note that we don't want to return LONG_MAX, because
183 : : * for various timeout reasons we often end up having
184 : : * to wait "jiffies+1" in order to guarantee that we wait
185 : : * at _least_ "jiffies" - so "jiffies+1" had better still
186 : : * be positive.
187 : : */
188 : : #define MAX_JIFFY_OFFSET ((LONG_MAX >> 1)-1)
189 : :
190 : : extern unsigned long preset_lpj;
191 : :
192 : : /*
193 : : * We want to do realistic conversions of time so we need to use the same
194 : : * values the update wall clock code uses as the jiffies size. This value
195 : : * is: TICK_NSEC (which is defined in timex.h). This
196 : : * is a constant and is in nanoseconds. We will use scaled math
197 : : * with a set of scales defined here as SEC_JIFFIE_SC, USEC_JIFFIE_SC and
198 : : * NSEC_JIFFIE_SC. Note that these defines contain nothing but
199 : : * constants and so are computed at compile time. SHIFT_HZ (computed in
200 : : * timex.h) adjusts the scaling for different HZ values.
201 : :
202 : : * Scaled math??? What is that?
203 : : *
204 : : * Scaled math is a way to do integer math on values that would,
205 : : * otherwise, either overflow, underflow, or cause undesired div
206 : : * instructions to appear in the execution path. In short, we "scale"
207 : : * up the operands so they take more bits (more precision, less
208 : : * underflow), do the desired operation and then "scale" the result back
209 : : * by the same amount. If we do the scaling by shifting we avoid the
210 : : * costly mpy and the dastardly div instructions.
211 : :
212 : : * Suppose, for example, we want to convert from seconds to jiffies
213 : : * where jiffies is defined in nanoseconds as NSEC_PER_JIFFIE. The
214 : : * simple math is: jiff = (sec * NSEC_PER_SEC) / NSEC_PER_JIFFIE; We
215 : : * observe that (NSEC_PER_SEC / NSEC_PER_JIFFIE) is a constant which we
216 : : * might calculate at compile time, however, the result will only have
217 : : * about 3-4 bits of precision (less for smaller values of HZ).
218 : : *
219 : : * So, we scale as follows:
220 : : * jiff = (sec) * (NSEC_PER_SEC / NSEC_PER_JIFFIE);
221 : : * jiff = ((sec) * ((NSEC_PER_SEC * SCALE)/ NSEC_PER_JIFFIE)) / SCALE;
222 : : * Then we make SCALE a power of two so:
223 : : * jiff = ((sec) * ((NSEC_PER_SEC << SCALE)/ NSEC_PER_JIFFIE)) >> SCALE;
224 : : * Now we define:
225 : : * #define SEC_CONV = ((NSEC_PER_SEC << SCALE)/ NSEC_PER_JIFFIE))
226 : : * jiff = (sec * SEC_CONV) >> SCALE;
227 : : *
228 : : * Often the math we use will expand beyond 32-bits so we tell C how to
229 : : * do this and pass the 64-bit result of the mpy through the ">> SCALE"
230 : : * which should take the result back to 32-bits. We want this expansion
231 : : * to capture as much precision as possible. At the same time we don't
232 : : * want to overflow so we pick the SCALE to avoid this. In this file,
233 : : * that means using a different scale for each range of HZ values (as
234 : : * defined in timex.h).
235 : : *
236 : : * For those who want to know, gcc will give a 64-bit result from a "*"
237 : : * operator if the result is a long long AND at least one of the
238 : : * operands is cast to long long (usually just prior to the "*" so as
239 : : * not to confuse it into thinking it really has a 64-bit operand,
240 : : * which, buy the way, it can do, but it takes more code and at least 2
241 : : * mpys).
242 : :
243 : : * We also need to be aware that one second in nanoseconds is only a
244 : : * couple of bits away from overflowing a 32-bit word, so we MUST use
245 : : * 64-bits to get the full range time in nanoseconds.
246 : :
247 : : */
248 : :
249 : : /*
250 : : * Here are the scales we will use. One for seconds, nanoseconds and
251 : : * microseconds.
252 : : *
253 : : * Within the limits of cpp we do a rough cut at the SEC_JIFFIE_SC and
254 : : * check if the sign bit is set. If not, we bump the shift count by 1.
255 : : * (Gets an extra bit of precision where we can use it.)
256 : : * We know it is set for HZ = 1024 and HZ = 100 not for 1000.
257 : : * Haven't tested others.
258 : :
259 : : * Limits of cpp (for #if expressions) only long (no long long), but
260 : : * then we only need the most signicant bit.
261 : : */
262 : :
263 : : #define SEC_JIFFIE_SC (31 - SHIFT_HZ)
264 : : #if !((((NSEC_PER_SEC << 2) / TICK_NSEC) << (SEC_JIFFIE_SC - 2)) & 0x80000000)
265 : : #undef SEC_JIFFIE_SC
266 : : #define SEC_JIFFIE_SC (32 - SHIFT_HZ)
267 : : #endif
268 : : #define NSEC_JIFFIE_SC (SEC_JIFFIE_SC + 29)
269 : : #define SEC_CONVERSION ((unsigned long)((((u64)NSEC_PER_SEC << SEC_JIFFIE_SC) +\
270 : : TICK_NSEC -1) / (u64)TICK_NSEC))
271 : :
272 : : #define NSEC_CONVERSION ((unsigned long)((((u64)1 << NSEC_JIFFIE_SC) +\
273 : : TICK_NSEC -1) / (u64)TICK_NSEC))
274 : : /*
275 : : * The maximum jiffie value is (MAX_INT >> 1). Here we translate that
276 : : * into seconds. The 64-bit case will overflow if we are not careful,
277 : : * so use the messy SH_DIV macro to do it. Still all constants.
278 : : */
279 : : #if BITS_PER_LONG < 64
280 : : # define MAX_SEC_IN_JIFFIES \
281 : : (long)((u64)((u64)MAX_JIFFY_OFFSET * TICK_NSEC) / NSEC_PER_SEC)
282 : : #else /* take care of overflow on 64 bits machines */
283 : : # define MAX_SEC_IN_JIFFIES \
284 : : (SH_DIV((MAX_JIFFY_OFFSET >> SEC_JIFFIE_SC) * TICK_NSEC, NSEC_PER_SEC, 1) - 1)
285 : :
286 : : #endif
287 : :
288 : : /*
289 : : * Convert various time units to each other:
290 : : */
291 : : extern unsigned int jiffies_to_msecs(const unsigned long j);
292 : : extern unsigned int jiffies_to_usecs(const unsigned long j);
293 : :
294 : 0 : static inline u64 jiffies_to_nsecs(const unsigned long j)
295 : : {
296 [ # # # # ]: 0 : return (u64)jiffies_to_usecs(j) * NSEC_PER_USEC;
297 : : }
298 : :
299 : : extern u64 jiffies64_to_nsecs(u64 j);
300 : : extern u64 jiffies64_to_msecs(u64 j);
301 : :
302 : : extern unsigned long __msecs_to_jiffies(const unsigned int m);
303 : : #if HZ <= MSEC_PER_SEC && !(MSEC_PER_SEC % HZ)
304 : : /*
305 : : * HZ is equal to or smaller than 1000, and 1000 is a nice round
306 : : * multiple of HZ, divide with the factor between them, but round
307 : : * upwards:
308 : : */
309 : 14596 : static inline unsigned long _msecs_to_jiffies(const unsigned int m)
310 : : {
311 : 14596 : return (m + (MSEC_PER_SEC / HZ) - 1) / (MSEC_PER_SEC / HZ);
312 : : }
313 : : #elif HZ > MSEC_PER_SEC && !(HZ % MSEC_PER_SEC)
314 : : /*
315 : : * HZ is larger than 1000, and HZ is a nice round multiple of 1000 -
316 : : * simply multiply with the factor between them.
317 : : *
318 : : * But first make sure the multiplication result cannot overflow:
319 : : */
320 : : static inline unsigned long _msecs_to_jiffies(const unsigned int m)
321 : : {
322 : : if (m > jiffies_to_msecs(MAX_JIFFY_OFFSET))
323 : : return MAX_JIFFY_OFFSET;
324 : : return m * (HZ / MSEC_PER_SEC);
325 : : }
326 : : #else
327 : : /*
328 : : * Generic case - multiply, round and divide. But first check that if
329 : : * we are doing a net multiplication, that we wouldn't overflow:
330 : : */
331 : : static inline unsigned long _msecs_to_jiffies(const unsigned int m)
332 : : {
333 : : if (HZ > MSEC_PER_SEC && m > jiffies_to_msecs(MAX_JIFFY_OFFSET))
334 : : return MAX_JIFFY_OFFSET;
335 : :
336 : : return (MSEC_TO_HZ_MUL32 * m + MSEC_TO_HZ_ADJ32) >> MSEC_TO_HZ_SHR32;
337 : : }
338 : : #endif
339 : : /**
340 : : * msecs_to_jiffies: - convert milliseconds to jiffies
341 : : * @m: time in milliseconds
342 : : *
343 : : * conversion is done as follows:
344 : : *
345 : : * - negative values mean 'infinite timeout' (MAX_JIFFY_OFFSET)
346 : : *
347 : : * - 'too large' values [that would result in larger than
348 : : * MAX_JIFFY_OFFSET values] mean 'infinite timeout' too.
349 : : *
350 : : * - all other values are converted to jiffies by either multiplying
351 : : * the input value by a factor or dividing it with a factor and
352 : : * handling any 32-bit overflows.
353 : : * for the details see __msecs_to_jiffies()
354 : : *
355 : : * msecs_to_jiffies() checks for the passed in value being a constant
356 : : * via __builtin_constant_p() allowing gcc to eliminate most of the
357 : : * code, __msecs_to_jiffies() is called if the value passed does not
358 : : * allow constant folding and the actual conversion must be done at
359 : : * runtime.
360 : : * the HZ range specific helpers _msecs_to_jiffies() are called both
361 : : * directly here and from __msecs_to_jiffies() in the case where
362 : : * constant folding is not possible.
363 : : */
364 : 14532 : static __always_inline unsigned long msecs_to_jiffies(const unsigned int m)
365 : : {
366 [ - + - + : 14493 : if (__builtin_constant_p(m)) {
- - - + -
+ # # # #
# # # # #
# ]
367 [ # # # # : 12906 : if ((int)m < 0)
# # # # #
# ]
368 : : return MAX_JIFFY_OFFSET;
369 [ + - - - : 12942 : return _msecs_to_jiffies(m);
- + ]
370 : : } else {
371 : 1590 : return __msecs_to_jiffies(m);
372 : : }
373 : : }
374 : :
375 : : extern unsigned long __usecs_to_jiffies(const unsigned int u);
376 : : #if !(USEC_PER_SEC % HZ)
377 : 3 : static inline unsigned long _usecs_to_jiffies(const unsigned int u)
378 : : {
379 : 3 : return (u + (USEC_PER_SEC / HZ) - 1) / (USEC_PER_SEC / HZ);
380 : : }
381 : : #else
382 : : static inline unsigned long _usecs_to_jiffies(const unsigned int u)
383 : : {
384 : : return (USEC_TO_HZ_MUL32 * u + USEC_TO_HZ_ADJ32)
385 : : >> USEC_TO_HZ_SHR32;
386 : : }
387 : : #endif
388 : :
389 : : /**
390 : : * usecs_to_jiffies: - convert microseconds to jiffies
391 : : * @u: time in microseconds
392 : : *
393 : : * conversion is done as follows:
394 : : *
395 : : * - 'too large' values [that would result in larger than
396 : : * MAX_JIFFY_OFFSET values] mean 'infinite timeout' too.
397 : : *
398 : : * - all other values are converted to jiffies by either multiplying
399 : : * the input value by a factor or dividing it with a factor and
400 : : * handling any 32-bit overflows as for msecs_to_jiffies.
401 : : *
402 : : * usecs_to_jiffies() checks for the passed in value being a constant
403 : : * via __builtin_constant_p() allowing gcc to eliminate most of the
404 : : * code, __usecs_to_jiffies() is called if the value passed does not
405 : : * allow constant folding and the actual conversion must be done at
406 : : * runtime.
407 : : * the HZ range specific helpers _usecs_to_jiffies() are called both
408 : : * directly here and from __msecs_to_jiffies() in the case where
409 : : * constant folding is not possible.
410 : : */
411 : 3 : static __always_inline unsigned long usecs_to_jiffies(const unsigned int u)
412 : : {
413 [ - + # # : 3 : if (__builtin_constant_p(u)) {
# # ]
414 [ # # # # : 0 : if (u > jiffies_to_usecs(MAX_JIFFY_OFFSET))
# # ]
415 : : return MAX_JIFFY_OFFSET;
416 : 0 : return _usecs_to_jiffies(u);
417 : : } else {
418 : 3 : return __usecs_to_jiffies(u);
419 : : }
420 : : }
421 : :
422 : : extern unsigned long timespec64_to_jiffies(const struct timespec64 *value);
423 : : extern void jiffies_to_timespec64(const unsigned long jiffies,
424 : : struct timespec64 *value);
425 : : extern clock_t jiffies_to_clock_t(unsigned long x);
426 : 0 : static inline clock_t jiffies_delta_to_clock_t(long delta)
427 : : {
428 : 0 : return jiffies_to_clock_t(max(0L, delta));
429 : : }
430 : :
431 : 0 : static inline unsigned int jiffies_delta_to_msecs(long delta)
432 : : {
433 : 0 : return jiffies_to_msecs(max(0L, delta));
434 : : }
435 : :
436 : : extern unsigned long clock_t_to_jiffies(unsigned long x);
437 : : extern u64 jiffies_64_to_clock_t(u64 x);
438 : : extern u64 nsec_to_clock_t(u64 x);
439 : : extern u64 nsecs_to_jiffies64(u64 n);
440 : : extern unsigned long nsecs_to_jiffies(u64 n);
441 : :
442 : : #define TIMESTAMP_SIZE 30
443 : :
444 : : #endif
|