Blame view

include/linux/time.h 7.77 KB
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1
2
  #ifndef _LINUX_TIME_H
  #define _LINUX_TIME_H
82644459c   Thomas Gleixner   NTP: move the cmo...
3
  # include <linux/cache.h>
57a558757   Ingo Molnar   [PATCH] hrtimer: ...
4
  # include <linux/seqlock.h>
f595ec964   Jeremy Fitzhardinge   common implementa...
5
  # include <linux/math64.h>
361a3bf00   John Stultz   time64: Add time6...
6
  # include <linux/time64.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
7

b418da16d   Christoph Hellwig   compat: generic c...
8
  extern struct timezone sys_tz;
df0cc0539   Thomas Gleixner   select: add a tim...
9
  #define TIME_T_MAX	(time_t)((1UL << ((sizeof(time_t) << 3) - 1)) - 1)
5b78cc9ac   Jan Engelhardt   make timespec_equ...
10
11
  static inline int timespec_equal(const struct timespec *a,
                                   const struct timespec *b)
57a558757   Ingo Molnar   [PATCH] hrtimer: ...
12
  {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
13
  	return (a->tv_sec == b->tv_sec) && (a->tv_nsec == b->tv_nsec);
57a558757   Ingo Molnar   [PATCH] hrtimer: ...
14
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
15

643a65454   Andrew Morton   [PATCH] select: f...
16
17
18
19
20
  /*
   * lhs < rhs:  return <0
   * lhs == rhs: return 0
   * lhs > rhs:  return >0
   */
77adbfbf4   Rolf Eike Beer   [PATCH] Add const...
21
  static inline int timespec_compare(const struct timespec *lhs, const struct timespec *rhs)
643a65454   Andrew Morton   [PATCH] select: f...
22
23
24
25
26
27
28
  {
  	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   Rolf Eike Beer   [PATCH] Add const...
29
  static inline int timeval_compare(const struct timeval *lhs, const struct timeval *rhs)
643a65454   Andrew Morton   [PATCH] select: f...
30
31
32
33
34
35
36
  {
  	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;
  }
90b6ce9c4   pang.xunlei   time: Provide y20...
37
38
39
40
41
42
43
44
45
46
47
48
49
50
  extern time64_t mktime64(const unsigned int year, const unsigned int mon,
  			const unsigned int day, const unsigned int hour,
  			const unsigned int min, const unsigned int sec);
  
  /**
   * Deprecated. Use mktime64().
   */
  static inline 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)
  {
  	return mktime64(year, mon, day, hour, min, sec);
  }
f4818900f   Ingo Molnar   [PATCH] hrtimer: ...
51

12e09337f   Thomas Gleixner   time: Prevent 32 ...
52
  extern void set_normalized_timespec(struct timespec *ts, time_t sec, s64 nsec);
ce3bf7ab2   John Stultz   time: Implement t...
53
54
55
56
57
58
  
  /*
   * 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   Thomas Gleixner   select: add a tim...
59
60
  extern struct timespec timespec_add_safe(const struct timespec lhs,
  					 const struct timespec rhs);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
61

ce3bf7ab2   John Stultz   time: Implement t...
62
63
64
65
66
67
68
69
70
  
  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   Thomas Gleixner   [PATCH] hrtimer: ...
71
  /*
ca74e92b4   Shailabh Nagar   [PATCH] per-task-...
72
73
74
75
76
77
78
79
80
81
82
83
   * 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   Thomas Gleixner   [PATCH] hrtimer: ...
84
85
   * Returns true if the timespec is norm, false if denorm:
   */
4e8b14526   John Stultz   time: Improve san...
86
87
88
89
90
91
92
93
  static inline bool timespec_valid(const struct timespec *ts)
  {
  	/* Dates before 1970 are bogus */
  	if (ts->tv_sec < 0)
  		return false;
  	/* Can't have more nanoseconds then a second */
  	if ((unsigned long)ts->tv_nsec >= NSEC_PER_SEC)
  		return false;
cee58483c   John Stultz   time: Move ktime_...
94
95
96
97
98
99
100
  	return true;
  }
  
  static inline bool timespec_valid_strict(const struct timespec *ts)
  {
  	if (!timespec_valid(ts))
  		return false;
4e8b14526   John Stultz   time: Improve san...
101
102
103
104
105
  	/* Disallow values that could overflow ktime_t */
  	if ((unsigned long long)ts->tv_sec >= KTIME_SEC_MAX)
  		return false;
  	return true;
  }
5f82b2b77   Thomas Gleixner   [PATCH] hrtimer: ...
106

6ada1fc0e   Sasha Levin   time: settimeofda...
107
108
109
110
111
112
113
114
115
116
117
118
  static inline bool timeval_valid(const struct timeval *tv)
  {
  	/* Dates before 1970 are bogus */
  	if (tv->tv_sec < 0)
  		return false;
  
  	/* Can't have more microseconds then a second */
  	if (tv->tv_usec < 0 || tv->tv_usec >= USEC_PER_SEC)
  		return false;
  
  	return true;
  }
8b094cd03   Thomas Gleixner   time: Consolidate...
119
  extern struct timespec timespec_trunc(struct timespec t, unsigned gran);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
120

37cf4dc33   John Stultz   time: Verify time...
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
  /*
   * Validates if a timespec/timeval used to inject a time offset is valid.
   * Offsets can be postive or negative. The value of the timeval/timespec
   * is the sum of its fields, but *NOTE*: the field tv_usec/tv_nsec must
   * always be non-negative.
   */
  static inline bool timeval_inject_offset_valid(const struct timeval *tv)
  {
  	/* We don't check the tv_sec as it can be positive or negative */
  
  	/* Can't have more microseconds then a second */
  	if (tv->tv_usec < 0 || tv->tv_usec >= USEC_PER_SEC)
  		return false;
  	return true;
  }
  
  static inline bool timespec_inject_offset_valid(const struct timespec *ts)
  {
  	/* We don't check the tv_sec as it can be positive or negative */
  
  	/* Can't have more nanoseconds then a second */
  	if (ts->tv_nsec < 0 || ts->tv_nsec >= NSEC_PER_SEC)
  		return false;
  	return true;
  }
57a558757   Ingo Molnar   [PATCH] hrtimer: ...
146
  #define CURRENT_TIME		(current_kernel_time())
2c6b47de1   John Stultz   Cleanup non-arch ...
147
  #define CURRENT_TIME_SEC	((struct timespec) { get_seconds(), 0 })
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
148

7d27558c4   John Stultz   timekeeping: crea...
149
150
151
152
153
154
155
156
157
158
  /* 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
7b1f62076   Stephen Warren   time: convert arc...
159
  extern u32 (*arch_gettimeoffset)(void);
7d27558c4   John Stultz   timekeeping: crea...
160
  #endif
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
161
  struct itimerval;
57a558757   Ingo Molnar   [PATCH] hrtimer: ...
162
163
  extern int do_setitimer(int which, struct itimerval *value,
  			struct itimerval *ovalue);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
164
  extern int do_getitimer(int which, struct itimerval *value);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
165

8b094cd03   Thomas Gleixner   time: Consolidate...
166
167
168
  extern unsigned int alarm_setitimer(unsigned int seconds);
  
  extern long do_utimes(int dfd, const char __user *filename, struct timespec *times, int flags);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
169

f06febc96   Frank Mayhar   timers: fix itime...
170
171
  struct tms;
  extern void do_sys_times(struct tms *);
57f1f0874   Zhaolei   time: add functio...
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
  /*
   * 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;
  };
e6c2682a1   Deepa Dinamani   time: Add time64_...
197
198
199
200
201
202
203
204
205
206
207
208
209
210
  void time64_to_tm(time64_t totalsecs, int offset, struct tm *result);
  
  /**
   * time_to_tm - converts the calendar time to local broken-down time
   *
   * @totalsecs	the number of seconds elapsed since 00:00:00 on January 1, 1970,
   *		Coordinated Universal Time (UTC).
   * @offset	offset seconds adding to totalsecs.
   * @result	pointer to struct tm variable to receive broken-down time
   */
  static inline void time_to_tm(time_t totalsecs, int offset, struct tm *result)
  {
  	time64_to_tm(totalsecs, offset, result);
  }
57f1f0874   Zhaolei   time: add functio...
211

f8f46da3b   Thomas Gleixner   [PATCH] hrtimer: ...
212
213
214
215
216
217
218
  /**
   * 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   Roman Zippel   [PATCH] hrtimers:...
219
  static inline s64 timespec_to_ns(const struct timespec *ts)
f8f46da3b   Thomas Gleixner   [PATCH] hrtimer: ...
220
  {
df869b630   Roman Zippel   [PATCH] hrtimers:...
221
  	return ((s64) ts->tv_sec * NSEC_PER_SEC) + ts->tv_nsec;
f8f46da3b   Thomas Gleixner   [PATCH] hrtimer: ...
222
223
224
225
226
227
228
229
230
  }
  
  /**
   * 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   Roman Zippel   [PATCH] hrtimers:...
231
  static inline s64 timeval_to_ns(const struct timeval *tv)
f8f46da3b   Thomas Gleixner   [PATCH] hrtimer: ...
232
  {
df869b630   Roman Zippel   [PATCH] hrtimers:...
233
  	return ((s64) tv->tv_sec * NSEC_PER_SEC) +
f8f46da3b   Thomas Gleixner   [PATCH] hrtimer: ...
234
235
236
237
238
239
240
241
242
  		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   Roman Zippel   [PATCH] hrtimers:...
243
  extern struct timespec ns_to_timespec(const s64 nsec);
f8f46da3b   Thomas Gleixner   [PATCH] hrtimer: ...
244
245
246
247
248
249
250
  
  /**
   * ns_to_timeval - Convert nanoseconds to timeval
   * @nsec:	the nanoseconds value to be converted
   *
   * Returns the timeval representation of the nsec parameter.
   */
df869b630   Roman Zippel   [PATCH] hrtimers:...
251
  extern struct timeval ns_to_timeval(const s64 nsec);
f8f46da3b   Thomas Gleixner   [PATCH] hrtimer: ...
252

cf3c769b4   John Stultz   [PATCH] Time: Int...
253
254
255
256
  /**
   * timespec_add_ns - Adds nanoseconds to a timespec
   * @a:		pointer to timespec to be incremented
   * @ns:		unsigned nanoseconds value to be added
9412e2864   Jeremy Fitzhardinge   always_inline tim...
257
258
259
   *
   * This must always be inlined because its used from the x86-64 vdso,
   * which cannot call other kernel functions.
cf3c769b4   John Stultz   [PATCH] Time: Int...
260
   */
9412e2864   Jeremy Fitzhardinge   always_inline tim...
261
  static __always_inline void timespec_add_ns(struct timespec *a, u64 ns)
cf3c769b4   John Stultz   [PATCH] Time: Int...
262
  {
9412e2864   Jeremy Fitzhardinge   always_inline tim...
263
  	a->tv_sec += __iter_div_u64_rem(a->tv_nsec + ns, NSEC_PER_SEC, &ns);
cf3c769b4   John Stultz   [PATCH] Time: Int...
264
265
  	a->tv_nsec = ns;
  }
8b3d1cda4   H. Peter Anvin   posix_types: Remo...
266

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
267
  #endif