blob: e325597f5bf53fbe000605cd74b8c3ec5f94976e [file] [log] [blame]
Linus Torvalds1da177e2005-04-16 15:20:36 -07001/*
2 * linux/kernel/time.c
3 *
4 * Copyright (C) 1991, 1992 Linus Torvalds
5 *
6 * This file contains the interface functions for the various
7 * time related system calls: time, stime, gettimeofday, settimeofday,
8 * adjtime
9 */
10/*
11 * Modification history kernel/time.c
12 *
13 * 1993-09-02 Philip Gladstone
14 * Created file with time related functions from sched.c and adjtimex()
15 * 1993-10-08 Torsten Duwe
16 * adjtime interface update and CMOS clock write code
17 * 1995-08-13 Torsten Duwe
18 * kernel PLL updated to 1994-12-13 specs (rfc-1589)
19 * 1999-01-16 Ulrich Windl
20 * Introduced error checking for many cases in adjtimex().
21 * Updated NTP code according to technical memorandum Jan '96
22 * "A Kernel Model for Precision Timekeeping" by Dave Mills
23 * Allow time_constant larger than MAXTC(6) for NTP v4 (MAXTC == 10)
24 * (Even though the technical memorandum forbids it)
25 * 2004-07-14 Christoph Lameter
26 * Added getnstimeofday to allow the posix timer functions to return
27 * with nanosecond accuracy
28 */
29
30#include <linux/module.h>
31#include <linux/timex.h>
Randy.Dunlapc59ede72006-01-11 12:17:46 -080032#include <linux/capability.h>
Linus Torvalds1da177e2005-04-16 15:20:36 -070033#include <linux/errno.h>
Linus Torvalds1da177e2005-04-16 15:20:36 -070034#include <linux/syscalls.h>
35#include <linux/security.h>
36#include <linux/fs.h>
37#include <linux/module.h>
38
39#include <asm/uaccess.h>
40#include <asm/unistd.h>
41
42/*
43 * The timezone where the local system is located. Used as a default by some
44 * programs who obtain this value by using gettimeofday.
45 */
46struct timezone sys_tz;
47
48EXPORT_SYMBOL(sys_tz);
49
50#ifdef __ARCH_WANT_SYS_TIME
51
52/*
53 * sys_time() can be implemented in user-level using
54 * sys_gettimeofday(). Is this for backwards compatibility? If so,
55 * why not move it into the appropriate arch directory (for those
56 * architectures that need it).
57 */
58asmlinkage long sys_time(time_t __user * tloc)
59{
Ingo Molnar4e44f342007-07-15 23:41:18 -070060 /*
61 * We read xtime.tv_sec atomically - it's updated
62 * atomically by update_wall_time(), so no need to
63 * even read-lock the xtime seqlock:
64 */
65 time_t i = xtime.tv_sec;
Linus Torvalds1da177e2005-04-16 15:20:36 -070066
Ingo Molnar4e44f342007-07-15 23:41:18 -070067 smp_rmb(); /* sys_time() results are coherent */
Linus Torvalds1da177e2005-04-16 15:20:36 -070068
69 if (tloc) {
Ingo Molnar4e44f342007-07-15 23:41:18 -070070 if (put_user(i, tloc))
Linus Torvalds1da177e2005-04-16 15:20:36 -070071 i = -EFAULT;
72 }
73 return i;
74}
75
76/*
77 * sys_stime() can be implemented in user-level using
78 * sys_settimeofday(). Is this for backwards compatibility? If so,
79 * why not move it into the appropriate arch directory (for those
80 * architectures that need it).
81 */
82
83asmlinkage long sys_stime(time_t __user *tptr)
84{
85 struct timespec tv;
86 int err;
87
88 if (get_user(tv.tv_sec, tptr))
89 return -EFAULT;
90
91 tv.tv_nsec = 0;
92
93 err = security_settime(&tv, NULL);
94 if (err)
95 return err;
96
97 do_settimeofday(&tv);
98 return 0;
99}
100
101#endif /* __ARCH_WANT_SYS_TIME */
102
103asmlinkage long sys_gettimeofday(struct timeval __user *tv, struct timezone __user *tz)
104{
105 if (likely(tv != NULL)) {
106 struct timeval ktv;
107 do_gettimeofday(&ktv);
108 if (copy_to_user(tv, &ktv, sizeof(ktv)))
109 return -EFAULT;
110 }
111 if (unlikely(tz != NULL)) {
112 if (copy_to_user(tz, &sys_tz, sizeof(sys_tz)))
113 return -EFAULT;
114 }
115 return 0;
116}
117
118/*
119 * Adjust the time obtained from the CMOS to be UTC time instead of
120 * local time.
121 *
122 * This is ugly, but preferable to the alternatives. Otherwise we
123 * would either need to write a program to do it in /etc/rc (and risk
124 * confusion if the program gets run more than once; it would also be
125 * hard to make the program warp the clock precisely n hours) or
126 * compile in the timezone information into the kernel. Bad, bad....
127 *
128 * - TYT, 1992-01-01
129 *
130 * The best thing to do is to keep the CMOS clock in universal time (UTC)
131 * as real UNIX machines always do it. This avoids all headaches about
132 * daylight saving times and warping kernel clocks.
133 */
Jesper Juhl77933d72005-07-27 11:46:09 -0700134static inline void warp_clock(void)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700135{
136 write_seqlock_irq(&xtime_lock);
137 wall_to_monotonic.tv_sec -= sys_tz.tz_minuteswest * 60;
138 xtime.tv_sec += sys_tz.tz_minuteswest * 60;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700139 write_sequnlock_irq(&xtime_lock);
140 clock_was_set();
141}
142
143/*
144 * In case for some reason the CMOS clock has not already been running
145 * in UTC, but in some local time: The first time we set the timezone,
146 * we will warp the clock so that it is ticking UTC time instead of
147 * local time. Presumably, if someone is setting the timezone then we
148 * are running in an environment where the programs understand about
149 * timezones. This should be done at boot time in the /etc/rc script,
150 * as soon as possible, so that the clock can be set right. Otherwise,
151 * various programs will get confused when the clock gets warped.
152 */
153
154int do_sys_settimeofday(struct timespec *tv, struct timezone *tz)
155{
156 static int firsttime = 1;
157 int error = 0;
158
Linus Torvalds951069e2006-01-31 10:16:55 -0800159 if (tv && !timespec_valid(tv))
Thomas Gleixner718bcce2006-01-09 20:52:29 -0800160 return -EINVAL;
161
Linus Torvalds1da177e2005-04-16 15:20:36 -0700162 error = security_settime(tv, tz);
163 if (error)
164 return error;
165
166 if (tz) {
167 /* SMP safe, global irq locking makes it work. */
168 sys_tz = *tz;
169 if (firsttime) {
170 firsttime = 0;
171 if (!tv)
172 warp_clock();
173 }
174 }
175 if (tv)
176 {
177 /* SMP safe, again the code in arch/foo/time.c should
178 * globally block out interrupts when it runs.
179 */
180 return do_settimeofday(tv);
181 }
182 return 0;
183}
184
185asmlinkage long sys_settimeofday(struct timeval __user *tv,
186 struct timezone __user *tz)
187{
188 struct timeval user_tv;
189 struct timespec new_ts;
190 struct timezone new_tz;
191
192 if (tv) {
193 if (copy_from_user(&user_tv, tv, sizeof(*tv)))
194 return -EFAULT;
195 new_ts.tv_sec = user_tv.tv_sec;
196 new_ts.tv_nsec = user_tv.tv_usec * NSEC_PER_USEC;
197 }
198 if (tz) {
199 if (copy_from_user(&new_tz, tz, sizeof(*tz)))
200 return -EFAULT;
201 }
202
203 return do_sys_settimeofday(tv ? &new_ts : NULL, tz ? &new_tz : NULL);
204}
205
Linus Torvalds1da177e2005-04-16 15:20:36 -0700206asmlinkage long sys_adjtimex(struct timex __user *txc_p)
207{
208 struct timex txc; /* Local copy of parameter */
209 int ret;
210
211 /* Copy the user data space into the kernel copy
212 * structure. But bear in mind that the structures
213 * may change
214 */
215 if(copy_from_user(&txc, txc_p, sizeof(struct timex)))
216 return -EFAULT;
217 ret = do_adjtimex(&txc);
218 return copy_to_user(txc_p, &txc, sizeof(struct timex)) ? -EFAULT : ret;
219}
220
221inline struct timespec current_kernel_time(void)
222{
223 struct timespec now;
224 unsigned long seq;
225
226 do {
227 seq = read_seqbegin(&xtime_lock);
228
229 now = xtime;
230 } while (read_seqretry(&xtime_lock, seq));
231
232 return now;
233}
234
235EXPORT_SYMBOL(current_kernel_time);
236
237/**
238 * current_fs_time - Return FS time
239 * @sb: Superblock.
240 *
Kalin KOZHUHAROV8ba8e952006-04-01 01:41:22 +0200241 * Return the current time truncated to the time granularity supported by
Linus Torvalds1da177e2005-04-16 15:20:36 -0700242 * the fs.
243 */
244struct timespec current_fs_time(struct super_block *sb)
245{
246 struct timespec now = current_kernel_time();
247 return timespec_trunc(now, sb->s_time_gran);
248}
249EXPORT_SYMBOL(current_fs_time);
250
Eric Dumazet753e9c52007-05-08 00:25:32 -0700251/*
252 * Convert jiffies to milliseconds and back.
253 *
254 * Avoid unnecessary multiplications/divisions in the
255 * two most common HZ cases:
256 */
257unsigned int inline jiffies_to_msecs(const unsigned long j)
258{
259#if HZ <= MSEC_PER_SEC && !(MSEC_PER_SEC % HZ)
260 return (MSEC_PER_SEC / HZ) * j;
261#elif HZ > MSEC_PER_SEC && !(HZ % MSEC_PER_SEC)
262 return (j + (HZ / MSEC_PER_SEC) - 1)/(HZ / MSEC_PER_SEC);
263#else
264 return (j * MSEC_PER_SEC) / HZ;
265#endif
266}
267EXPORT_SYMBOL(jiffies_to_msecs);
268
269unsigned int inline jiffies_to_usecs(const unsigned long j)
270{
271#if HZ <= USEC_PER_SEC && !(USEC_PER_SEC % HZ)
272 return (USEC_PER_SEC / HZ) * j;
273#elif HZ > USEC_PER_SEC && !(HZ % USEC_PER_SEC)
274 return (j + (HZ / USEC_PER_SEC) - 1)/(HZ / USEC_PER_SEC);
275#else
276 return (j * USEC_PER_SEC) / HZ;
277#endif
278}
279EXPORT_SYMBOL(jiffies_to_usecs);
280
Linus Torvalds1da177e2005-04-16 15:20:36 -0700281/**
Kalin KOZHUHAROV8ba8e952006-04-01 01:41:22 +0200282 * timespec_trunc - Truncate timespec to a granularity
Linus Torvalds1da177e2005-04-16 15:20:36 -0700283 * @t: Timespec
Kalin KOZHUHAROV8ba8e952006-04-01 01:41:22 +0200284 * @gran: Granularity in ns.
Linus Torvalds1da177e2005-04-16 15:20:36 -0700285 *
Kalin KOZHUHAROV8ba8e952006-04-01 01:41:22 +0200286 * Truncate a timespec to a granularity. gran must be smaller than a second.
Linus Torvalds1da177e2005-04-16 15:20:36 -0700287 * Always rounds down.
288 *
289 * This function should be only used for timestamps returned by
290 * current_kernel_time() or CURRENT_TIME, not with do_gettimeofday() because
291 * it doesn't handle the better resolution of the later.
292 */
293struct timespec timespec_trunc(struct timespec t, unsigned gran)
294{
295 /*
296 * Division is pretty slow so avoid it for common cases.
297 * Currently current_kernel_time() never returns better than
298 * jiffies resolution. Exploit that.
299 */
300 if (gran <= jiffies_to_usecs(1) * 1000) {
301 /* nothing */
302 } else if (gran == 1000000000) {
303 t.tv_nsec = 0;
304 } else {
305 t.tv_nsec -= t.tv_nsec % gran;
306 }
307 return t;
308}
309EXPORT_SYMBOL(timespec_trunc);
310
john stultzcf3c7692006-06-26 00:25:08 -0700311#ifndef CONFIG_GENERIC_TIME
Linus Torvalds1da177e2005-04-16 15:20:36 -0700312/*
313 * Simulate gettimeofday using do_gettimeofday which only allows a timeval
314 * and therefore only yields usec accuracy
315 */
316void getnstimeofday(struct timespec *tv)
317{
318 struct timeval x;
319
320 do_gettimeofday(&x);
321 tv->tv_sec = x.tv_sec;
322 tv->tv_nsec = x.tv_usec * NSEC_PER_USEC;
323}
Takashi Iwaic6ecf7e2005-10-14 15:59:03 -0700324EXPORT_SYMBOL_GPL(getnstimeofday);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700325#endif
326
Thomas Gleixner753be622006-01-09 20:52:22 -0800327/* Converts Gregorian date to seconds since 1970-01-01 00:00:00.
328 * Assumes input in normal date format, i.e. 1980-12-31 23:59:59
329 * => year=1980, mon=12, day=31, hour=23, min=59, sec=59.
330 *
331 * [For the Julian calendar (which was used in Russia before 1917,
332 * Britain & colonies before 1752, anywhere else before 1582,
333 * and is still in use by some communities) leave out the
334 * -year/100+year/400 terms, and add 10.]
335 *
336 * This algorithm was first published by Gauss (I think).
337 *
338 * WARNING: this function will overflow on 2106-02-07 06:28:16 on
339 * machines were long is 32-bit! (However, as time_t is signed, we
340 * will already get problems at other places on 2038-01-19 03:14:08)
341 */
342unsigned long
Ingo Molnarf4818902006-01-09 20:52:23 -0800343mktime(const unsigned int year0, const unsigned int mon0,
344 const unsigned int day, const unsigned int hour,
345 const unsigned int min, const unsigned int sec)
Thomas Gleixner753be622006-01-09 20:52:22 -0800346{
Ingo Molnarf4818902006-01-09 20:52:23 -0800347 unsigned int mon = mon0, year = year0;
348
349 /* 1..12 -> 11,12,1..10 */
350 if (0 >= (int) (mon -= 2)) {
351 mon += 12; /* Puts Feb last since it has leap day */
Thomas Gleixner753be622006-01-09 20:52:22 -0800352 year -= 1;
353 }
354
355 return ((((unsigned long)
356 (year/4 - year/100 + year/400 + 367*mon/12 + day) +
357 year*365 - 719499
358 )*24 + hour /* now have hours */
359 )*60 + min /* now have minutes */
360 )*60 + sec; /* finally seconds */
361}
362
Andrew Morton199e7052006-01-09 20:52:24 -0800363EXPORT_SYMBOL(mktime);
364
Thomas Gleixner753be622006-01-09 20:52:22 -0800365/**
366 * set_normalized_timespec - set timespec sec and nsec parts and normalize
367 *
368 * @ts: pointer to timespec variable to be set
369 * @sec: seconds to set
370 * @nsec: nanoseconds to set
371 *
372 * Set seconds and nanoseconds field of a timespec variable and
373 * normalize to the timespec storage format
374 *
375 * Note: The tv_nsec part is always in the range of
376 * 0 <= tv_nsec < NSEC_PER_SEC
377 * For negative values only the tv_sec field is negative !
378 */
Ingo Molnarf4818902006-01-09 20:52:23 -0800379void set_normalized_timespec(struct timespec *ts, time_t sec, long nsec)
Thomas Gleixner753be622006-01-09 20:52:22 -0800380{
381 while (nsec >= NSEC_PER_SEC) {
382 nsec -= NSEC_PER_SEC;
383 ++sec;
384 }
385 while (nsec < 0) {
386 nsec += NSEC_PER_SEC;
387 --sec;
388 }
389 ts->tv_sec = sec;
390 ts->tv_nsec = nsec;
391}
392
Thomas Gleixnerf8f46da2006-01-09 20:52:30 -0800393/**
394 * ns_to_timespec - Convert nanoseconds to timespec
395 * @nsec: the nanoseconds value to be converted
396 *
397 * Returns the timespec representation of the nsec parameter.
398 */
Roman Zippeldf869b62006-03-26 01:38:11 -0800399struct timespec ns_to_timespec(const s64 nsec)
Thomas Gleixnerf8f46da2006-01-09 20:52:30 -0800400{
401 struct timespec ts;
402
George Anzinger88fc3892006-02-03 03:04:20 -0800403 if (!nsec)
404 return (struct timespec) {0, 0};
405
406 ts.tv_sec = div_long_long_rem_signed(nsec, NSEC_PER_SEC, &ts.tv_nsec);
407 if (unlikely(nsec < 0))
408 set_normalized_timespec(&ts, ts.tv_sec, ts.tv_nsec);
Thomas Gleixnerf8f46da2006-01-09 20:52:30 -0800409
410 return ts;
411}
Stephen Hemminger85795d62007-03-24 21:35:33 -0700412EXPORT_SYMBOL(ns_to_timespec);
Thomas Gleixnerf8f46da2006-01-09 20:52:30 -0800413
414/**
415 * ns_to_timeval - Convert nanoseconds to timeval
416 * @nsec: the nanoseconds value to be converted
417 *
418 * Returns the timeval representation of the nsec parameter.
419 */
Roman Zippeldf869b62006-03-26 01:38:11 -0800420struct timeval ns_to_timeval(const s64 nsec)
Thomas Gleixnerf8f46da2006-01-09 20:52:30 -0800421{
422 struct timespec ts = ns_to_timespec(nsec);
423 struct timeval tv;
424
425 tv.tv_sec = ts.tv_sec;
426 tv.tv_usec = (suseconds_t) ts.tv_nsec / 1000;
427
428 return tv;
429}
Eric Dumazetb7aa0bf2007-04-19 16:16:32 -0700430EXPORT_SYMBOL(ns_to_timeval);
Thomas Gleixnerf8f46da2006-01-09 20:52:30 -0800431
Ingo Molnar8b9365d2007-02-16 01:27:27 -0800432/*
Ingo Molnar41cf5442007-02-16 01:27:28 -0800433 * When we convert to jiffies then we interpret incoming values
434 * the following way:
435 *
436 * - negative values mean 'infinite timeout' (MAX_JIFFY_OFFSET)
437 *
438 * - 'too large' values [that would result in larger than
439 * MAX_JIFFY_OFFSET values] mean 'infinite timeout' too.
440 *
441 * - all other values are converted to jiffies by either multiplying
442 * the input value by a factor or dividing it with a factor
443 *
444 * We must also be careful about 32-bit overflows.
445 */
Ingo Molnar8b9365d2007-02-16 01:27:27 -0800446unsigned long msecs_to_jiffies(const unsigned int m)
447{
Ingo Molnar41cf5442007-02-16 01:27:28 -0800448 /*
449 * Negative value, means infinite timeout:
450 */
451 if ((int)m < 0)
Ingo Molnar8b9365d2007-02-16 01:27:27 -0800452 return MAX_JIFFY_OFFSET;
Ingo Molnar41cf5442007-02-16 01:27:28 -0800453
Ingo Molnar8b9365d2007-02-16 01:27:27 -0800454#if HZ <= MSEC_PER_SEC && !(MSEC_PER_SEC % HZ)
Ingo Molnar41cf5442007-02-16 01:27:28 -0800455 /*
456 * HZ is equal to or smaller than 1000, and 1000 is a nice
457 * round multiple of HZ, divide with the factor between them,
458 * but round upwards:
459 */
Ingo Molnar8b9365d2007-02-16 01:27:27 -0800460 return (m + (MSEC_PER_SEC / HZ) - 1) / (MSEC_PER_SEC / HZ);
461#elif HZ > MSEC_PER_SEC && !(HZ % MSEC_PER_SEC)
Ingo Molnar41cf5442007-02-16 01:27:28 -0800462 /*
463 * HZ is larger than 1000, and HZ is a nice round multiple of
464 * 1000 - simply multiply with the factor between them.
465 *
466 * But first make sure the multiplication result cannot
467 * overflow:
468 */
469 if (m > jiffies_to_msecs(MAX_JIFFY_OFFSET))
470 return MAX_JIFFY_OFFSET;
471
Ingo Molnar8b9365d2007-02-16 01:27:27 -0800472 return m * (HZ / MSEC_PER_SEC);
473#else
Ingo Molnar41cf5442007-02-16 01:27:28 -0800474 /*
475 * Generic case - multiply, round and divide. But first
476 * check that if we are doing a net multiplication, that
477 * we wouldnt overflow:
478 */
479 if (HZ > MSEC_PER_SEC && m > jiffies_to_msecs(MAX_JIFFY_OFFSET))
480 return MAX_JIFFY_OFFSET;
481
Ingo Molnar8b9365d2007-02-16 01:27:27 -0800482 return (m * HZ + MSEC_PER_SEC - 1) / MSEC_PER_SEC;
483#endif
484}
485EXPORT_SYMBOL(msecs_to_jiffies);
486
487unsigned long usecs_to_jiffies(const unsigned int u)
488{
489 if (u > jiffies_to_usecs(MAX_JIFFY_OFFSET))
490 return MAX_JIFFY_OFFSET;
491#if HZ <= USEC_PER_SEC && !(USEC_PER_SEC % HZ)
492 return (u + (USEC_PER_SEC / HZ) - 1) / (USEC_PER_SEC / HZ);
493#elif HZ > USEC_PER_SEC && !(HZ % USEC_PER_SEC)
494 return u * (HZ / USEC_PER_SEC);
495#else
496 return (u * HZ + USEC_PER_SEC - 1) / USEC_PER_SEC;
497#endif
498}
499EXPORT_SYMBOL(usecs_to_jiffies);
500
501/*
502 * The TICK_NSEC - 1 rounds up the value to the next resolution. Note
503 * that a remainder subtract here would not do the right thing as the
504 * resolution values don't fall on second boundries. I.e. the line:
505 * nsec -= nsec % TICK_NSEC; is NOT a correct resolution rounding.
506 *
507 * Rather, we just shift the bits off the right.
508 *
509 * The >> (NSEC_JIFFIE_SC - SEC_JIFFIE_SC) converts the scaled nsec
510 * value to a scaled second value.
511 */
512unsigned long
513timespec_to_jiffies(const struct timespec *value)
514{
515 unsigned long sec = value->tv_sec;
516 long nsec = value->tv_nsec + TICK_NSEC - 1;
517
518 if (sec >= MAX_SEC_IN_JIFFIES){
519 sec = MAX_SEC_IN_JIFFIES;
520 nsec = 0;
521 }
522 return (((u64)sec * SEC_CONVERSION) +
523 (((u64)nsec * NSEC_CONVERSION) >>
524 (NSEC_JIFFIE_SC - SEC_JIFFIE_SC))) >> SEC_JIFFIE_SC;
525
526}
527EXPORT_SYMBOL(timespec_to_jiffies);
528
529void
530jiffies_to_timespec(const unsigned long jiffies, struct timespec *value)
531{
532 /*
533 * Convert jiffies to nanoseconds and separate with
534 * one divide.
535 */
536 u64 nsec = (u64)jiffies * TICK_NSEC;
537 value->tv_sec = div_long_long_rem(nsec, NSEC_PER_SEC, &value->tv_nsec);
538}
539EXPORT_SYMBOL(jiffies_to_timespec);
540
541/* Same for "timeval"
542 *
543 * Well, almost. The problem here is that the real system resolution is
544 * in nanoseconds and the value being converted is in micro seconds.
545 * Also for some machines (those that use HZ = 1024, in-particular),
546 * there is a LARGE error in the tick size in microseconds.
547
548 * The solution we use is to do the rounding AFTER we convert the
549 * microsecond part. Thus the USEC_ROUND, the bits to be shifted off.
550 * Instruction wise, this should cost only an additional add with carry
551 * instruction above the way it was done above.
552 */
553unsigned long
554timeval_to_jiffies(const struct timeval *value)
555{
556 unsigned long sec = value->tv_sec;
557 long usec = value->tv_usec;
558
559 if (sec >= MAX_SEC_IN_JIFFIES){
560 sec = MAX_SEC_IN_JIFFIES;
561 usec = 0;
562 }
563 return (((u64)sec * SEC_CONVERSION) +
564 (((u64)usec * USEC_CONVERSION + USEC_ROUND) >>
565 (USEC_JIFFIE_SC - SEC_JIFFIE_SC))) >> SEC_JIFFIE_SC;
566}
Thomas Bittermann456a09d2007-04-04 22:20:54 +0200567EXPORT_SYMBOL(timeval_to_jiffies);
Ingo Molnar8b9365d2007-02-16 01:27:27 -0800568
569void jiffies_to_timeval(const unsigned long jiffies, struct timeval *value)
570{
571 /*
572 * Convert jiffies to nanoseconds and separate with
573 * one divide.
574 */
575 u64 nsec = (u64)jiffies * TICK_NSEC;
576 long tv_usec;
577
578 value->tv_sec = div_long_long_rem(nsec, NSEC_PER_SEC, &tv_usec);
579 tv_usec /= NSEC_PER_USEC;
580 value->tv_usec = tv_usec;
581}
Thomas Bittermann456a09d2007-04-04 22:20:54 +0200582EXPORT_SYMBOL(jiffies_to_timeval);
Ingo Molnar8b9365d2007-02-16 01:27:27 -0800583
584/*
585 * Convert jiffies/jiffies_64 to clock_t and back.
586 */
587clock_t jiffies_to_clock_t(long x)
588{
589#if (TICK_NSEC % (NSEC_PER_SEC / USER_HZ)) == 0
590 return x / (HZ / USER_HZ);
591#else
592 u64 tmp = (u64)x * TICK_NSEC;
593 do_div(tmp, (NSEC_PER_SEC / USER_HZ));
594 return (long)tmp;
595#endif
596}
597EXPORT_SYMBOL(jiffies_to_clock_t);
598
599unsigned long clock_t_to_jiffies(unsigned long x)
600{
601#if (HZ % USER_HZ)==0
602 if (x >= ~0UL / (HZ / USER_HZ))
603 return ~0UL;
604 return x * (HZ / USER_HZ);
605#else
606 u64 jif;
607
608 /* Don't worry about loss of precision here .. */
609 if (x >= ~0UL / HZ * USER_HZ)
610 return ~0UL;
611
612 /* .. but do try to contain it here */
613 jif = x * (u64) HZ;
614 do_div(jif, USER_HZ);
615 return jif;
616#endif
617}
618EXPORT_SYMBOL(clock_t_to_jiffies);
619
620u64 jiffies_64_to_clock_t(u64 x)
621{
622#if (TICK_NSEC % (NSEC_PER_SEC / USER_HZ)) == 0
623 do_div(x, HZ / USER_HZ);
624#else
625 /*
626 * There are better ways that don't overflow early,
627 * but even this doesn't overflow in hundreds of years
628 * in 64 bits, so..
629 */
630 x *= TICK_NSEC;
631 do_div(x, (NSEC_PER_SEC / USER_HZ));
632#endif
633 return x;
634}
635
636EXPORT_SYMBOL(jiffies_64_to_clock_t);
637
638u64 nsec_to_clock_t(u64 x)
639{
640#if (NSEC_PER_SEC % USER_HZ) == 0
641 do_div(x, (NSEC_PER_SEC / USER_HZ));
642#elif (USER_HZ % 512) == 0
643 x *= USER_HZ/512;
644 do_div(x, (NSEC_PER_SEC / 512));
645#else
646 /*
647 * max relative error 5.7e-8 (1.8s per year) for USER_HZ <= 1024,
648 * overflow after 64.99 years.
649 * exact for HZ=60, 72, 90, 120, 144, 180, 300, 600, 900, ...
650 */
651 x *= 9;
652 do_div(x, (unsigned long)((9ull * NSEC_PER_SEC + (USER_HZ/2)) /
653 USER_HZ));
654#endif
655 return x;
656}
657
Linus Torvalds1da177e2005-04-16 15:20:36 -0700658#if (BITS_PER_LONG < 64)
659u64 get_jiffies_64(void)
660{
661 unsigned long seq;
662 u64 ret;
663
664 do {
665 seq = read_seqbegin(&xtime_lock);
666 ret = jiffies_64;
667 } while (read_seqretry(&xtime_lock, seq));
668 return ret;
669}
670
671EXPORT_SYMBOL(get_jiffies_64);
672#endif
673
674EXPORT_SYMBOL(jiffies);