Blame view

include/linux/time.h 8.76 KB
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1
2
3
4
5
6
  #ifndef _LINUX_TIME_H
  #define _LINUX_TIME_H
  
  #include <linux/types.h>
  
  #ifdef __KERNEL__
82644459c   Thomas Gleixner   NTP: move the cmo...
7
  # include <linux/cache.h>
57a558757   Ingo Molnar   [PATCH] hrtimer: ...
8
  # include <linux/seqlock.h>
f595ec964   Jeremy Fitzhardinge   common implementa...
9
  # include <linux/math64.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
10
11
12
13
14
  #endif
  
  #ifndef _STRUCT_TIMESPEC
  #define _STRUCT_TIMESPEC
  struct timespec {
85efde6f4   Arnd Bergmann   make exported hea...
15
16
  	__kernel_time_t	tv_sec;			/* seconds */
  	long		tv_nsec;		/* nanoseconds */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
17
  };
57a558757   Ingo Molnar   [PATCH] hrtimer: ...
18
  #endif
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
19
20
  
  struct timeval {
85efde6f4   Arnd Bergmann   make exported hea...
21
22
  	__kernel_time_t		tv_sec;		/* seconds */
  	__kernel_suseconds_t	tv_usec;	/* microseconds */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
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   Christoph Hellwig   compat: generic c...
31
  extern struct timezone sys_tz;
57a558757   Ingo Molnar   [PATCH] hrtimer: ...
32
  /* Parameters used to convert the timespec values: */
05ebb7610   Vojtech Pavlik   [PATCH] x86_64: A...
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   Chris Wilson   x86/hpet: Use the...
39
  #define FSEC_PER_SEC	1000000000000000LL
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
40

df0cc0539   Thomas Gleixner   select: add a tim...
41
  #define TIME_T_MAX	(time_t)((1UL << ((sizeof(time_t) << 3) - 1)) - 1)
5b78cc9ac   Jan Engelhardt   make timespec_equ...
42
43
  static inline int timespec_equal(const struct timespec *a,
                                   const struct timespec *b)
57a558757   Ingo Molnar   [PATCH] hrtimer: ...
44
  {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
45
  	return (a->tv_sec == b->tv_sec) && (a->tv_nsec == b->tv_nsec);
57a558757   Ingo Molnar   [PATCH] hrtimer: ...
46
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
47

643a65454   Andrew Morton   [PATCH] select: f...
48
49
50
51
52
  /*
   * lhs < rhs:  return <0
   * lhs == rhs: return 0
   * lhs > rhs:  return >0
   */
77adbfbf4   Rolf Eike Beer   [PATCH] Add const...
53
  static inline int timespec_compare(const struct timespec *lhs, const struct timespec *rhs)
643a65454   Andrew Morton   [PATCH] select: f...
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   Rolf Eike Beer   [PATCH] Add const...
61
  static inline int timeval_compare(const struct timeval *lhs, const struct timeval *rhs)
643a65454   Andrew Morton   [PATCH] select: f...
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   Ingo Molnar   [PATCH] hrtimer: ...
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   Thomas Gleixner   time: Prevent 32 ...
72
  extern void set_normalized_timespec(struct timespec *ts, time_t sec, s64 nsec);
ce3bf7ab2   John Stultz   time: Implement t...
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   Thomas Gleixner   select: add a tim...
79
80
  extern struct timespec timespec_add_safe(const struct timespec lhs,
  					 const struct timespec rhs);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
81

ce3bf7ab2   John Stultz   time: Implement t...
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   Thomas Gleixner   [PATCH] hrtimer: ...
91
  /*
ca74e92b4   Shailabh Nagar   [PATCH] per-task-...
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   Thomas Gleixner   [PATCH] hrtimer: ...
104
105
106
   * Returns true if the timespec is norm, false if denorm:
   */
  #define timespec_valid(ts) \
bd3f8f2b1   Chris Wright   [PATCH] Make sure...
107
  	(((ts)->tv_sec >= 0) && (((unsigned long) (ts)->tv_nsec) < NSEC_PER_SEC))
5f82b2b77   Thomas Gleixner   [PATCH] hrtimer: ...
108

ba2a631b1   Adrian Bunk   kernel/time/timek...
109
  extern seqlock_t xtime_lock;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
110

d4f587c67   Martin Schwidefsky   timekeeping: Incr...
111
  extern void read_persistent_clock(struct timespec *ts);
23970e389   Martin Schwidefsky   timekeeping: Intr...
112
  extern void read_boot_clock(struct timespec *ts);
82644459c   Thomas Gleixner   NTP: move the cmo...
113
114
  extern int update_persistent_clock(struct timespec now);
  extern int no_sync_cmos_clock __read_mostly;
ad596171e   John Stultz   [PATCH] Time: Use...
115
  void timekeeping_init(void);
1c5745aa3   Thomas Gleixner   sched_clock: prev...
116
  extern int timekeeping_suspended;
ad596171e   John Stultz   [PATCH] Time: Use...
117

17c38b749   John Stultz   Cache xtime every...
118
  unsigned long get_seconds(void);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
119
  struct timespec current_kernel_time(void);
8ab4351a4   John Stultz   hrtimer: Cleanup ...
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   John Stultz   time: Introduce C...
122
  struct timespec get_monotonic_coarse(void);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
123

57a558757   Ingo Molnar   [PATCH] hrtimer: ...
124
  #define CURRENT_TIME		(current_kernel_time())
2c6b47de1   John Stultz   Cleanup non-arch ...
125
  #define CURRENT_TIME_SEC	((struct timespec) { get_seconds(), 0 })
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
126

7d27558c4   John Stultz   timekeeping: crea...
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   Linus Torvalds   Linux-2.6.12-rc2
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   Thomas Gleixner   [PATCH] hrtimer: ...
144
  #define do_posix_clock_monotonic_gettime(ts) ktime_get_ts(ts)
c78873252   David Howells   Mark arguments to...
145
  extern long do_utimes(int dfd, const char __user *filename, struct timespec *times, int flags);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
146
  struct itimerval;
57a558757   Ingo Molnar   [PATCH] hrtimer: ...
147
148
  extern int do_setitimer(int which, struct itimerval *value,
  			struct itimerval *ovalue);
c08b8a491   Thomas Gleixner   [PATCH] sys_alarm...
149
  extern unsigned int alarm_setitimer(unsigned int seconds);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
150
  extern int do_getitimer(int which, struct itimerval *value);
57a558757   Ingo Molnar   [PATCH] hrtimer: ...
151
  extern void getnstimeofday(struct timespec *tv);
2d42244ae   John Stultz   clocksource: intr...
152
  extern void getrawmonotonic(struct timespec *ts);
7c3f1a573   Tomas Janousek   Introduce boot ba...
153
154
  extern void getboottime(struct timespec *ts);
  extern void monotonic_to_bootbased(struct timespec *ts);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
155
156
  
  extern struct timespec timespec_trunc(struct timespec t, unsigned gran);
cf4fc6cb7   Li Zefan   timekeeping: rena...
157
  extern int timekeeping_valid_for_hres(void);
98962465e   Jon Hunter   nohz: Prevent clo...
158
  extern u64 timekeeping_max_deferment(void);
8524070b7   John Stultz   Move timekeeping ...
159
  extern void update_wall_time(void);
31089c13b   John Stultz   timekeeping: Intr...
160
  extern void timekeeping_leap_insert(int leapsecond);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
161

f06febc96   Frank Mayhar   timers: fix itime...
162
163
  struct tms;
  extern void do_sys_times(struct tms *);
57f1f0874   Zhaolei   time: add functio...
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   Thomas Gleixner   [PATCH] hrtimer: ...
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   Roman Zippel   [PATCH] hrtimers:...
198
  static inline s64 timespec_to_ns(const struct timespec *ts)
f8f46da3b   Thomas Gleixner   [PATCH] hrtimer: ...
199
  {
df869b630   Roman Zippel   [PATCH] hrtimers:...
200
  	return ((s64) ts->tv_sec * NSEC_PER_SEC) + ts->tv_nsec;
f8f46da3b   Thomas Gleixner   [PATCH] hrtimer: ...
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   Roman Zippel   [PATCH] hrtimers:...
210
  static inline s64 timeval_to_ns(const struct timeval *tv)
f8f46da3b   Thomas Gleixner   [PATCH] hrtimer: ...
211
  {
df869b630   Roman Zippel   [PATCH] hrtimers:...
212
  	return ((s64) tv->tv_sec * NSEC_PER_SEC) +
f8f46da3b   Thomas Gleixner   [PATCH] hrtimer: ...
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   Roman Zippel   [PATCH] hrtimers:...
222
  extern struct timespec ns_to_timespec(const s64 nsec);
f8f46da3b   Thomas Gleixner   [PATCH] hrtimer: ...
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   Roman Zippel   [PATCH] hrtimers:...
230
  extern struct timeval ns_to_timeval(const s64 nsec);
f8f46da3b   Thomas Gleixner   [PATCH] hrtimer: ...
231

cf3c769b4   John Stultz   [PATCH] Time: Int...
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   Jeremy Fitzhardinge   always_inline tim...
236
237
238
   *
   * 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...
239
   */
9412e2864   Jeremy Fitzhardinge   always_inline tim...
240
  static __always_inline void timespec_add_ns(struct timespec *a, u64 ns)
cf3c769b4   John Stultz   [PATCH] Time: Int...
241
  {
9412e2864   Jeremy Fitzhardinge   always_inline tim...
242
  	a->tv_sec += __iter_div_u64_rem(a->tv_nsec + ns, NSEC_PER_SEC, &ns);
cf3c769b4   John Stultz   [PATCH] Time: Int...
243
244
  	a->tv_nsec = ns;
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
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   Ingo Molnar   [PATCH] hrtimer: ...
257
   * defining a timer setting:
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
258
   */
57a558757   Ingo Molnar   [PATCH] hrtimer: ...
259
260
261
  #define	ITIMER_REAL		0
  #define	ITIMER_VIRTUAL		1
  #define	ITIMER_PROF		2
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
262

57a558757   Ingo Molnar   [PATCH] hrtimer: ...
263
264
265
  struct itimerspec {
  	struct timespec it_interval;	/* timer period */
  	struct timespec it_value;	/* timer expiration */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
266
  };
57a558757   Ingo Molnar   [PATCH] hrtimer: ...
267
268
269
  struct itimerval {
  	struct timeval it_interval;	/* timer interval */
  	struct timeval it_value;	/* current value */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
270
  };
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
271
  /*
57a558757   Ingo Molnar   [PATCH] hrtimer: ...
272
   * The IDs of the various system clocks (for POSIX.1b interval timers):
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
273
   */
1ad106ca1   Ingo Molnar   [PATCH] hrtimer: ...
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   John Stultz   clocksource: intr...
278
  #define CLOCK_MONOTONIC_RAW		4
da15cfdae   John Stultz   time: Introduce C...
279
280
  #define CLOCK_REALTIME_COARSE		5
  #define CLOCK_MONOTONIC_COARSE		6
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
281
282
  
  /*
57a558757   Ingo Molnar   [PATCH] hrtimer: ...
283
   * The IDs of various hardware clocks:
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
284
   */
1ad106ca1   Ingo Molnar   [PATCH] hrtimer: ...
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   Linus Torvalds   Linux-2.6.12-rc2
289
290
  
  /*
57a558757   Ingo Molnar   [PATCH] hrtimer: ...
291
   * The various flags for setting POSIX.1b interval timers:
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
292
   */
1ad106ca1   Ingo Molnar   [PATCH] hrtimer: ...
293
  #define TIMER_ABSTIME			0x01
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
294
295
  
  #endif