Linux Kernel
3.7.1
Main Page
Related Pages
Modules
Namespaces
Data Structures
Files
File List
Globals
All
Data Structures
Namespaces
Files
Functions
Variables
Typedefs
Enumerations
Enumerator
Macros
Groups
Pages
include
linux
jiffies.h
Go to the documentation of this file.
1
#ifndef _LINUX_JIFFIES_H
2
#define _LINUX_JIFFIES_H
3
4
#include <
linux/math64.h
>
5
#include <linux/kernel.h>
6
#include <linux/types.h>
7
#include <linux/time.h>
8
#include <linux/timex.h>
9
#include <asm/param.h>
/* for HZ */
10
11
/*
12
* The following defines establish the engineering parameters of the PLL
13
* model. The HZ variable establishes the timer interrupt frequency, 100 Hz
14
* for the SunOS kernel, 256 Hz for the Ultrix kernel and 1024 Hz for the
15
* OSF/1 kernel. The SHIFT_HZ define expresses the same value as the
16
* nearest power of two in order to avoid hardware multiply operations.
17
*/
18
#if HZ >= 12 && HZ < 24
19
# define SHIFT_HZ 4
20
#elif HZ >= 24 && HZ < 48
21
# define SHIFT_HZ 5
22
#elif HZ >= 48 && HZ < 96
23
# define SHIFT_HZ 6
24
#elif HZ >= 96 && HZ < 192
25
# define SHIFT_HZ 7
26
#elif HZ >= 192 && HZ < 384
27
# define SHIFT_HZ 8
28
#elif HZ >= 384 && HZ < 768
29
# define SHIFT_HZ 9
30
#elif HZ >= 768 && HZ < 1536
31
# define SHIFT_HZ 10
32
#elif HZ >= 1536 && HZ < 3072
33
# define SHIFT_HZ 11
34
#elif HZ >= 3072 && HZ < 6144
35
# define SHIFT_HZ 12
36
#elif HZ >= 6144 && HZ < 12288
37
# define SHIFT_HZ 13
38
#else
39
# error Invalid value of HZ.
40
#endif
41
42
/* Suppose we want to divide two numbers NOM and DEN: NOM/DEN, then we can
43
* improve accuracy by shifting LSH bits, hence calculating:
44
* (NOM << LSH) / DEN
45
* This however means trouble for large NOM, because (NOM << LSH) may no
46
* longer fit in 32 bits. The following way of calculating this gives us
47
* some slack, under the following conditions:
48
* - (NOM / DEN) fits in (32 - LSH) bits.
49
* - (NOM % DEN) fits in (32 - LSH) bits.
50
*/
51
#define SH_DIV(NOM,DEN,LSH) ( (((NOM) / (DEN)) << (LSH)) \
52
+ ((((NOM) % (DEN)) << (LSH)) + (DEN) / 2) / (DEN))
53
54
/* LATCH is used in the interval timer and ftape setup. */
55
#define LATCH ((CLOCK_TICK_RATE + HZ/2) / HZ)
/* For divider */
56
57
extern
int
register_refined_jiffies
(
long
clock_tick_rate);
58
59
/* TICK_NSEC is the time between ticks in nsec assuming SHIFTED_HZ */
60
#define TICK_NSEC ((NSEC_PER_SEC+HZ/2)/HZ)
61
62
/* TICK_USEC is the time between ticks in usec assuming fake USER_HZ */
63
#define TICK_USEC ((1000000UL + USER_HZ/2) / USER_HZ)
64
65
/* some arch's have a small-data section that can be accessed register-relative
66
* but that can only take up to, say, 4-byte variables. jiffies being part of
67
* an 8-byte variable may not be correctly accessed unless we force the issue
68
*/
69
#define __jiffy_data __attribute__((section(".data")))
70
71
/*
72
* The 64-bit value is not atomic - you MUST NOT read it
73
* without sampling the sequence number in xtime_lock.
74
* get_jiffies_64() will do this for you as appropriate.
75
*/
76
extern
u64
__jiffy_data
jiffies_64
;
77
extern
unsigned
long
volatile
__jiffy_data
jiffies
;
78
79
#if (BITS_PER_LONG < 64)
80
u64
get_jiffies_64
(
void
);
81
#else
82
static
inline
u64
get_jiffies_64
(
void
)
83
{
84
return
(
u64
)
jiffies
;
85
}
86
#endif
87
88
/*
89
* These inlines deal with timer wrapping correctly. You are
90
* strongly encouraged to use them
91
* 1. Because people otherwise forget
92
* 2. Because if the timer wrap changes in future you won't have to
93
* alter your driver code.
94
*
95
* time_after(a,b) returns true if the time a is after time b.
96
*
97
* Do this with "<0" and ">=0" to only test the sign of the result. A
98
* good compiler would generate better code (and a really good compiler
99
* wouldn't care). Gcc is currently neither.
100
*/
101
#define time_after(a,b) \
102
(typecheck(unsigned long, a) && \
103
typecheck(unsigned long, b) && \
104
((long)(b) - (long)(a) < 0))
105
#define time_before(a,b) time_after(b,a)
106
107
#define time_after_eq(a,b) \
108
(typecheck(unsigned long, a) && \
109
typecheck(unsigned long, b) && \
110
((long)(a) - (long)(b) >= 0))
111
#define time_before_eq(a,b) time_after_eq(b,a)
112
113
/*
114
* Calculate whether a is in the range of [b, c].
115
*/
116
#define time_in_range(a,b,c) \
117
(time_after_eq(a,b) && \
118
time_before_eq(a,c))
119
120
/*
121
* Calculate whether a is in the range of [b, c).
122
*/
123
#define time_in_range_open(a,b,c) \
124
(time_after_eq(a,b) && \
125
time_before(a,c))
126
127
/* Same as above, but does so with platform independent 64bit types.
128
* These must be used when utilizing jiffies_64 (i.e. return value of
129
* get_jiffies_64() */
130
#define time_after64(a,b) \
131
(typecheck(__u64, a) && \
132
typecheck(__u64, b) && \
133
((__s64)(b) - (__s64)(a) < 0))
134
#define time_before64(a,b) time_after64(b,a)
135
136
#define time_after_eq64(a,b) \
137
(typecheck(__u64, a) && \
138
typecheck(__u64, b) && \
139
((__s64)(a) - (__s64)(b) >= 0))
140
#define time_before_eq64(a,b) time_after_eq64(b,a)
141
142
/*
143
* These four macros compare jiffies and 'a' for convenience.
144
*/
145
146
/* time_is_before_jiffies(a) return true if a is before jiffies */
147
#define time_is_before_jiffies(a) time_after(jiffies, a)
148
149
/* time_is_after_jiffies(a) return true if a is after jiffies */
150
#define time_is_after_jiffies(a) time_before(jiffies, a)
151
152
/* time_is_before_eq_jiffies(a) return true if a is before or equal to jiffies*/
153
#define time_is_before_eq_jiffies(a) time_after_eq(jiffies, a)
154
155
/* time_is_after_eq_jiffies(a) return true if a is after or equal to jiffies*/
156
#define time_is_after_eq_jiffies(a) time_before_eq(jiffies, a)
157
158
/*
159
* Have the 32 bit jiffies value wrap 5 minutes after boot
160
* so jiffies wrap bugs show up earlier.
161
*/
162
#define INITIAL_JIFFIES ((unsigned long)(unsigned int) (-300*HZ))
163
164
/*
165
* Change timeval to jiffies, trying to avoid the
166
* most obvious overflows..
167
*
168
* And some not so obvious.
169
*
170
* Note that we don't want to return LONG_MAX, because
171
* for various timeout reasons we often end up having
172
* to wait "jiffies+1" in order to guarantee that we wait
173
* at _least_ "jiffies" - so "jiffies+1" had better still
174
* be positive.
175
*/
176
#define MAX_JIFFY_OFFSET ((LONG_MAX >> 1)-1)
177
178
extern
unsigned
long
preset_lpj
;
179
180
/*
181
* We want to do realistic conversions of time so we need to use the same
182
* values the update wall clock code uses as the jiffies size. This value
183
* is: TICK_NSEC (which is defined in timex.h). This
184
* is a constant and is in nanoseconds. We will use scaled math
185
* with a set of scales defined here as SEC_JIFFIE_SC, USEC_JIFFIE_SC and
186
* NSEC_JIFFIE_SC. Note that these defines contain nothing but
187
* constants and so are computed at compile time. SHIFT_HZ (computed in
188
* timex.h) adjusts the scaling for different HZ values.
189
190
* Scaled math??? What is that?
191
*
192
* Scaled math is a way to do integer math on values that would,
193
* otherwise, either overflow, underflow, or cause undesired div
194
* instructions to appear in the execution path. In short, we "scale"
195
* up the operands so they take more bits (more precision, less
196
* underflow), do the desired operation and then "scale" the result back
197
* by the same amount. If we do the scaling by shifting we avoid the
198
* costly mpy and the dastardly div instructions.
199
200
* Suppose, for example, we want to convert from seconds to jiffies
201
* where jiffies is defined in nanoseconds as NSEC_PER_JIFFIE. The
202
* simple math is: jiff = (sec * NSEC_PER_SEC) / NSEC_PER_JIFFIE; We
203
* observe that (NSEC_PER_SEC / NSEC_PER_JIFFIE) is a constant which we
204
* might calculate at compile time, however, the result will only have
205
* about 3-4 bits of precision (less for smaller values of HZ).
206
*
207
* So, we scale as follows:
208
* jiff = (sec) * (NSEC_PER_SEC / NSEC_PER_JIFFIE);
209
* jiff = ((sec) * ((NSEC_PER_SEC * SCALE)/ NSEC_PER_JIFFIE)) / SCALE;
210
* Then we make SCALE a power of two so:
211
* jiff = ((sec) * ((NSEC_PER_SEC << SCALE)/ NSEC_PER_JIFFIE)) >> SCALE;
212
* Now we define:
213
* #define SEC_CONV = ((NSEC_PER_SEC << SCALE)/ NSEC_PER_JIFFIE))
214
* jiff = (sec * SEC_CONV) >> SCALE;
215
*
216
* Often the math we use will expand beyond 32-bits so we tell C how to
217
* do this and pass the 64-bit result of the mpy through the ">> SCALE"
218
* which should take the result back to 32-bits. We want this expansion
219
* to capture as much precision as possible. At the same time we don't
220
* want to overflow so we pick the SCALE to avoid this. In this file,
221
* that means using a different scale for each range of HZ values (as
222
* defined in timex.h).
223
*
224
* For those who want to know, gcc will give a 64-bit result from a "*"
225
* operator if the result is a long long AND at least one of the
226
* operands is cast to long long (usually just prior to the "*" so as
227
* not to confuse it into thinking it really has a 64-bit operand,
228
* which, buy the way, it can do, but it takes more code and at least 2
229
* mpys).
230
231
* We also need to be aware that one second in nanoseconds is only a
232
* couple of bits away from overflowing a 32-bit word, so we MUST use
233
* 64-bits to get the full range time in nanoseconds.
234
235
*/
236
237
/*
238
* Here are the scales we will use. One for seconds, nanoseconds and
239
* microseconds.
240
*
241
* Within the limits of cpp we do a rough cut at the SEC_JIFFIE_SC and
242
* check if the sign bit is set. If not, we bump the shift count by 1.
243
* (Gets an extra bit of precision where we can use it.)
244
* We know it is set for HZ = 1024 and HZ = 100 not for 1000.
245
* Haven't tested others.
246
247
* Limits of cpp (for #if expressions) only long (no long long), but
248
* then we only need the most signicant bit.
249
*/
250
251
#define SEC_JIFFIE_SC (31 - SHIFT_HZ)
252
#if !((((NSEC_PER_SEC << 2) / TICK_NSEC) << (SEC_JIFFIE_SC - 2)) & 0x80000000)
253
#undef SEC_JIFFIE_SC
254
#define SEC_JIFFIE_SC (32 - SHIFT_HZ)
255
#endif
256
#define NSEC_JIFFIE_SC (SEC_JIFFIE_SC + 29)
257
#define USEC_JIFFIE_SC (SEC_JIFFIE_SC + 19)
258
#define SEC_CONVERSION ((unsigned long)((((u64)NSEC_PER_SEC << SEC_JIFFIE_SC) +\
259
TICK_NSEC -1) / (u64)TICK_NSEC))
260
261
#define NSEC_CONVERSION ((unsigned long)((((u64)1 << NSEC_JIFFIE_SC) +\
262
TICK_NSEC -1) / (u64)TICK_NSEC))
263
#define USEC_CONVERSION \
264
((unsigned long)((((u64)NSEC_PER_USEC << USEC_JIFFIE_SC) +\
265
TICK_NSEC -1) / (u64)TICK_NSEC))
266
/*
267
* USEC_ROUND is used in the timeval to jiffie conversion. See there
268
* for more details. It is the scaled resolution rounding value. Note
269
* that it is a 64-bit value. Since, when it is applied, we are already
270
* in jiffies (albit scaled), it is nothing but the bits we will shift
271
* off.
272
*/
273
#define USEC_ROUND (u64)(((u64)1 << USEC_JIFFIE_SC) - 1)
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
extern
unsigned
long
msecs_to_jiffies
(
const
unsigned
int
m
);
294
extern
unsigned
long
usecs_to_jiffies
(
const
unsigned
int
u
);
295
extern
unsigned
long
timespec_to_jiffies
(
const
struct
timespec
*
value
);
296
extern
void
jiffies_to_timespec
(
const
unsigned
long
jiffies,
297
struct
timespec
*
value
);
298
extern
unsigned
long
timeval_to_jiffies
(
const
struct
timeval
*
value
);
299
extern
void
jiffies_to_timeval
(
const
unsigned
long
jiffies,
300
struct
timeval
*
value
);
301
302
extern
clock_t
jiffies_to_clock_t
(
unsigned
long
x
);
303
static
inline
clock_t
jiffies_delta_to_clock_t(
long
delta
)
304
{
305
return
jiffies_to_clock_t
(
max
(0L, delta));
306
}
307
308
extern
unsigned
long
clock_t_to_jiffies
(
unsigned
long
x
);
309
extern
u64
jiffies_64_to_clock_t
(
u64
x
);
310
extern
u64
nsec_to_clock_t
(
u64
x
);
311
extern
u64
nsecs_to_jiffies64
(
u64
n
);
312
extern
unsigned
long
nsecs_to_jiffies
(
u64
n
);
313
314
#define TIMESTAMP_SIZE 30
315
316
#endif
Generated on Thu Jan 10 2013 14:51:43 for Linux Kernel by
1.8.2