]> git.proxmox.com Git - mirror_ubuntu-artful-kernel.git/blame - include/linux/time.h
posix_types.h: Cleanup stale __NFDBITS and related definitions
[mirror_ubuntu-artful-kernel.git] / include / linux / time.h
CommitLineData
1da177e4
LT
1#ifndef _LINUX_TIME_H
2#define _LINUX_TIME_H
3
4#include <linux/types.h>
5
6#ifdef __KERNEL__
82644459 7# include <linux/cache.h>
57a55875 8# include <linux/seqlock.h>
f595ec96 9# include <linux/math64.h>
1da177e4
LT
10#endif
11
12#ifndef _STRUCT_TIMESPEC
13#define _STRUCT_TIMESPEC
14struct timespec {
85efde6f
AB
15 __kernel_time_t tv_sec; /* seconds */
16 long tv_nsec; /* nanoseconds */
1da177e4 17};
57a55875 18#endif
1da177e4
LT
19
20struct timeval {
85efde6f
AB
21 __kernel_time_t tv_sec; /* seconds */
22 __kernel_suseconds_t tv_usec; /* microseconds */
1da177e4
LT
23};
24
25struct timezone {
26 int tz_minuteswest; /* minutes west of Greenwich */
27 int tz_dsttime; /* type of dst correction */
28};
29
30#ifdef __KERNEL__
31
b418da16
CH
32extern struct timezone sys_tz;
33
57a55875 34/* Parameters used to convert the timespec values: */
05ebb761
VP
35#define MSEC_PER_SEC 1000L
36#define USEC_PER_MSEC 1000L
37#define NSEC_PER_USEC 1000L
38#define NSEC_PER_MSEC 1000000L
39#define USEC_PER_SEC 1000000L
40#define NSEC_PER_SEC 1000000000L
4936a3b9 41#define FSEC_PER_SEC 1000000000000000LL
1da177e4 42
df0cc053
TG
43#define TIME_T_MAX (time_t)((1UL << ((sizeof(time_t) << 3) - 1)) - 1)
44
5b78cc9a
JE
45static inline int timespec_equal(const struct timespec *a,
46 const struct timespec *b)
57a55875 47{
1da177e4 48 return (a->tv_sec == b->tv_sec) && (a->tv_nsec == b->tv_nsec);
57a55875 49}
1da177e4 50
643a6545
AM
51/*
52 * lhs < rhs: return <0
53 * lhs == rhs: return 0
54 * lhs > rhs: return >0
55 */
77adbfbf 56static inline int timespec_compare(const struct timespec *lhs, const struct timespec *rhs)
643a6545
AM
57{
58 if (lhs->tv_sec < rhs->tv_sec)
59 return -1;
60 if (lhs->tv_sec > rhs->tv_sec)
61 return 1;
62 return lhs->tv_nsec - rhs->tv_nsec;
63}
64
77adbfbf 65static inline int timeval_compare(const struct timeval *lhs, const struct timeval *rhs)
643a6545
AM
66{
67 if (lhs->tv_sec < rhs->tv_sec)
68 return -1;
69 if (lhs->tv_sec > rhs->tv_sec)
70 return 1;
71 return lhs->tv_usec - rhs->tv_usec;
72}
73
f4818900
IM
74extern unsigned long mktime(const unsigned int year, const unsigned int mon,
75 const unsigned int day, const unsigned int hour,
76 const unsigned int min, const unsigned int sec);
77
12e09337 78extern void set_normalized_timespec(struct timespec *ts, time_t sec, s64 nsec);
ce3bf7ab
JS
79
80/*
81 * timespec_add_safe assumes both values are positive and checks
82 * for overflow. It will return TIME_T_MAX if the reutrn would be
83 * smaller then either of the arguments.
84 */
df0cc053
TG
85extern struct timespec timespec_add_safe(const struct timespec lhs,
86 const struct timespec rhs);
1da177e4 87
ce3bf7ab
JS
88
89static inline struct timespec timespec_add(struct timespec lhs,
90 struct timespec rhs)
91{
92 struct timespec ts_delta;
93 set_normalized_timespec(&ts_delta, lhs.tv_sec + rhs.tv_sec,
94 lhs.tv_nsec + rhs.tv_nsec);
95 return ts_delta;
96}
97
ca74e92b
SN
98/*
99 * sub = lhs - rhs, in normalized form
100 */
101static inline struct timespec timespec_sub(struct timespec lhs,
102 struct timespec rhs)
103{
104 struct timespec ts_delta;
105 set_normalized_timespec(&ts_delta, lhs.tv_sec - rhs.tv_sec,
106 lhs.tv_nsec - rhs.tv_nsec);
107 return ts_delta;
108}
109
5f82b2b7
TG
110/*
111 * Returns true if the timespec is norm, false if denorm:
112 */
113#define timespec_valid(ts) \
bd3f8f2b 114 (((ts)->tv_sec >= 0) && (((unsigned long) (ts)->tv_nsec) < NSEC_PER_SEC))
5f82b2b7 115
d4f587c6 116extern void read_persistent_clock(struct timespec *ts);
23970e38 117extern void read_boot_clock(struct timespec *ts);
82644459 118extern int update_persistent_clock(struct timespec now);
ad596171 119void timekeeping_init(void);
1c5745aa 120extern int timekeeping_suspended;
ad596171 121
17c38b74 122unsigned long get_seconds(void);
1da177e4 123struct timespec current_kernel_time(void);
8ab4351a 124struct timespec __current_kernel_time(void); /* does not take xtime_lock */
da15cfda 125struct timespec get_monotonic_coarse(void);
314ac371
JS
126void get_xtime_and_monotonic_and_sleep_offset(struct timespec *xtim,
127 struct timespec *wtom, struct timespec *sleep);
304529b1 128void timekeeping_inject_sleeptime(struct timespec *delta);
1da177e4 129
57a55875 130#define CURRENT_TIME (current_kernel_time())
2c6b47de 131#define CURRENT_TIME_SEC ((struct timespec) { get_seconds(), 0 })
1da177e4 132
7d27558c
JS
133/* Some architectures do not supply their own clocksource.
134 * This is mainly the case in architectures that get their
135 * inter-tick times by reading the counter on their interval
136 * timer. Since these timers wrap every tick, they're not really
137 * useful as clocksources. Wrapping them to act like one is possible
138 * but not very efficient. So we provide a callout these arches
139 * can implement for use with the jiffies clocksource to provide
140 * finer then tick granular time.
141 */
142#ifdef CONFIG_ARCH_USES_GETTIMEOFFSET
143extern u32 arch_gettimeoffset(void);
144#else
145static inline u32 arch_gettimeoffset(void) { return 0; }
146#endif
147
1da177e4 148extern void do_gettimeofday(struct timeval *tv);
1e6d7679
RC
149extern int do_settimeofday(const struct timespec *tv);
150extern int do_sys_settimeofday(const struct timespec *tv,
151 const struct timezone *tz);
becf8b5d 152#define do_posix_clock_monotonic_gettime(ts) ktime_get_ts(ts)
c7887325 153extern long do_utimes(int dfd, const char __user *filename, struct timespec *times, int flags);
1da177e4 154struct itimerval;
57a55875
IM
155extern int do_setitimer(int which, struct itimerval *value,
156 struct itimerval *ovalue);
c08b8a49 157extern unsigned int alarm_setitimer(unsigned int seconds);
1da177e4 158extern int do_getitimer(int which, struct itimerval *value);
57a55875 159extern void getnstimeofday(struct timespec *tv);
2d42244a 160extern void getrawmonotonic(struct timespec *ts);
e2c18e49
AG
161extern void getnstime_raw_and_real(struct timespec *ts_raw,
162 struct timespec *ts_real);
7c3f1a57
TJ
163extern void getboottime(struct timespec *ts);
164extern void monotonic_to_bootbased(struct timespec *ts);
abb3a4ea 165extern void get_monotonic_boottime(struct timespec *ts);
1da177e4
LT
166
167extern struct timespec timespec_trunc(struct timespec t, unsigned gran);
cf4fc6cb 168extern int timekeeping_valid_for_hres(void);
98962465 169extern u64 timekeeping_max_deferment(void);
c528f7c6 170extern int timekeeping_inject_offset(struct timespec *ts);
1da177e4 171
f06febc9
FM
172struct tms;
173extern void do_sys_times(struct tms *);
174
57f1f087
Z
175/*
176 * Similar to the struct tm in userspace <time.h>, but it needs to be here so
177 * that the kernel source is self contained.
178 */
179struct tm {
180 /*
181 * the number of seconds after the minute, normally in the range
182 * 0 to 59, but can be up to 60 to allow for leap seconds
183 */
184 int tm_sec;
185 /* the number of minutes after the hour, in the range 0 to 59*/
186 int tm_min;
187 /* the number of hours past midnight, in the range 0 to 23 */
188 int tm_hour;
189 /* the day of the month, in the range 1 to 31 */
190 int tm_mday;
191 /* the number of months since January, in the range 0 to 11 */
192 int tm_mon;
193 /* the number of years since 1900 */
194 long tm_year;
195 /* the number of days since Sunday, in the range 0 to 6 */
196 int tm_wday;
197 /* the number of days since January 1, in the range 0 to 365 */
198 int tm_yday;
199};
200
201void time_to_tm(time_t totalsecs, int offset, struct tm *result);
202
f8f46da3
TG
203/**
204 * timespec_to_ns - Convert timespec to nanoseconds
205 * @ts: pointer to the timespec variable to be converted
206 *
207 * Returns the scalar nanosecond representation of the timespec
208 * parameter.
209 */
df869b63 210static inline s64 timespec_to_ns(const struct timespec *ts)
f8f46da3 211{
df869b63 212 return ((s64) ts->tv_sec * NSEC_PER_SEC) + ts->tv_nsec;
f8f46da3
TG
213}
214
215/**
216 * timeval_to_ns - Convert timeval to nanoseconds
217 * @ts: pointer to the timeval variable to be converted
218 *
219 * Returns the scalar nanosecond representation of the timeval
220 * parameter.
221 */
df869b63 222static inline s64 timeval_to_ns(const struct timeval *tv)
f8f46da3 223{
df869b63 224 return ((s64) tv->tv_sec * NSEC_PER_SEC) +
f8f46da3
TG
225 tv->tv_usec * NSEC_PER_USEC;
226}
227
228/**
229 * ns_to_timespec - Convert nanoseconds to timespec
230 * @nsec: the nanoseconds value to be converted
231 *
232 * Returns the timespec representation of the nsec parameter.
233 */
df869b63 234extern struct timespec ns_to_timespec(const s64 nsec);
f8f46da3
TG
235
236/**
237 * ns_to_timeval - Convert nanoseconds to timeval
238 * @nsec: the nanoseconds value to be converted
239 *
240 * Returns the timeval representation of the nsec parameter.
241 */
df869b63 242extern struct timeval ns_to_timeval(const s64 nsec);
f8f46da3 243
cf3c769b
JS
244/**
245 * timespec_add_ns - Adds nanoseconds to a timespec
246 * @a: pointer to timespec to be incremented
247 * @ns: unsigned nanoseconds value to be added
9412e286
JF
248 *
249 * This must always be inlined because its used from the x86-64 vdso,
250 * which cannot call other kernel functions.
cf3c769b 251 */
9412e286 252static __always_inline void timespec_add_ns(struct timespec *a, u64 ns)
cf3c769b 253{
9412e286 254 a->tv_sec += __iter_div_u64_rem(a->tv_nsec + ns, NSEC_PER_SEC, &ns);
cf3c769b
JS
255 a->tv_nsec = ns;
256}
8b3d1cda 257
1da177e4
LT
258#endif /* __KERNEL__ */
259
1da177e4
LT
260/*
261 * Names of the interval timers, and structure
57a55875 262 * defining a timer setting:
1da177e4 263 */
57a55875
IM
264#define ITIMER_REAL 0
265#define ITIMER_VIRTUAL 1
266#define ITIMER_PROF 2
1da177e4 267
57a55875
IM
268struct itimerspec {
269 struct timespec it_interval; /* timer period */
270 struct timespec it_value; /* timer expiration */
1da177e4
LT
271};
272
57a55875
IM
273struct itimerval {
274 struct timeval it_interval; /* timer interval */
275 struct timeval it_value; /* current value */
1da177e4
LT
276};
277
1da177e4 278/*
57a55875 279 * The IDs of the various system clocks (for POSIX.1b interval timers):
1da177e4 280 */
1ad106ca
IM
281#define CLOCK_REALTIME 0
282#define CLOCK_MONOTONIC 1
283#define CLOCK_PROCESS_CPUTIME_ID 2
284#define CLOCK_THREAD_CPUTIME_ID 3
2d42244a 285#define CLOCK_MONOTONIC_RAW 4
da15cfda
JS
286#define CLOCK_REALTIME_COARSE 5
287#define CLOCK_MONOTONIC_COARSE 6
70a08cca 288#define CLOCK_BOOTTIME 7
9a7adcf5
JS
289#define CLOCK_REALTIME_ALARM 8
290#define CLOCK_BOOTTIME_ALARM 9
1da177e4
LT
291
292/*
57a55875 293 * The IDs of various hardware clocks:
1da177e4 294 */
1ad106ca
IM
295#define CLOCK_SGI_CYCLE 10
296#define MAX_CLOCKS 16
297#define CLOCKS_MASK (CLOCK_REALTIME | CLOCK_MONOTONIC)
298#define CLOCKS_MONO CLOCK_MONOTONIC
1da177e4
LT
299
300/*
57a55875 301 * The various flags for setting POSIX.1b interval timers:
1da177e4 302 */
1ad106ca 303#define TIMER_ABSTIME 0x01
1da177e4
LT
304
305#endif