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