Blame view
include/linux/time.h
8.76 KB
1da177e4c
|
1 2 3 4 5 6 |
#ifndef _LINUX_TIME_H #define _LINUX_TIME_H #include <linux/types.h> #ifdef __KERNEL__ |
82644459c
|
7 |
# include <linux/cache.h> |
57a558757
|
8 |
# include <linux/seqlock.h> |
f595ec964
|
9 |
# include <linux/math64.h> |
1da177e4c
|
10 11 12 13 14 |
#endif #ifndef _STRUCT_TIMESPEC #define _STRUCT_TIMESPEC struct timespec { |
85efde6f4
|
15 16 |
__kernel_time_t tv_sec; /* seconds */ long tv_nsec; /* nanoseconds */ |
1da177e4c
|
17 |
}; |
57a558757
|
18 |
#endif |
1da177e4c
|
19 20 |
struct timeval { |
85efde6f4
|
21 22 |
__kernel_time_t tv_sec; /* seconds */ __kernel_suseconds_t tv_usec; /* microseconds */ |
1da177e4c
|
23 24 25 26 27 28 29 30 |
}; struct timezone { int tz_minuteswest; /* minutes west of Greenwich */ int tz_dsttime; /* type of dst correction */ }; #ifdef __KERNEL__ |
b418da16d
|
31 |
extern struct timezone sys_tz; |
57a558757
|
32 |
/* Parameters used to convert the timespec values: */ |
05ebb7610
|
33 34 35 36 37 38 |
#define MSEC_PER_SEC 1000L #define USEC_PER_MSEC 1000L #define NSEC_PER_USEC 1000L #define NSEC_PER_MSEC 1000000L #define USEC_PER_SEC 1000000L #define NSEC_PER_SEC 1000000000L |
4936a3b90
|
39 |
#define FSEC_PER_SEC 1000000000000000LL |
1da177e4c
|
40 |
|
df0cc0539
|
41 |
#define TIME_T_MAX (time_t)((1UL << ((sizeof(time_t) << 3) - 1)) - 1) |
5b78cc9ac
|
42 43 |
static inline int timespec_equal(const struct timespec *a, const struct timespec *b) |
57a558757
|
44 |
{ |
1da177e4c
|
45 |
return (a->tv_sec == b->tv_sec) && (a->tv_nsec == b->tv_nsec); |
57a558757
|
46 |
} |
1da177e4c
|
47 |
|
643a65454
|
48 49 50 51 52 |
/* * lhs < rhs: return <0 * lhs == rhs: return 0 * lhs > rhs: return >0 */ |
77adbfbf4
|
53 |
static inline int timespec_compare(const struct timespec *lhs, const struct timespec *rhs) |
643a65454
|
54 55 56 57 58 59 60 |
{ if (lhs->tv_sec < rhs->tv_sec) return -1; if (lhs->tv_sec > rhs->tv_sec) return 1; return lhs->tv_nsec - rhs->tv_nsec; } |
77adbfbf4
|
61 |
static inline int timeval_compare(const struct timeval *lhs, const struct timeval *rhs) |
643a65454
|
62 63 64 65 66 67 68 |
{ if (lhs->tv_sec < rhs->tv_sec) return -1; if (lhs->tv_sec > rhs->tv_sec) return 1; return lhs->tv_usec - rhs->tv_usec; } |
f4818900f
|
69 70 71 |
extern unsigned long mktime(const unsigned int year, const unsigned int mon, const unsigned int day, const unsigned int hour, const unsigned int min, const unsigned int sec); |
12e09337f
|
72 |
extern void set_normalized_timespec(struct timespec *ts, time_t sec, s64 nsec); |
ce3bf7ab2
|
73 74 75 76 77 78 |
/* * timespec_add_safe assumes both values are positive and checks * for overflow. It will return TIME_T_MAX if the reutrn would be * smaller then either of the arguments. */ |
df0cc0539
|
79 80 |
extern struct timespec timespec_add_safe(const struct timespec lhs, const struct timespec rhs); |
1da177e4c
|
81 |
|
ce3bf7ab2
|
82 83 84 85 86 87 88 89 90 |
static inline struct timespec timespec_add(struct timespec lhs, struct timespec rhs) { struct timespec ts_delta; set_normalized_timespec(&ts_delta, lhs.tv_sec + rhs.tv_sec, lhs.tv_nsec + rhs.tv_nsec); return ts_delta; } |
5f82b2b77
|
91 |
/* |
ca74e92b4
|
92 93 94 95 96 97 98 99 100 101 102 103 |
* sub = lhs - rhs, in normalized form */ static inline struct timespec timespec_sub(struct timespec lhs, struct timespec rhs) { struct timespec ts_delta; set_normalized_timespec(&ts_delta, lhs.tv_sec - rhs.tv_sec, lhs.tv_nsec - rhs.tv_nsec); return ts_delta; } /* |
5f82b2b77
|
104 105 106 |
* Returns true if the timespec is norm, false if denorm: */ #define timespec_valid(ts) \ |
bd3f8f2b1
|
107 |
(((ts)->tv_sec >= 0) && (((unsigned long) (ts)->tv_nsec) < NSEC_PER_SEC)) |
5f82b2b77
|
108 |
|
ba2a631b1
|
109 |
extern seqlock_t xtime_lock; |
1da177e4c
|
110 |
|
d4f587c67
|
111 |
extern void read_persistent_clock(struct timespec *ts); |
23970e389
|
112 |
extern void read_boot_clock(struct timespec *ts); |
82644459c
|
113 114 |
extern int update_persistent_clock(struct timespec now); extern int no_sync_cmos_clock __read_mostly; |
ad596171e
|
115 |
void timekeeping_init(void); |
1c5745aa3
|
116 |
extern int timekeeping_suspended; |
ad596171e
|
117 |
|
17c38b749
|
118 |
unsigned long get_seconds(void); |
1da177e4c
|
119 |
struct timespec current_kernel_time(void); |
8ab4351a4
|
120 121 |
struct timespec __current_kernel_time(void); /* does not take xtime_lock */ struct timespec __get_wall_to_monotonic(void); /* does not take xtime_lock */ |
da15cfdae
|
122 |
struct timespec get_monotonic_coarse(void); |
1da177e4c
|
123 |
|
57a558757
|
124 |
#define CURRENT_TIME (current_kernel_time()) |
2c6b47de1
|
125 |
#define CURRENT_TIME_SEC ((struct timespec) { get_seconds(), 0 }) |
1da177e4c
|
126 |
|
7d27558c4
|
127 128 129 130 131 132 133 134 135 136 137 138 139 140 |
/* Some architectures do not supply their own clocksource. * This is mainly the case in architectures that get their * inter-tick times by reading the counter on their interval * timer. Since these timers wrap every tick, they're not really * useful as clocksources. Wrapping them to act like one is possible * but not very efficient. So we provide a callout these arches * can implement for use with the jiffies clocksource to provide * finer then tick granular time. */ #ifdef CONFIG_ARCH_USES_GETTIMEOFFSET extern u32 arch_gettimeoffset(void); #else static inline u32 arch_gettimeoffset(void) { return 0; } #endif |
1da177e4c
|
141 142 143 |
extern void do_gettimeofday(struct timeval *tv); extern int do_settimeofday(struct timespec *tv); extern int do_sys_settimeofday(struct timespec *tv, struct timezone *tz); |
becf8b5d0
|
144 |
#define do_posix_clock_monotonic_gettime(ts) ktime_get_ts(ts) |
c78873252
|
145 |
extern long do_utimes(int dfd, const char __user *filename, struct timespec *times, int flags); |
1da177e4c
|
146 |
struct itimerval; |
57a558757
|
147 148 |
extern int do_setitimer(int which, struct itimerval *value, struct itimerval *ovalue); |
c08b8a491
|
149 |
extern unsigned int alarm_setitimer(unsigned int seconds); |
1da177e4c
|
150 |
extern int do_getitimer(int which, struct itimerval *value); |
57a558757
|
151 |
extern void getnstimeofday(struct timespec *tv); |
2d42244ae
|
152 |
extern void getrawmonotonic(struct timespec *ts); |
7c3f1a573
|
153 154 |
extern void getboottime(struct timespec *ts); extern void monotonic_to_bootbased(struct timespec *ts); |
1da177e4c
|
155 156 |
extern struct timespec timespec_trunc(struct timespec t, unsigned gran); |
cf4fc6cb7
|
157 |
extern int timekeeping_valid_for_hres(void); |
98962465e
|
158 |
extern u64 timekeeping_max_deferment(void); |
8524070b7
|
159 |
extern void update_wall_time(void); |
31089c13b
|
160 |
extern void timekeeping_leap_insert(int leapsecond); |
1da177e4c
|
161 |
|
f06febc96
|
162 163 |
struct tms; extern void do_sys_times(struct tms *); |
57f1f0874
|
164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 |
/* * Similar to the struct tm in userspace <time.h>, but it needs to be here so * that the kernel source is self contained. */ struct tm { /* * the number of seconds after the minute, normally in the range * 0 to 59, but can be up to 60 to allow for leap seconds */ int tm_sec; /* the number of minutes after the hour, in the range 0 to 59*/ int tm_min; /* the number of hours past midnight, in the range 0 to 23 */ int tm_hour; /* the day of the month, in the range 1 to 31 */ int tm_mday; /* the number of months since January, in the range 0 to 11 */ int tm_mon; /* the number of years since 1900 */ long tm_year; /* the number of days since Sunday, in the range 0 to 6 */ int tm_wday; /* the number of days since January 1, in the range 0 to 365 */ int tm_yday; }; void time_to_tm(time_t totalsecs, int offset, struct tm *result); |
f8f46da3b
|
191 192 193 194 195 196 197 |
/** * timespec_to_ns - Convert timespec to nanoseconds * @ts: pointer to the timespec variable to be converted * * Returns the scalar nanosecond representation of the timespec * parameter. */ |
df869b630
|
198 |
static inline s64 timespec_to_ns(const struct timespec *ts) |
f8f46da3b
|
199 |
{ |
df869b630
|
200 |
return ((s64) ts->tv_sec * NSEC_PER_SEC) + ts->tv_nsec; |
f8f46da3b
|
201 202 203 204 205 206 207 208 209 |
} /** * timeval_to_ns - Convert timeval to nanoseconds * @ts: pointer to the timeval variable to be converted * * Returns the scalar nanosecond representation of the timeval * parameter. */ |
df869b630
|
210 |
static inline s64 timeval_to_ns(const struct timeval *tv) |
f8f46da3b
|
211 |
{ |
df869b630
|
212 |
return ((s64) tv->tv_sec * NSEC_PER_SEC) + |
f8f46da3b
|
213 214 215 216 217 218 219 220 221 |
tv->tv_usec * NSEC_PER_USEC; } /** * ns_to_timespec - Convert nanoseconds to timespec * @nsec: the nanoseconds value to be converted * * Returns the timespec representation of the nsec parameter. */ |
df869b630
|
222 |
extern struct timespec ns_to_timespec(const s64 nsec); |
f8f46da3b
|
223 224 225 226 227 228 229 |
/** * ns_to_timeval - Convert nanoseconds to timeval * @nsec: the nanoseconds value to be converted * * Returns the timeval representation of the nsec parameter. */ |
df869b630
|
230 |
extern struct timeval ns_to_timeval(const s64 nsec); |
f8f46da3b
|
231 |
|
cf3c769b4
|
232 233 234 235 |
/** * timespec_add_ns - Adds nanoseconds to a timespec * @a: pointer to timespec to be incremented * @ns: unsigned nanoseconds value to be added |
9412e2864
|
236 237 238 |
* * This must always be inlined because its used from the x86-64 vdso, * which cannot call other kernel functions. |
cf3c769b4
|
239 |
*/ |
9412e2864
|
240 |
static __always_inline void timespec_add_ns(struct timespec *a, u64 ns) |
cf3c769b4
|
241 |
{ |
9412e2864
|
242 |
a->tv_sec += __iter_div_u64_rem(a->tv_nsec + ns, NSEC_PER_SEC, &ns); |
cf3c769b4
|
243 244 |
a->tv_nsec = ns; } |
1da177e4c
|
245 246 247 248 249 250 251 252 253 254 255 256 |
#endif /* __KERNEL__ */ #define NFDBITS __NFDBITS #define FD_SETSIZE __FD_SETSIZE #define FD_SET(fd,fdsetp) __FD_SET(fd,fdsetp) #define FD_CLR(fd,fdsetp) __FD_CLR(fd,fdsetp) #define FD_ISSET(fd,fdsetp) __FD_ISSET(fd,fdsetp) #define FD_ZERO(fdsetp) __FD_ZERO(fdsetp) /* * Names of the interval timers, and structure |
57a558757
|
257 |
* defining a timer setting: |
1da177e4c
|
258 |
*/ |
57a558757
|
259 260 261 |
#define ITIMER_REAL 0 #define ITIMER_VIRTUAL 1 #define ITIMER_PROF 2 |
1da177e4c
|
262 |
|
57a558757
|
263 264 265 |
struct itimerspec { struct timespec it_interval; /* timer period */ struct timespec it_value; /* timer expiration */ |
1da177e4c
|
266 |
}; |
57a558757
|
267 268 269 |
struct itimerval { struct timeval it_interval; /* timer interval */ struct timeval it_value; /* current value */ |
1da177e4c
|
270 |
}; |
1da177e4c
|
271 |
/* |
57a558757
|
272 |
* The IDs of the various system clocks (for POSIX.1b interval timers): |
1da177e4c
|
273 |
*/ |
1ad106ca1
|
274 275 276 277 |
#define CLOCK_REALTIME 0 #define CLOCK_MONOTONIC 1 #define CLOCK_PROCESS_CPUTIME_ID 2 #define CLOCK_THREAD_CPUTIME_ID 3 |
2d42244ae
|
278 |
#define CLOCK_MONOTONIC_RAW 4 |
da15cfdae
|
279 280 |
#define CLOCK_REALTIME_COARSE 5 #define CLOCK_MONOTONIC_COARSE 6 |
1da177e4c
|
281 282 |
/* |
57a558757
|
283 |
* The IDs of various hardware clocks: |
1da177e4c
|
284 |
*/ |
1ad106ca1
|
285 286 287 288 |
#define CLOCK_SGI_CYCLE 10 #define MAX_CLOCKS 16 #define CLOCKS_MASK (CLOCK_REALTIME | CLOCK_MONOTONIC) #define CLOCKS_MONO CLOCK_MONOTONIC |
1da177e4c
|
289 290 |
/* |
57a558757
|
291 |
* The various flags for setting POSIX.1b interval timers: |
1da177e4c
|
292 |
*/ |
1ad106ca1
|
293 |
#define TIMER_ABSTIME 0x01 |
1da177e4c
|
294 295 |
#endif |