Blame view
include/linux/ktime.h
6.68 KB
97fc79f97 [PATCH] hrtimer: ... |
1 2 3 4 5 6 7 8 9 10 11 12 |
/* * include/linux/ktime.h * * ktime_t - nanosecond-resolution time format. * * Copyright(C) 2005, Thomas Gleixner <tglx@linutronix.de> * Copyright(C) 2005, Red Hat, Inc., Ingo Molnar * * data type definitions, declarations, prototypes and macros. * * Started by: Thomas Gleixner and Ingo Molnar * |
66188fae3 [PATCH] hrtimers:... |
13 14 15 16 17 18 |
* Credits: * * Roman Zippel provided the ideas and primary code snippets of * the ktime_t union and further simplifications of the original * code. * |
97fc79f97 [PATCH] hrtimer: ... |
19 20 21 22 23 24 25 |
* For licencing details see kernel-base/COPYING */ #ifndef _LINUX_KTIME_H #define _LINUX_KTIME_H #include <linux/time.h> #include <linux/jiffies.h> |
2456e8553 ktime: Get rid of... |
26 27 |
/* Nanosecond scalar representation for kernel time values */ typedef s64 ktime_t; |
97fc79f97 [PATCH] hrtimer: ... |
28 |
|
97fc79f97 [PATCH] hrtimer: ... |
29 30 |
/** * ktime_set - Set a ktime_t variable from a seconds/nanoseconds value |
97fc79f97 [PATCH] hrtimer: ... |
31 32 33 |
* @secs: seconds to set * @nsecs: nanoseconds to set * |
36019265c ktime: fix some s... |
34 |
* Return: The ktime_t representation of the value. |
97fc79f97 [PATCH] hrtimer: ... |
35 |
*/ |
b17b20d70 ktime: Change kti... |
36 |
static inline ktime_t ktime_set(const s64 secs, const unsigned long nsecs) |
97fc79f97 [PATCH] hrtimer: ... |
37 |
{ |
96dd7421a [PATCH] prevent t... |
38 |
if (unlikely(secs >= KTIME_SEC_MAX)) |
2456e8553 ktime: Get rid of... |
39 |
return KTIME_MAX; |
b17b20d70 ktime: Change kti... |
40 |
|
2456e8553 ktime: Get rid of... |
41 |
return secs * NSEC_PER_SEC + (s64)nsecs; |
97fc79f97 [PATCH] hrtimer: ... |
42 43 44 |
} /* Subtract two ktime_t variables. rem = lhs -rhs: */ |
2456e8553 ktime: Get rid of... |
45 |
#define ktime_sub(lhs, rhs) ((lhs) - (rhs)) |
97fc79f97 [PATCH] hrtimer: ... |
46 47 |
/* Add two ktime_t variables. res = lhs + rhs: */ |
2456e8553 ktime: Get rid of... |
48 |
#define ktime_add(lhs, rhs) ((lhs) + (rhs)) |
97fc79f97 [PATCH] hrtimer: ... |
49 50 |
/* |
979515c56 time: Avoid undef... |
51 52 53 |
* Same as ktime_add(), but avoids undefined behaviour on overflow; however, * this means that you must check the result for overflow yourself. */ |
2456e8553 ktime: Get rid of... |
54 |
#define ktime_add_unsafe(lhs, rhs) ((u64) (lhs) + (rhs)) |
979515c56 time: Avoid undef... |
55 56 |
/* |
97fc79f97 [PATCH] hrtimer: ... |
57 58 59 |
* Add a ktime_t variable and a scalar nanosecond value. * res = kt + nsval: */ |
2456e8553 ktime: Get rid of... |
60 |
#define ktime_add_ns(kt, nsval) ((kt) + (nsval)) |
97fc79f97 [PATCH] hrtimer: ... |
61 |
|
a272378d1 [KTIME]: Introduc... |
62 63 64 65 |
/* * Subtract a scalar nanosecod from a ktime_t variable * res = kt - nsval: */ |
2456e8553 ktime: Get rid of... |
66 |
#define ktime_sub_ns(kt, nsval) ((kt) - (nsval)) |
a272378d1 [KTIME]: Introduc... |
67 |
|
97fc79f97 [PATCH] hrtimer: ... |
68 |
/* convert a timespec to ktime_t format: */ |
b2ee9dbfa [PATCH] hrtimer: ... |
69 70 71 72 |
static inline ktime_t timespec_to_ktime(struct timespec ts) { return ktime_set(ts.tv_sec, ts.tv_nsec); } |
97fc79f97 [PATCH] hrtimer: ... |
73 |
|
49cd6f869 time: More core i... |
74 75 76 77 78 |
/* convert a timespec64 to ktime_t format: */ static inline ktime_t timespec64_to_ktime(struct timespec64 ts) { return ktime_set(ts.tv_sec, ts.tv_nsec); } |
97fc79f97 [PATCH] hrtimer: ... |
79 |
/* convert a timeval to ktime_t format: */ |
b2ee9dbfa [PATCH] hrtimer: ... |
80 81 82 83 |
static inline ktime_t timeval_to_ktime(struct timeval tv) { return ktime_set(tv.tv_sec, tv.tv_usec * NSEC_PER_USEC); } |
97fc79f97 [PATCH] hrtimer: ... |
84 85 |
/* Map the ktime_t to timespec conversion to ns_to_timespec function */ |
2456e8553 ktime: Get rid of... |
86 |
#define ktime_to_timespec(kt) ns_to_timespec((kt)) |
97fc79f97 [PATCH] hrtimer: ... |
87 |
|
49cd6f869 time: More core i... |
88 |
/* Map the ktime_t to timespec conversion to ns_to_timespec function */ |
2456e8553 ktime: Get rid of... |
89 |
#define ktime_to_timespec64(kt) ns_to_timespec64((kt)) |
49cd6f869 time: More core i... |
90 |
|
97fc79f97 [PATCH] hrtimer: ... |
91 |
/* Map the ktime_t to timeval conversion to ns_to_timeval function */ |
2456e8553 ktime: Get rid of... |
92 |
#define ktime_to_timeval(kt) ns_to_timeval((kt)) |
97fc79f97 [PATCH] hrtimer: ... |
93 |
|
97fc79f97 [PATCH] hrtimer: ... |
94 |
/* Convert ktime_t to nanoseconds - NOP in the scalar storage format: */ |
2456e8553 ktime: Get rid of... |
95 |
#define ktime_to_ns(kt) (kt) |
97fc79f97 [PATCH] hrtimer: ... |
96 |
|
398f382c0 pktgen: clean up ... |
97 98 99 100 101 |
/** * ktime_compare - Compares two ktime_t variables for less, greater or equal * @cmp1: comparable1 * @cmp2: comparable2 * |
36019265c ktime: fix some s... |
102 |
* Return: ... |
398f382c0 pktgen: clean up ... |
103 104 105 106 107 108 |
* cmp1 < cmp2: return <0 * cmp1 == cmp2: return 0 * cmp1 > cmp2: return >0 */ static inline int ktime_compare(const ktime_t cmp1, const ktime_t cmp2) { |
2456e8553 ktime: Get rid of... |
109 |
if (cmp1 < cmp2) |
398f382c0 pktgen: clean up ... |
110 |
return -1; |
2456e8553 ktime: Get rid of... |
111 |
if (cmp1 > cmp2) |
398f382c0 pktgen: clean up ... |
112 113 114 |
return 1; return 0; } |
67cb9366f ktime: add ktime_... |
115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 |
/** * ktime_after - Compare if a ktime_t value is bigger than another one. * @cmp1: comparable1 * @cmp2: comparable2 * * Return: true if cmp1 happened after cmp2. */ static inline bool ktime_after(const ktime_t cmp1, const ktime_t cmp2) { return ktime_compare(cmp1, cmp2) > 0; } /** * ktime_before - Compare if a ktime_t value is smaller than another one. * @cmp1: comparable1 * @cmp2: comparable2 * * Return: true if cmp1 happened before cmp2. */ static inline bool ktime_before(const ktime_t cmp1, const ktime_t cmp2) { return ktime_compare(cmp1, cmp2) < 0; } |
166afb645 ktime: Sanitize k... |
138 |
#if BITS_PER_LONG < 64 |
f7bcb70eb ktime: Fix ktime_... |
139 140 |
extern s64 __ktime_divns(const ktime_t kt, s64 div); static inline s64 ktime_divns(const ktime_t kt, s64 div) |
8b618628b ktime: Optimize k... |
141 |
{ |
f7bcb70eb ktime: Fix ktime_... |
142 143 144 145 146 |
/* * Negative divisors could cause an inf loop, * so bug out here. */ BUG_ON(div < 0); |
8b618628b ktime: Optimize k... |
147 |
if (__builtin_constant_p(div) && !(div >> 32)) { |
2456e8553 ktime: Get rid of... |
148 |
s64 ns = kt; |
f7bcb70eb ktime: Fix ktime_... |
149 150 151 152 |
u64 tmp = ns < 0 ? -ns : ns; do_div(tmp, div); return ns < 0 ? -tmp : tmp; |
8b618628b ktime: Optimize k... |
153 154 155 156 |
} else { return __ktime_divns(kt, div); } } |
166afb645 ktime: Sanitize k... |
157 |
#else /* BITS_PER_LONG < 64 */ |
f7bcb70eb ktime: Fix ktime_... |
158 159 160 161 162 163 164 |
static inline s64 ktime_divns(const ktime_t kt, s64 div) { /* * 32-bit implementation cannot handle negative divisors, * so catch them on 64bit as well. */ WARN_ON(div < 0); |
2456e8553 ktime: Get rid of... |
165 |
return kt / div; |
f7bcb70eb ktime: Fix ktime_... |
166 |
} |
166afb645 ktime: Sanitize k... |
167 |
#endif |
84299b3bc [TCP]: Fix linkag... |
168 169 |
static inline s64 ktime_to_us(const ktime_t kt) { |
166afb645 ktime: Sanitize k... |
170 |
return ktime_divns(kt, NSEC_PER_USEC); |
84299b3bc [TCP]: Fix linkag... |
171 |
} |
f56916b97 ktime: introduce ... |
172 173 |
static inline s64 ktime_to_ms(const ktime_t kt) { |
166afb645 ktime: Sanitize k... |
174 |
return ktime_divns(kt, NSEC_PER_MSEC); |
f56916b97 ktime: introduce ... |
175 |
} |
f1c91da44 [KTIME]: Introduc... |
176 177 178 179 |
static inline s64 ktime_us_delta(const ktime_t later, const ktime_t earlier) { return ktime_to_us(ktime_sub(later, earlier)); } |
41fbf3b39 ktime.h: Introduc... |
180 181 182 183 |
static inline s64 ktime_ms_delta(const ktime_t later, const ktime_t earlier) { return ktime_to_ms(ktime_sub(later, earlier)); } |
1e180f726 [KTIME]: Introduc... |
184 185 |
static inline ktime_t ktime_add_us(const ktime_t kt, const u64 usec) { |
a44b8bd60 ktime: Use macro ... |
186 |
return ktime_add_ns(kt, usec * NSEC_PER_USEC); |
1e180f726 [KTIME]: Introduc... |
187 |
} |
d36f82b24 ktime: add ms_to_... |
188 189 190 191 |
static inline ktime_t ktime_add_ms(const ktime_t kt, const u64 msec) { return ktime_add_ns(kt, msec * NSEC_PER_MSEC); } |
a272378d1 [KTIME]: Introduc... |
192 193 |
static inline ktime_t ktime_sub_us(const ktime_t kt, const u64 usec) { |
a44b8bd60 ktime: Use macro ... |
194 |
return ktime_sub_ns(kt, usec * NSEC_PER_USEC); |
a272378d1 [KTIME]: Introduc... |
195 |
} |
77f2efcbd rxrpc: Add ktime_... |
196 197 198 199 |
static inline ktime_t ktime_sub_ms(const ktime_t kt, const u64 msec) { return ktime_sub_ns(kt, msec * NSEC_PER_MSEC); } |
5a7780e72 hrtimer: check re... |
200 |
extern ktime_t ktime_add_safe(const ktime_t lhs, const ktime_t rhs); |
6e94d1ef3 net: socket: move... |
201 202 203 204 205 206 |
/** * ktime_to_timespec_cond - convert a ktime_t variable to timespec * format only if the variable contains data * @kt: the ktime_t variable to convert * @ts: the timespec variable to store the result in * |
36019265c ktime: fix some s... |
207 |
* Return: %true if there was a successful conversion, %false if kt was 0. |
6e94d1ef3 net: socket: move... |
208 |
*/ |
35b210855 ktime: Add __must... |
209 210 |
static inline __must_check bool ktime_to_timespec_cond(const ktime_t kt, struct timespec *ts) |
6e94d1ef3 net: socket: move... |
211 |
{ |
2456e8553 ktime: Get rid of... |
212 |
if (kt) { |
6e94d1ef3 net: socket: move... |
213 214 215 216 217 218 |
*ts = ktime_to_timespec(kt); return true; } else { return false; } } |
49cd6f869 time: More core i... |
219 220 221 222 223 224 225 226 227 228 229 |
/** * ktime_to_timespec64_cond - convert a ktime_t variable to timespec64 * format only if the variable contains data * @kt: the ktime_t variable to convert * @ts: the timespec variable to store the result in * * Return: %true if there was a successful conversion, %false if kt was 0. */ static inline __must_check bool ktime_to_timespec64_cond(const ktime_t kt, struct timespec64 *ts) { |
2456e8553 ktime: Get rid of... |
230 |
if (kt) { |
49cd6f869 time: More core i... |
231 232 233 234 235 236 |
*ts = ktime_to_timespec64(kt); return true; } else { return false; } } |
c0a313296 [PATCH] hrtimer: ... |
237 238 239 240 241 242 |
/* * The resolution of the clocks. The resolution value is returned in * the clock_getres() system call to give application programmers an * idea of the (in)accuracy of timers. Timer values are rounded up to * this resolution values. */ |
151db1fc2 Fix compilation o... |
243 |
#define LOW_RES_NSEC TICK_NSEC |
2456e8553 ktime: Get rid of... |
244 |
#define KTIME_LOW_RES (LOW_RES_NSEC) |
c0a313296 [PATCH] hrtimer: ... |
245 |
|
57d3da291 time: add ns_to_k... |
246 247 |
static inline ktime_t ns_to_ktime(u64 ns) { |
2456e8553 ktime: Get rid of... |
248 |
return ns; |
57d3da291 time: add ns_to_k... |
249 |
} |
d36f82b24 ktime: add ms_to_... |
250 251 |
static inline ktime_t ms_to_ktime(u64 ms) { |
2456e8553 ktime: Get rid of... |
252 |
return ms * NSEC_PER_MSEC; |
d36f82b24 ktime: add ms_to_... |
253 |
} |
8b094cd03 time: Consolidate... |
254 |
# include <linux/timekeeping.h> |
97fc79f97 [PATCH] hrtimer: ... |
255 |
#endif |