]> bbs.cooldavid.org Git - net-next-2.6.git/blame - include/linux/time.h
[PATCH] Time: Use clocksource infrastructure for update_wall_time
[net-next-2.6.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__
57a55875 7# include <linux/seqlock.h>
1da177e4
LT
8#endif
9
10#ifndef _STRUCT_TIMESPEC
11#define _STRUCT_TIMESPEC
12struct timespec {
13 time_t tv_sec; /* seconds */
14 long tv_nsec; /* nanoseconds */
15};
57a55875 16#endif
1da177e4
LT
17
18struct timeval {
19 time_t tv_sec; /* seconds */
20 suseconds_t tv_usec; /* microseconds */
21};
22
23struct timezone {
24 int tz_minuteswest; /* minutes west of Greenwich */
25 int tz_dsttime; /* type of dst correction */
26};
27
28#ifdef __KERNEL__
29
57a55875
IM
30/* Parameters used to convert the timespec values: */
31#define MSEC_PER_SEC 1000L
32#define USEC_PER_SEC 1000000L
33#define NSEC_PER_SEC 1000000000L
34#define NSEC_PER_USEC 1000L
1da177e4 35
643a6545 36static inline int timespec_equal(struct timespec *a, struct timespec *b)
57a55875 37{
1da177e4 38 return (a->tv_sec == b->tv_sec) && (a->tv_nsec == b->tv_nsec);
57a55875 39}
1da177e4 40
643a6545
AM
41/*
42 * lhs < rhs: return <0
43 * lhs == rhs: return 0
44 * lhs > rhs: return >0
45 */
46static inline int timespec_compare(struct timespec *lhs, struct timespec *rhs)
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_nsec - rhs->tv_nsec;
53}
54
55static inline int timeval_compare(struct timeval *lhs, struct timeval *rhs)
56{
57 if (lhs->tv_sec < rhs->tv_sec)
58 return -1;
59 if (lhs->tv_sec > rhs->tv_sec)
60 return 1;
61 return lhs->tv_usec - rhs->tv_usec;
62}
63
f4818900
IM
64extern unsigned long mktime(const unsigned int year, const unsigned int mon,
65 const unsigned int day, const unsigned int hour,
66 const unsigned int min, const unsigned int sec);
67
68extern void set_normalized_timespec(struct timespec *ts, time_t sec, long nsec);
1da177e4 69
5f82b2b7
TG
70/*
71 * Returns true if the timespec is norm, false if denorm:
72 */
73#define timespec_valid(ts) \
bd3f8f2b 74 (((ts)->tv_sec >= 0) && (((unsigned long) (ts)->tv_nsec) < NSEC_PER_SEC))
5f82b2b7 75
1da177e4
LT
76extern struct timespec xtime;
77extern struct timespec wall_to_monotonic;
78extern seqlock_t xtime_lock;
79
ad596171
JS
80void timekeeping_init(void);
81
1da177e4 82static inline unsigned long get_seconds(void)
57a55875 83{
1da177e4
LT
84 return xtime.tv_sec;
85}
86
87struct timespec current_kernel_time(void);
88
57a55875
IM
89#define CURRENT_TIME (current_kernel_time())
90#define CURRENT_TIME_SEC ((struct timespec) { xtime.tv_sec, 0 })
1da177e4
LT
91
92extern void do_gettimeofday(struct timeval *tv);
93extern int do_settimeofday(struct timespec *tv);
94extern int do_sys_settimeofday(struct timespec *tv, struct timezone *tz);
becf8b5d 95#define do_posix_clock_monotonic_gettime(ts) ktime_get_ts(ts)
5590ff0d 96extern long do_utimes(int dfd, char __user *filename, struct timeval *times);
1da177e4 97struct itimerval;
57a55875
IM
98extern int do_setitimer(int which, struct itimerval *value,
99 struct itimerval *ovalue);
c08b8a49 100extern unsigned int alarm_setitimer(unsigned int seconds);
1da177e4 101extern int do_getitimer(int which, struct itimerval *value);
57a55875 102extern void getnstimeofday(struct timespec *tv);
1da177e4
LT
103
104extern struct timespec timespec_trunc(struct timespec t, unsigned gran);
105
f8f46da3
TG
106/**
107 * timespec_to_ns - Convert timespec to nanoseconds
108 * @ts: pointer to the timespec variable to be converted
109 *
110 * Returns the scalar nanosecond representation of the timespec
111 * parameter.
112 */
df869b63 113static inline s64 timespec_to_ns(const struct timespec *ts)
f8f46da3 114{
df869b63 115 return ((s64) ts->tv_sec * NSEC_PER_SEC) + ts->tv_nsec;
f8f46da3
TG
116}
117
118/**
119 * timeval_to_ns - Convert timeval to nanoseconds
120 * @ts: pointer to the timeval variable to be converted
121 *
122 * Returns the scalar nanosecond representation of the timeval
123 * parameter.
124 */
df869b63 125static inline s64 timeval_to_ns(const struct timeval *tv)
f8f46da3 126{
df869b63 127 return ((s64) tv->tv_sec * NSEC_PER_SEC) +
f8f46da3
TG
128 tv->tv_usec * NSEC_PER_USEC;
129}
130
131/**
132 * ns_to_timespec - Convert nanoseconds to timespec
133 * @nsec: the nanoseconds value to be converted
134 *
135 * Returns the timespec representation of the nsec parameter.
136 */
df869b63 137extern struct timespec ns_to_timespec(const s64 nsec);
f8f46da3
TG
138
139/**
140 * ns_to_timeval - Convert nanoseconds to timeval
141 * @nsec: the nanoseconds value to be converted
142 *
143 * Returns the timeval representation of the nsec parameter.
144 */
df869b63 145extern struct timeval ns_to_timeval(const s64 nsec);
f8f46da3 146
1da177e4
LT
147#endif /* __KERNEL__ */
148
149#define NFDBITS __NFDBITS
150
151#define FD_SETSIZE __FD_SETSIZE
152#define FD_SET(fd,fdsetp) __FD_SET(fd,fdsetp)
153#define FD_CLR(fd,fdsetp) __FD_CLR(fd,fdsetp)
154#define FD_ISSET(fd,fdsetp) __FD_ISSET(fd,fdsetp)
155#define FD_ZERO(fdsetp) __FD_ZERO(fdsetp)
156
157/*
158 * Names of the interval timers, and structure
57a55875 159 * defining a timer setting:
1da177e4 160 */
57a55875
IM
161#define ITIMER_REAL 0
162#define ITIMER_VIRTUAL 1
163#define ITIMER_PROF 2
1da177e4 164
57a55875
IM
165struct itimerspec {
166 struct timespec it_interval; /* timer period */
167 struct timespec it_value; /* timer expiration */
1da177e4
LT
168};
169
57a55875
IM
170struct itimerval {
171 struct timeval it_interval; /* timer interval */
172 struct timeval it_value; /* current value */
1da177e4
LT
173};
174
1da177e4 175/*
57a55875 176 * The IDs of the various system clocks (for POSIX.1b interval timers):
1da177e4 177 */
1ad106ca
IM
178#define CLOCK_REALTIME 0
179#define CLOCK_MONOTONIC 1
180#define CLOCK_PROCESS_CPUTIME_ID 2
181#define CLOCK_THREAD_CPUTIME_ID 3
1da177e4
LT
182
183/*
57a55875 184 * The IDs of various hardware clocks:
1da177e4 185 */
1ad106ca
IM
186#define CLOCK_SGI_CYCLE 10
187#define MAX_CLOCKS 16
188#define CLOCKS_MASK (CLOCK_REALTIME | CLOCK_MONOTONIC)
189#define CLOCKS_MONO CLOCK_MONOTONIC
1da177e4
LT
190
191/*
57a55875 192 * The various flags for setting POSIX.1b interval timers:
1da177e4 193 */
1ad106ca 194#define TIMER_ABSTIME 0x01
1da177e4
LT
195
196#endif