xref: /openbmc/linux/kernel/time/time.c (revision 3a4d44b6)
15cee9645SThomas Gleixner /*
25cee9645SThomas Gleixner  *  linux/kernel/time.c
35cee9645SThomas Gleixner  *
45cee9645SThomas Gleixner  *  Copyright (C) 1991, 1992  Linus Torvalds
55cee9645SThomas Gleixner  *
65cee9645SThomas Gleixner  *  This file contains the interface functions for the various
75cee9645SThomas Gleixner  *  time related system calls: time, stime, gettimeofday, settimeofday,
85cee9645SThomas Gleixner  *			       adjtime
95cee9645SThomas Gleixner  */
105cee9645SThomas Gleixner /*
115cee9645SThomas Gleixner  * Modification history kernel/time.c
125cee9645SThomas Gleixner  *
135cee9645SThomas Gleixner  * 1993-09-02    Philip Gladstone
145cee9645SThomas Gleixner  *      Created file with time related functions from sched/core.c and adjtimex()
155cee9645SThomas Gleixner  * 1993-10-08    Torsten Duwe
165cee9645SThomas Gleixner  *      adjtime interface update and CMOS clock write code
175cee9645SThomas Gleixner  * 1995-08-13    Torsten Duwe
185cee9645SThomas Gleixner  *      kernel PLL updated to 1994-12-13 specs (rfc-1589)
195cee9645SThomas Gleixner  * 1999-01-16    Ulrich Windl
205cee9645SThomas Gleixner  *	Introduced error checking for many cases in adjtimex().
215cee9645SThomas Gleixner  *	Updated NTP code according to technical memorandum Jan '96
225cee9645SThomas Gleixner  *	"A Kernel Model for Precision Timekeeping" by Dave Mills
235cee9645SThomas Gleixner  *	Allow time_constant larger than MAXTC(6) for NTP v4 (MAXTC == 10)
245cee9645SThomas Gleixner  *	(Even though the technical memorandum forbids it)
255cee9645SThomas Gleixner  * 2004-07-14	 Christoph Lameter
265cee9645SThomas Gleixner  *	Added getnstimeofday to allow the posix timer functions to return
275cee9645SThomas Gleixner  *	with nanosecond accuracy
285cee9645SThomas Gleixner  */
295cee9645SThomas Gleixner 
305cee9645SThomas Gleixner #include <linux/export.h>
315cee9645SThomas Gleixner #include <linux/timex.h>
325cee9645SThomas Gleixner #include <linux/capability.h>
335cee9645SThomas Gleixner #include <linux/timekeeper_internal.h>
345cee9645SThomas Gleixner #include <linux/errno.h>
355cee9645SThomas Gleixner #include <linux/syscalls.h>
365cee9645SThomas Gleixner #include <linux/security.h>
375cee9645SThomas Gleixner #include <linux/fs.h>
385cee9645SThomas Gleixner #include <linux/math64.h>
395cee9645SThomas Gleixner #include <linux/ptrace.h>
405cee9645SThomas Gleixner 
417c0f6ba6SLinus Torvalds #include <linux/uaccess.h>
423a4d44b6SAl Viro #include <linux/compat.h>
435cee9645SThomas Gleixner #include <asm/unistd.h>
445cee9645SThomas Gleixner 
450a227985SNicholas Mc Guire #include <generated/timeconst.h>
468b094cd0SThomas Gleixner #include "timekeeping.h"
475cee9645SThomas Gleixner 
485cee9645SThomas Gleixner /*
495cee9645SThomas Gleixner  * The timezone where the local system is located.  Used as a default by some
505cee9645SThomas Gleixner  * programs who obtain this value by using gettimeofday.
515cee9645SThomas Gleixner  */
525cee9645SThomas Gleixner struct timezone sys_tz;
535cee9645SThomas Gleixner 
545cee9645SThomas Gleixner EXPORT_SYMBOL(sys_tz);
555cee9645SThomas Gleixner 
565cee9645SThomas Gleixner #ifdef __ARCH_WANT_SYS_TIME
575cee9645SThomas Gleixner 
585cee9645SThomas Gleixner /*
595cee9645SThomas Gleixner  * sys_time() can be implemented in user-level using
605cee9645SThomas Gleixner  * sys_gettimeofday().  Is this for backwards compatibility?  If so,
615cee9645SThomas Gleixner  * why not move it into the appropriate arch directory (for those
625cee9645SThomas Gleixner  * architectures that need it).
635cee9645SThomas Gleixner  */
645cee9645SThomas Gleixner SYSCALL_DEFINE1(time, time_t __user *, tloc)
655cee9645SThomas Gleixner {
665cee9645SThomas Gleixner 	time_t i = get_seconds();
675cee9645SThomas Gleixner 
685cee9645SThomas Gleixner 	if (tloc) {
695cee9645SThomas Gleixner 		if (put_user(i,tloc))
705cee9645SThomas Gleixner 			return -EFAULT;
715cee9645SThomas Gleixner 	}
725cee9645SThomas Gleixner 	force_successful_syscall_return();
735cee9645SThomas Gleixner 	return i;
745cee9645SThomas Gleixner }
755cee9645SThomas Gleixner 
765cee9645SThomas Gleixner /*
775cee9645SThomas Gleixner  * sys_stime() can be implemented in user-level using
785cee9645SThomas Gleixner  * sys_settimeofday().  Is this for backwards compatibility?  If so,
795cee9645SThomas Gleixner  * why not move it into the appropriate arch directory (for those
805cee9645SThomas Gleixner  * architectures that need it).
815cee9645SThomas Gleixner  */
825cee9645SThomas Gleixner 
835cee9645SThomas Gleixner SYSCALL_DEFINE1(stime, time_t __user *, tptr)
845cee9645SThomas Gleixner {
855cee9645SThomas Gleixner 	struct timespec tv;
865cee9645SThomas Gleixner 	int err;
875cee9645SThomas Gleixner 
885cee9645SThomas Gleixner 	if (get_user(tv.tv_sec, tptr))
895cee9645SThomas Gleixner 		return -EFAULT;
905cee9645SThomas Gleixner 
915cee9645SThomas Gleixner 	tv.tv_nsec = 0;
925cee9645SThomas Gleixner 
935cee9645SThomas Gleixner 	err = security_settime(&tv, NULL);
945cee9645SThomas Gleixner 	if (err)
955cee9645SThomas Gleixner 		return err;
965cee9645SThomas Gleixner 
975cee9645SThomas Gleixner 	do_settimeofday(&tv);
985cee9645SThomas Gleixner 	return 0;
995cee9645SThomas Gleixner }
1005cee9645SThomas Gleixner 
1015cee9645SThomas Gleixner #endif /* __ARCH_WANT_SYS_TIME */
1025cee9645SThomas Gleixner 
1035cee9645SThomas Gleixner SYSCALL_DEFINE2(gettimeofday, struct timeval __user *, tv,
1045cee9645SThomas Gleixner 		struct timezone __user *, tz)
1055cee9645SThomas Gleixner {
1065cee9645SThomas Gleixner 	if (likely(tv != NULL)) {
1075cee9645SThomas Gleixner 		struct timeval ktv;
1085cee9645SThomas Gleixner 		do_gettimeofday(&ktv);
1095cee9645SThomas Gleixner 		if (copy_to_user(tv, &ktv, sizeof(ktv)))
1105cee9645SThomas Gleixner 			return -EFAULT;
1115cee9645SThomas Gleixner 	}
1125cee9645SThomas Gleixner 	if (unlikely(tz != NULL)) {
1135cee9645SThomas Gleixner 		if (copy_to_user(tz, &sys_tz, sizeof(sys_tz)))
1145cee9645SThomas Gleixner 			return -EFAULT;
1155cee9645SThomas Gleixner 	}
1165cee9645SThomas Gleixner 	return 0;
1175cee9645SThomas Gleixner }
1185cee9645SThomas Gleixner 
1195cee9645SThomas Gleixner /*
1205cee9645SThomas Gleixner  * Indicates if there is an offset between the system clock and the hardware
1215cee9645SThomas Gleixner  * clock/persistent clock/rtc.
1225cee9645SThomas Gleixner  */
1235cee9645SThomas Gleixner int persistent_clock_is_local;
1245cee9645SThomas Gleixner 
1255cee9645SThomas Gleixner /*
1265cee9645SThomas Gleixner  * Adjust the time obtained from the CMOS to be UTC time instead of
1275cee9645SThomas Gleixner  * local time.
1285cee9645SThomas Gleixner  *
1295cee9645SThomas Gleixner  * This is ugly, but preferable to the alternatives.  Otherwise we
1305cee9645SThomas Gleixner  * would either need to write a program to do it in /etc/rc (and risk
1315cee9645SThomas Gleixner  * confusion if the program gets run more than once; it would also be
1325cee9645SThomas Gleixner  * hard to make the program warp the clock precisely n hours)  or
1335cee9645SThomas Gleixner  * compile in the timezone information into the kernel.  Bad, bad....
1345cee9645SThomas Gleixner  *
1355cee9645SThomas Gleixner  *						- TYT, 1992-01-01
1365cee9645SThomas Gleixner  *
1375cee9645SThomas Gleixner  * The best thing to do is to keep the CMOS clock in universal time (UTC)
1385cee9645SThomas Gleixner  * as real UNIX machines always do it. This avoids all headaches about
1395cee9645SThomas Gleixner  * daylight saving times and warping kernel clocks.
1405cee9645SThomas Gleixner  */
1415cee9645SThomas Gleixner static inline void warp_clock(void)
1425cee9645SThomas Gleixner {
1435cee9645SThomas Gleixner 	if (sys_tz.tz_minuteswest != 0) {
1445cee9645SThomas Gleixner 		struct timespec adjust;
1455cee9645SThomas Gleixner 
1465cee9645SThomas Gleixner 		persistent_clock_is_local = 1;
1475cee9645SThomas Gleixner 		adjust.tv_sec = sys_tz.tz_minuteswest * 60;
1485cee9645SThomas Gleixner 		adjust.tv_nsec = 0;
1495cee9645SThomas Gleixner 		timekeeping_inject_offset(&adjust);
1505cee9645SThomas Gleixner 	}
1515cee9645SThomas Gleixner }
1525cee9645SThomas Gleixner 
1535cee9645SThomas Gleixner /*
1545cee9645SThomas Gleixner  * In case for some reason the CMOS clock has not already been running
1555cee9645SThomas Gleixner  * in UTC, but in some local time: The first time we set the timezone,
1565cee9645SThomas Gleixner  * we will warp the clock so that it is ticking UTC time instead of
1575cee9645SThomas Gleixner  * local time. Presumably, if someone is setting the timezone then we
1585cee9645SThomas Gleixner  * are running in an environment where the programs understand about
1595cee9645SThomas Gleixner  * timezones. This should be done at boot time in the /etc/rc script,
1605cee9645SThomas Gleixner  * as soon as possible, so that the clock can be set right. Otherwise,
1615cee9645SThomas Gleixner  * various programs will get confused when the clock gets warped.
1625cee9645SThomas Gleixner  */
1635cee9645SThomas Gleixner 
16486d34732SBaolin Wang int do_sys_settimeofday64(const struct timespec64 *tv, const struct timezone *tz)
1655cee9645SThomas Gleixner {
1665cee9645SThomas Gleixner 	static int firsttime = 1;
1675cee9645SThomas Gleixner 	int error = 0;
1685cee9645SThomas Gleixner 
16986d34732SBaolin Wang 	if (tv && !timespec64_valid(tv))
1705cee9645SThomas Gleixner 		return -EINVAL;
1715cee9645SThomas Gleixner 
17286d34732SBaolin Wang 	error = security_settime64(tv, tz);
1735cee9645SThomas Gleixner 	if (error)
1745cee9645SThomas Gleixner 		return error;
1755cee9645SThomas Gleixner 
1765cee9645SThomas Gleixner 	if (tz) {
1776f7d7984SSasha Levin 		/* Verify we're witin the +-15 hrs range */
1786f7d7984SSasha Levin 		if (tz->tz_minuteswest > 15*60 || tz->tz_minuteswest < -15*60)
1796f7d7984SSasha Levin 			return -EINVAL;
1806f7d7984SSasha Levin 
1815cee9645SThomas Gleixner 		sys_tz = *tz;
1825cee9645SThomas Gleixner 		update_vsyscall_tz();
1835cee9645SThomas Gleixner 		if (firsttime) {
1845cee9645SThomas Gleixner 			firsttime = 0;
1855cee9645SThomas Gleixner 			if (!tv)
1865cee9645SThomas Gleixner 				warp_clock();
1875cee9645SThomas Gleixner 		}
1885cee9645SThomas Gleixner 	}
1895cee9645SThomas Gleixner 	if (tv)
19086d34732SBaolin Wang 		return do_settimeofday64(tv);
1915cee9645SThomas Gleixner 	return 0;
1925cee9645SThomas Gleixner }
1935cee9645SThomas Gleixner 
1945cee9645SThomas Gleixner SYSCALL_DEFINE2(settimeofday, struct timeval __user *, tv,
1955cee9645SThomas Gleixner 		struct timezone __user *, tz)
1965cee9645SThomas Gleixner {
1972ac00f17SDeepa Dinamani 	struct timespec64 new_ts;
1985cee9645SThomas Gleixner 	struct timeval user_tv;
1995cee9645SThomas Gleixner 	struct timezone new_tz;
2005cee9645SThomas Gleixner 
2015cee9645SThomas Gleixner 	if (tv) {
2025cee9645SThomas Gleixner 		if (copy_from_user(&user_tv, tv, sizeof(*tv)))
2035cee9645SThomas Gleixner 			return -EFAULT;
2046ada1fc0SSasha Levin 
2056ada1fc0SSasha Levin 		if (!timeval_valid(&user_tv))
2066ada1fc0SSasha Levin 			return -EINVAL;
2076ada1fc0SSasha Levin 
2085cee9645SThomas Gleixner 		new_ts.tv_sec = user_tv.tv_sec;
2095cee9645SThomas Gleixner 		new_ts.tv_nsec = user_tv.tv_usec * NSEC_PER_USEC;
2105cee9645SThomas Gleixner 	}
2115cee9645SThomas Gleixner 	if (tz) {
2125cee9645SThomas Gleixner 		if (copy_from_user(&new_tz, tz, sizeof(*tz)))
2135cee9645SThomas Gleixner 			return -EFAULT;
2145cee9645SThomas Gleixner 	}
2155cee9645SThomas Gleixner 
2162ac00f17SDeepa Dinamani 	return do_sys_settimeofday64(tv ? &new_ts : NULL, tz ? &new_tz : NULL);
2175cee9645SThomas Gleixner }
2185cee9645SThomas Gleixner 
2195cee9645SThomas Gleixner SYSCALL_DEFINE1(adjtimex, struct timex __user *, txc_p)
2205cee9645SThomas Gleixner {
2215cee9645SThomas Gleixner 	struct timex txc;		/* Local copy of parameter */
2225cee9645SThomas Gleixner 	int ret;
2235cee9645SThomas Gleixner 
2245cee9645SThomas Gleixner 	/* Copy the user data space into the kernel copy
2255cee9645SThomas Gleixner 	 * structure. But bear in mind that the structures
2265cee9645SThomas Gleixner 	 * may change
2275cee9645SThomas Gleixner 	 */
2285cee9645SThomas Gleixner 	if (copy_from_user(&txc, txc_p, sizeof(struct timex)))
2295cee9645SThomas Gleixner 		return -EFAULT;
2305cee9645SThomas Gleixner 	ret = do_adjtimex(&txc);
2315cee9645SThomas Gleixner 	return copy_to_user(txc_p, &txc, sizeof(struct timex)) ? -EFAULT : ret;
2325cee9645SThomas Gleixner }
2335cee9645SThomas Gleixner 
2343a4d44b6SAl Viro #ifdef CONFIG_COMPAT
2353a4d44b6SAl Viro 
2363a4d44b6SAl Viro COMPAT_SYSCALL_DEFINE1(adjtimex, struct compat_timex __user *, utp)
2373a4d44b6SAl Viro {
2383a4d44b6SAl Viro 	struct timex txc;
2393a4d44b6SAl Viro 	int err, ret;
2403a4d44b6SAl Viro 
2413a4d44b6SAl Viro 	err = compat_get_timex(&txc, utp);
2423a4d44b6SAl Viro 	if (err)
2433a4d44b6SAl Viro 		return err;
2443a4d44b6SAl Viro 
2453a4d44b6SAl Viro 	ret = do_adjtimex(&txc);
2463a4d44b6SAl Viro 
2473a4d44b6SAl Viro 	err = compat_put_timex(utp, &txc);
2483a4d44b6SAl Viro 	if (err)
2493a4d44b6SAl Viro 		return err;
2503a4d44b6SAl Viro 
2513a4d44b6SAl Viro 	return ret;
2523a4d44b6SAl Viro }
2533a4d44b6SAl Viro #endif
2543a4d44b6SAl Viro 
2555cee9645SThomas Gleixner /*
2565cee9645SThomas Gleixner  * Convert jiffies to milliseconds and back.
2575cee9645SThomas Gleixner  *
2585cee9645SThomas Gleixner  * Avoid unnecessary multiplications/divisions in the
2595cee9645SThomas Gleixner  * two most common HZ cases:
2605cee9645SThomas Gleixner  */
2615cee9645SThomas Gleixner unsigned int jiffies_to_msecs(const unsigned long j)
2625cee9645SThomas Gleixner {
2635cee9645SThomas Gleixner #if HZ <= MSEC_PER_SEC && !(MSEC_PER_SEC % HZ)
2645cee9645SThomas Gleixner 	return (MSEC_PER_SEC / HZ) * j;
2655cee9645SThomas Gleixner #elif HZ > MSEC_PER_SEC && !(HZ % MSEC_PER_SEC)
2665cee9645SThomas Gleixner 	return (j + (HZ / MSEC_PER_SEC) - 1)/(HZ / MSEC_PER_SEC);
2675cee9645SThomas Gleixner #else
2685cee9645SThomas Gleixner # if BITS_PER_LONG == 32
2695cee9645SThomas Gleixner 	return (HZ_TO_MSEC_MUL32 * j) >> HZ_TO_MSEC_SHR32;
2705cee9645SThomas Gleixner # else
2715cee9645SThomas Gleixner 	return (j * HZ_TO_MSEC_NUM) / HZ_TO_MSEC_DEN;
2725cee9645SThomas Gleixner # endif
2735cee9645SThomas Gleixner #endif
2745cee9645SThomas Gleixner }
2755cee9645SThomas Gleixner EXPORT_SYMBOL(jiffies_to_msecs);
2765cee9645SThomas Gleixner 
2775cee9645SThomas Gleixner unsigned int jiffies_to_usecs(const unsigned long j)
2785cee9645SThomas Gleixner {
279e0758676SFrederic Weisbecker 	/*
280e0758676SFrederic Weisbecker 	 * Hz usually doesn't go much further MSEC_PER_SEC.
281e0758676SFrederic Weisbecker 	 * jiffies_to_usecs() and usecs_to_jiffies() depend on that.
282e0758676SFrederic Weisbecker 	 */
283e0758676SFrederic Weisbecker 	BUILD_BUG_ON(HZ > USEC_PER_SEC);
284e0758676SFrederic Weisbecker 
285e0758676SFrederic Weisbecker #if !(USEC_PER_SEC % HZ)
2865cee9645SThomas Gleixner 	return (USEC_PER_SEC / HZ) * j;
2875cee9645SThomas Gleixner #else
2885cee9645SThomas Gleixner # if BITS_PER_LONG == 32
2895cee9645SThomas Gleixner 	return (HZ_TO_USEC_MUL32 * j) >> HZ_TO_USEC_SHR32;
2905cee9645SThomas Gleixner # else
2915cee9645SThomas Gleixner 	return (j * HZ_TO_USEC_NUM) / HZ_TO_USEC_DEN;
2925cee9645SThomas Gleixner # endif
2935cee9645SThomas Gleixner #endif
2945cee9645SThomas Gleixner }
2955cee9645SThomas Gleixner EXPORT_SYMBOL(jiffies_to_usecs);
2965cee9645SThomas Gleixner 
2975cee9645SThomas Gleixner /**
2985cee9645SThomas Gleixner  * timespec_trunc - Truncate timespec to a granularity
2995cee9645SThomas Gleixner  * @t: Timespec
3005cee9645SThomas Gleixner  * @gran: Granularity in ns.
3015cee9645SThomas Gleixner  *
302de4a95faSKarsten Blees  * Truncate a timespec to a granularity. Always rounds down. gran must
303de4a95faSKarsten Blees  * not be 0 nor greater than a second (NSEC_PER_SEC, or 10^9 ns).
3045cee9645SThomas Gleixner  */
3055cee9645SThomas Gleixner struct timespec timespec_trunc(struct timespec t, unsigned gran)
3065cee9645SThomas Gleixner {
307de4a95faSKarsten Blees 	/* Avoid division in the common cases 1 ns and 1 s. */
308de4a95faSKarsten Blees 	if (gran == 1) {
3095cee9645SThomas Gleixner 		/* nothing */
310de4a95faSKarsten Blees 	} else if (gran == NSEC_PER_SEC) {
3115cee9645SThomas Gleixner 		t.tv_nsec = 0;
312de4a95faSKarsten Blees 	} else if (gran > 1 && gran < NSEC_PER_SEC) {
3135cee9645SThomas Gleixner 		t.tv_nsec -= t.tv_nsec % gran;
314de4a95faSKarsten Blees 	} else {
315de4a95faSKarsten Blees 		WARN(1, "illegal file time granularity: %u", gran);
3165cee9645SThomas Gleixner 	}
3175cee9645SThomas Gleixner 	return t;
3185cee9645SThomas Gleixner }
3195cee9645SThomas Gleixner EXPORT_SYMBOL(timespec_trunc);
3205cee9645SThomas Gleixner 
32190b6ce9cSpang.xunlei /*
32290b6ce9cSpang.xunlei  * mktime64 - Converts date to seconds.
32390b6ce9cSpang.xunlei  * Converts Gregorian date to seconds since 1970-01-01 00:00:00.
3245cee9645SThomas Gleixner  * Assumes input in normal date format, i.e. 1980-12-31 23:59:59
3255cee9645SThomas Gleixner  * => year=1980, mon=12, day=31, hour=23, min=59, sec=59.
3265cee9645SThomas Gleixner  *
3275cee9645SThomas Gleixner  * [For the Julian calendar (which was used in Russia before 1917,
3285cee9645SThomas Gleixner  * Britain & colonies before 1752, anywhere else before 1582,
3295cee9645SThomas Gleixner  * and is still in use by some communities) leave out the
3305cee9645SThomas Gleixner  * -year/100+year/400 terms, and add 10.]
3315cee9645SThomas Gleixner  *
3325cee9645SThomas Gleixner  * This algorithm was first published by Gauss (I think).
333ede5147dSDavid Howells  *
334ede5147dSDavid Howells  * A leap second can be indicated by calling this function with sec as
335ede5147dSDavid Howells  * 60 (allowable under ISO 8601).  The leap second is treated the same
336ede5147dSDavid Howells  * as the following second since they don't exist in UNIX time.
337ede5147dSDavid Howells  *
338ede5147dSDavid Howells  * An encoding of midnight at the end of the day as 24:00:00 - ie. midnight
339ede5147dSDavid Howells  * tomorrow - (allowable under ISO 8601) is supported.
3405cee9645SThomas Gleixner  */
34190b6ce9cSpang.xunlei time64_t mktime64(const unsigned int year0, const unsigned int mon0,
3425cee9645SThomas Gleixner 		const unsigned int day, const unsigned int hour,
3435cee9645SThomas Gleixner 		const unsigned int min, const unsigned int sec)
3445cee9645SThomas Gleixner {
3455cee9645SThomas Gleixner 	unsigned int mon = mon0, year = year0;
3465cee9645SThomas Gleixner 
3475cee9645SThomas Gleixner 	/* 1..12 -> 11,12,1..10 */
3485cee9645SThomas Gleixner 	if (0 >= (int) (mon -= 2)) {
3495cee9645SThomas Gleixner 		mon += 12;	/* Puts Feb last since it has leap day */
3505cee9645SThomas Gleixner 		year -= 1;
3515cee9645SThomas Gleixner 	}
3525cee9645SThomas Gleixner 
35390b6ce9cSpang.xunlei 	return ((((time64_t)
3545cee9645SThomas Gleixner 		  (year/4 - year/100 + year/400 + 367*mon/12 + day) +
3555cee9645SThomas Gleixner 		  year*365 - 719499
356ede5147dSDavid Howells 	    )*24 + hour /* now have hours - midnight tomorrow handled here */
3575cee9645SThomas Gleixner 	  )*60 + min /* now have minutes */
3585cee9645SThomas Gleixner 	)*60 + sec; /* finally seconds */
3595cee9645SThomas Gleixner }
36090b6ce9cSpang.xunlei EXPORT_SYMBOL(mktime64);
3615cee9645SThomas Gleixner 
3625cee9645SThomas Gleixner /**
3635cee9645SThomas Gleixner  * set_normalized_timespec - set timespec sec and nsec parts and normalize
3645cee9645SThomas Gleixner  *
3655cee9645SThomas Gleixner  * @ts:		pointer to timespec variable to be set
3665cee9645SThomas Gleixner  * @sec:	seconds to set
3675cee9645SThomas Gleixner  * @nsec:	nanoseconds to set
3685cee9645SThomas Gleixner  *
3695cee9645SThomas Gleixner  * Set seconds and nanoseconds field of a timespec variable and
3705cee9645SThomas Gleixner  * normalize to the timespec storage format
3715cee9645SThomas Gleixner  *
3725cee9645SThomas Gleixner  * Note: The tv_nsec part is always in the range of
3735cee9645SThomas Gleixner  *	0 <= tv_nsec < NSEC_PER_SEC
3745cee9645SThomas Gleixner  * For negative values only the tv_sec field is negative !
3755cee9645SThomas Gleixner  */
3765cee9645SThomas Gleixner void set_normalized_timespec(struct timespec *ts, time_t sec, s64 nsec)
3775cee9645SThomas Gleixner {
3785cee9645SThomas Gleixner 	while (nsec >= NSEC_PER_SEC) {
3795cee9645SThomas Gleixner 		/*
3805cee9645SThomas Gleixner 		 * The following asm() prevents the compiler from
3815cee9645SThomas Gleixner 		 * optimising this loop into a modulo operation. See
3825cee9645SThomas Gleixner 		 * also __iter_div_u64_rem() in include/linux/time.h
3835cee9645SThomas Gleixner 		 */
3845cee9645SThomas Gleixner 		asm("" : "+rm"(nsec));
3855cee9645SThomas Gleixner 		nsec -= NSEC_PER_SEC;
3865cee9645SThomas Gleixner 		++sec;
3875cee9645SThomas Gleixner 	}
3885cee9645SThomas Gleixner 	while (nsec < 0) {
3895cee9645SThomas Gleixner 		asm("" : "+rm"(nsec));
3905cee9645SThomas Gleixner 		nsec += NSEC_PER_SEC;
3915cee9645SThomas Gleixner 		--sec;
3925cee9645SThomas Gleixner 	}
3935cee9645SThomas Gleixner 	ts->tv_sec = sec;
3945cee9645SThomas Gleixner 	ts->tv_nsec = nsec;
3955cee9645SThomas Gleixner }
3965cee9645SThomas Gleixner EXPORT_SYMBOL(set_normalized_timespec);
3975cee9645SThomas Gleixner 
3985cee9645SThomas Gleixner /**
3995cee9645SThomas Gleixner  * ns_to_timespec - Convert nanoseconds to timespec
4005cee9645SThomas Gleixner  * @nsec:       the nanoseconds value to be converted
4015cee9645SThomas Gleixner  *
4025cee9645SThomas Gleixner  * Returns the timespec representation of the nsec parameter.
4035cee9645SThomas Gleixner  */
4045cee9645SThomas Gleixner struct timespec ns_to_timespec(const s64 nsec)
4055cee9645SThomas Gleixner {
4065cee9645SThomas Gleixner 	struct timespec ts;
4075cee9645SThomas Gleixner 	s32 rem;
4085cee9645SThomas Gleixner 
4095cee9645SThomas Gleixner 	if (!nsec)
4105cee9645SThomas Gleixner 		return (struct timespec) {0, 0};
4115cee9645SThomas Gleixner 
4125cee9645SThomas Gleixner 	ts.tv_sec = div_s64_rem(nsec, NSEC_PER_SEC, &rem);
4135cee9645SThomas Gleixner 	if (unlikely(rem < 0)) {
4145cee9645SThomas Gleixner 		ts.tv_sec--;
4155cee9645SThomas Gleixner 		rem += NSEC_PER_SEC;
4165cee9645SThomas Gleixner 	}
4175cee9645SThomas Gleixner 	ts.tv_nsec = rem;
4185cee9645SThomas Gleixner 
4195cee9645SThomas Gleixner 	return ts;
4205cee9645SThomas Gleixner }
4215cee9645SThomas Gleixner EXPORT_SYMBOL(ns_to_timespec);
4225cee9645SThomas Gleixner 
4235cee9645SThomas Gleixner /**
4245cee9645SThomas Gleixner  * ns_to_timeval - Convert nanoseconds to timeval
4255cee9645SThomas Gleixner  * @nsec:       the nanoseconds value to be converted
4265cee9645SThomas Gleixner  *
4275cee9645SThomas Gleixner  * Returns the timeval representation of the nsec parameter.
4285cee9645SThomas Gleixner  */
4295cee9645SThomas Gleixner struct timeval ns_to_timeval(const s64 nsec)
4305cee9645SThomas Gleixner {
4315cee9645SThomas Gleixner 	struct timespec ts = ns_to_timespec(nsec);
4325cee9645SThomas Gleixner 	struct timeval tv;
4335cee9645SThomas Gleixner 
4345cee9645SThomas Gleixner 	tv.tv_sec = ts.tv_sec;
4355cee9645SThomas Gleixner 	tv.tv_usec = (suseconds_t) ts.tv_nsec / 1000;
4365cee9645SThomas Gleixner 
4375cee9645SThomas Gleixner 	return tv;
4385cee9645SThomas Gleixner }
4395cee9645SThomas Gleixner EXPORT_SYMBOL(ns_to_timeval);
4405cee9645SThomas Gleixner 
44149cd6f86SJohn Stultz #if BITS_PER_LONG == 32
44249cd6f86SJohn Stultz /**
44349cd6f86SJohn Stultz  * set_normalized_timespec - set timespec sec and nsec parts and normalize
44449cd6f86SJohn Stultz  *
44549cd6f86SJohn Stultz  * @ts:		pointer to timespec variable to be set
44649cd6f86SJohn Stultz  * @sec:	seconds to set
44749cd6f86SJohn Stultz  * @nsec:	nanoseconds to set
44849cd6f86SJohn Stultz  *
44949cd6f86SJohn Stultz  * Set seconds and nanoseconds field of a timespec variable and
45049cd6f86SJohn Stultz  * normalize to the timespec storage format
45149cd6f86SJohn Stultz  *
45249cd6f86SJohn Stultz  * Note: The tv_nsec part is always in the range of
45349cd6f86SJohn Stultz  *	0 <= tv_nsec < NSEC_PER_SEC
45449cd6f86SJohn Stultz  * For negative values only the tv_sec field is negative !
45549cd6f86SJohn Stultz  */
45649cd6f86SJohn Stultz void set_normalized_timespec64(struct timespec64 *ts, time64_t sec, s64 nsec)
45749cd6f86SJohn Stultz {
45849cd6f86SJohn Stultz 	while (nsec >= NSEC_PER_SEC) {
45949cd6f86SJohn Stultz 		/*
46049cd6f86SJohn Stultz 		 * The following asm() prevents the compiler from
46149cd6f86SJohn Stultz 		 * optimising this loop into a modulo operation. See
46249cd6f86SJohn Stultz 		 * also __iter_div_u64_rem() in include/linux/time.h
46349cd6f86SJohn Stultz 		 */
46449cd6f86SJohn Stultz 		asm("" : "+rm"(nsec));
46549cd6f86SJohn Stultz 		nsec -= NSEC_PER_SEC;
46649cd6f86SJohn Stultz 		++sec;
46749cd6f86SJohn Stultz 	}
46849cd6f86SJohn Stultz 	while (nsec < 0) {
46949cd6f86SJohn Stultz 		asm("" : "+rm"(nsec));
47049cd6f86SJohn Stultz 		nsec += NSEC_PER_SEC;
47149cd6f86SJohn Stultz 		--sec;
47249cd6f86SJohn Stultz 	}
47349cd6f86SJohn Stultz 	ts->tv_sec = sec;
47449cd6f86SJohn Stultz 	ts->tv_nsec = nsec;
47549cd6f86SJohn Stultz }
47649cd6f86SJohn Stultz EXPORT_SYMBOL(set_normalized_timespec64);
47749cd6f86SJohn Stultz 
47849cd6f86SJohn Stultz /**
47949cd6f86SJohn Stultz  * ns_to_timespec64 - Convert nanoseconds to timespec64
48049cd6f86SJohn Stultz  * @nsec:       the nanoseconds value to be converted
48149cd6f86SJohn Stultz  *
48249cd6f86SJohn Stultz  * Returns the timespec64 representation of the nsec parameter.
48349cd6f86SJohn Stultz  */
48449cd6f86SJohn Stultz struct timespec64 ns_to_timespec64(const s64 nsec)
48549cd6f86SJohn Stultz {
48649cd6f86SJohn Stultz 	struct timespec64 ts;
48749cd6f86SJohn Stultz 	s32 rem;
48849cd6f86SJohn Stultz 
48949cd6f86SJohn Stultz 	if (!nsec)
49049cd6f86SJohn Stultz 		return (struct timespec64) {0, 0};
49149cd6f86SJohn Stultz 
49249cd6f86SJohn Stultz 	ts.tv_sec = div_s64_rem(nsec, NSEC_PER_SEC, &rem);
49349cd6f86SJohn Stultz 	if (unlikely(rem < 0)) {
49449cd6f86SJohn Stultz 		ts.tv_sec--;
49549cd6f86SJohn Stultz 		rem += NSEC_PER_SEC;
49649cd6f86SJohn Stultz 	}
49749cd6f86SJohn Stultz 	ts.tv_nsec = rem;
49849cd6f86SJohn Stultz 
49949cd6f86SJohn Stultz 	return ts;
50049cd6f86SJohn Stultz }
50149cd6f86SJohn Stultz EXPORT_SYMBOL(ns_to_timespec64);
50249cd6f86SJohn Stultz #endif
503ca42aaf0SNicholas Mc Guire /**
504ca42aaf0SNicholas Mc Guire  * msecs_to_jiffies: - convert milliseconds to jiffies
505ca42aaf0SNicholas Mc Guire  * @m:	time in milliseconds
506ca42aaf0SNicholas Mc Guire  *
507ca42aaf0SNicholas Mc Guire  * conversion is done as follows:
5085cee9645SThomas Gleixner  *
5095cee9645SThomas Gleixner  * - negative values mean 'infinite timeout' (MAX_JIFFY_OFFSET)
5105cee9645SThomas Gleixner  *
5115cee9645SThomas Gleixner  * - 'too large' values [that would result in larger than
5125cee9645SThomas Gleixner  *   MAX_JIFFY_OFFSET values] mean 'infinite timeout' too.
5135cee9645SThomas Gleixner  *
5145cee9645SThomas Gleixner  * - all other values are converted to jiffies by either multiplying
515ca42aaf0SNicholas Mc Guire  *   the input value by a factor or dividing it with a factor and
516ca42aaf0SNicholas Mc Guire  *   handling any 32-bit overflows.
517ca42aaf0SNicholas Mc Guire  *   for the details see __msecs_to_jiffies()
5185cee9645SThomas Gleixner  *
519ca42aaf0SNicholas Mc Guire  * msecs_to_jiffies() checks for the passed in value being a constant
520ca42aaf0SNicholas Mc Guire  * via __builtin_constant_p() allowing gcc to eliminate most of the
521ca42aaf0SNicholas Mc Guire  * code, __msecs_to_jiffies() is called if the value passed does not
522ca42aaf0SNicholas Mc Guire  * allow constant folding and the actual conversion must be done at
523ca42aaf0SNicholas Mc Guire  * runtime.
524ca42aaf0SNicholas Mc Guire  * the _msecs_to_jiffies helpers are the HZ dependent conversion
525ca42aaf0SNicholas Mc Guire  * routines found in include/linux/jiffies.h
5265cee9645SThomas Gleixner  */
527ca42aaf0SNicholas Mc Guire unsigned long __msecs_to_jiffies(const unsigned int m)
5285cee9645SThomas Gleixner {
5295cee9645SThomas Gleixner 	/*
5305cee9645SThomas Gleixner 	 * Negative value, means infinite timeout:
5315cee9645SThomas Gleixner 	 */
5325cee9645SThomas Gleixner 	if ((int)m < 0)
5335cee9645SThomas Gleixner 		return MAX_JIFFY_OFFSET;
534ca42aaf0SNicholas Mc Guire 	return _msecs_to_jiffies(m);
5355cee9645SThomas Gleixner }
536ca42aaf0SNicholas Mc Guire EXPORT_SYMBOL(__msecs_to_jiffies);
5375cee9645SThomas Gleixner 
538ae60d6a0SNicholas Mc Guire unsigned long __usecs_to_jiffies(const unsigned int u)
5395cee9645SThomas Gleixner {
5405cee9645SThomas Gleixner 	if (u > jiffies_to_usecs(MAX_JIFFY_OFFSET))
5415cee9645SThomas Gleixner 		return MAX_JIFFY_OFFSET;
542ae60d6a0SNicholas Mc Guire 	return _usecs_to_jiffies(u);
5435cee9645SThomas Gleixner }
544ae60d6a0SNicholas Mc Guire EXPORT_SYMBOL(__usecs_to_jiffies);
5455cee9645SThomas Gleixner 
5465cee9645SThomas Gleixner /*
5475cee9645SThomas Gleixner  * The TICK_NSEC - 1 rounds up the value to the next resolution.  Note
5485cee9645SThomas Gleixner  * that a remainder subtract here would not do the right thing as the
5495cee9645SThomas Gleixner  * resolution values don't fall on second boundries.  I.e. the line:
5505cee9645SThomas Gleixner  * nsec -= nsec % TICK_NSEC; is NOT a correct resolution rounding.
551d78c9300SAndrew Hunter  * Note that due to the small error in the multiplier here, this
552d78c9300SAndrew Hunter  * rounding is incorrect for sufficiently large values of tv_nsec, but
553d78c9300SAndrew Hunter  * well formed timespecs should have tv_nsec < NSEC_PER_SEC, so we're
554d78c9300SAndrew Hunter  * OK.
5555cee9645SThomas Gleixner  *
5565cee9645SThomas Gleixner  * Rather, we just shift the bits off the right.
5575cee9645SThomas Gleixner  *
5585cee9645SThomas Gleixner  * The >> (NSEC_JIFFIE_SC - SEC_JIFFIE_SC) converts the scaled nsec
5595cee9645SThomas Gleixner  * value to a scaled second value.
5605cee9645SThomas Gleixner  */
561d78c9300SAndrew Hunter static unsigned long
5629ca30850SBaolin Wang __timespec64_to_jiffies(u64 sec, long nsec)
5635cee9645SThomas Gleixner {
564d78c9300SAndrew Hunter 	nsec = nsec + TICK_NSEC - 1;
5655cee9645SThomas Gleixner 
5665cee9645SThomas Gleixner 	if (sec >= MAX_SEC_IN_JIFFIES){
5675cee9645SThomas Gleixner 		sec = MAX_SEC_IN_JIFFIES;
5685cee9645SThomas Gleixner 		nsec = 0;
5695cee9645SThomas Gleixner 	}
5709ca30850SBaolin Wang 	return ((sec * SEC_CONVERSION) +
5715cee9645SThomas Gleixner 		(((u64)nsec * NSEC_CONVERSION) >>
5725cee9645SThomas Gleixner 		 (NSEC_JIFFIE_SC - SEC_JIFFIE_SC))) >> SEC_JIFFIE_SC;
5735cee9645SThomas Gleixner 
5745cee9645SThomas Gleixner }
575d78c9300SAndrew Hunter 
5769ca30850SBaolin Wang static unsigned long
5779ca30850SBaolin Wang __timespec_to_jiffies(unsigned long sec, long nsec)
578d78c9300SAndrew Hunter {
5799ca30850SBaolin Wang 	return __timespec64_to_jiffies((u64)sec, nsec);
580d78c9300SAndrew Hunter }
581d78c9300SAndrew Hunter 
5829ca30850SBaolin Wang unsigned long
5839ca30850SBaolin Wang timespec64_to_jiffies(const struct timespec64 *value)
5849ca30850SBaolin Wang {
5859ca30850SBaolin Wang 	return __timespec64_to_jiffies(value->tv_sec, value->tv_nsec);
5869ca30850SBaolin Wang }
5879ca30850SBaolin Wang EXPORT_SYMBOL(timespec64_to_jiffies);
5885cee9645SThomas Gleixner 
5895cee9645SThomas Gleixner void
5909ca30850SBaolin Wang jiffies_to_timespec64(const unsigned long jiffies, struct timespec64 *value)
5915cee9645SThomas Gleixner {
5925cee9645SThomas Gleixner 	/*
5935cee9645SThomas Gleixner 	 * Convert jiffies to nanoseconds and separate with
5945cee9645SThomas Gleixner 	 * one divide.
5955cee9645SThomas Gleixner 	 */
5965cee9645SThomas Gleixner 	u32 rem;
5975cee9645SThomas Gleixner 	value->tv_sec = div_u64_rem((u64)jiffies * TICK_NSEC,
5985cee9645SThomas Gleixner 				    NSEC_PER_SEC, &rem);
5995cee9645SThomas Gleixner 	value->tv_nsec = rem;
6005cee9645SThomas Gleixner }
6019ca30850SBaolin Wang EXPORT_SYMBOL(jiffies_to_timespec64);
6025cee9645SThomas Gleixner 
603d78c9300SAndrew Hunter /*
604d78c9300SAndrew Hunter  * We could use a similar algorithm to timespec_to_jiffies (with a
605d78c9300SAndrew Hunter  * different multiplier for usec instead of nsec). But this has a
606d78c9300SAndrew Hunter  * problem with rounding: we can't exactly add TICK_NSEC - 1 to the
607d78c9300SAndrew Hunter  * usec value, since it's not necessarily integral.
6085cee9645SThomas Gleixner  *
609d78c9300SAndrew Hunter  * We could instead round in the intermediate scaled representation
610d78c9300SAndrew Hunter  * (i.e. in units of 1/2^(large scale) jiffies) but that's also
611d78c9300SAndrew Hunter  * perilous: the scaling introduces a small positive error, which
612d78c9300SAndrew Hunter  * combined with a division-rounding-upward (i.e. adding 2^(scale) - 1
613d78c9300SAndrew Hunter  * units to the intermediate before shifting) leads to accidental
614d78c9300SAndrew Hunter  * overflow and overestimates.
615d78c9300SAndrew Hunter  *
616d78c9300SAndrew Hunter  * At the cost of one additional multiplication by a constant, just
617d78c9300SAndrew Hunter  * use the timespec implementation.
6185cee9645SThomas Gleixner  */
6195cee9645SThomas Gleixner unsigned long
6205cee9645SThomas Gleixner timeval_to_jiffies(const struct timeval *value)
6215cee9645SThomas Gleixner {
622d78c9300SAndrew Hunter 	return __timespec_to_jiffies(value->tv_sec,
623d78c9300SAndrew Hunter 				     value->tv_usec * NSEC_PER_USEC);
6245cee9645SThomas Gleixner }
6255cee9645SThomas Gleixner EXPORT_SYMBOL(timeval_to_jiffies);
6265cee9645SThomas Gleixner 
6275cee9645SThomas Gleixner void jiffies_to_timeval(const unsigned long jiffies, struct timeval *value)
6285cee9645SThomas Gleixner {
6295cee9645SThomas Gleixner 	/*
6305cee9645SThomas Gleixner 	 * Convert jiffies to nanoseconds and separate with
6315cee9645SThomas Gleixner 	 * one divide.
6325cee9645SThomas Gleixner 	 */
6335cee9645SThomas Gleixner 	u32 rem;
6345cee9645SThomas Gleixner 
6355cee9645SThomas Gleixner 	value->tv_sec = div_u64_rem((u64)jiffies * TICK_NSEC,
6365cee9645SThomas Gleixner 				    NSEC_PER_SEC, &rem);
6375cee9645SThomas Gleixner 	value->tv_usec = rem / NSEC_PER_USEC;
6385cee9645SThomas Gleixner }
6395cee9645SThomas Gleixner EXPORT_SYMBOL(jiffies_to_timeval);
6405cee9645SThomas Gleixner 
6415cee9645SThomas Gleixner /*
6425cee9645SThomas Gleixner  * Convert jiffies/jiffies_64 to clock_t and back.
6435cee9645SThomas Gleixner  */
6445cee9645SThomas Gleixner clock_t jiffies_to_clock_t(unsigned long x)
6455cee9645SThomas Gleixner {
6465cee9645SThomas Gleixner #if (TICK_NSEC % (NSEC_PER_SEC / USER_HZ)) == 0
6475cee9645SThomas Gleixner # if HZ < USER_HZ
6485cee9645SThomas Gleixner 	return x * (USER_HZ / HZ);
6495cee9645SThomas Gleixner # else
6505cee9645SThomas Gleixner 	return x / (HZ / USER_HZ);
6515cee9645SThomas Gleixner # endif
6525cee9645SThomas Gleixner #else
6535cee9645SThomas Gleixner 	return div_u64((u64)x * TICK_NSEC, NSEC_PER_SEC / USER_HZ);
6545cee9645SThomas Gleixner #endif
6555cee9645SThomas Gleixner }
6565cee9645SThomas Gleixner EXPORT_SYMBOL(jiffies_to_clock_t);
6575cee9645SThomas Gleixner 
6585cee9645SThomas Gleixner unsigned long clock_t_to_jiffies(unsigned long x)
6595cee9645SThomas Gleixner {
6605cee9645SThomas Gleixner #if (HZ % USER_HZ)==0
6615cee9645SThomas Gleixner 	if (x >= ~0UL / (HZ / USER_HZ))
6625cee9645SThomas Gleixner 		return ~0UL;
6635cee9645SThomas Gleixner 	return x * (HZ / USER_HZ);
6645cee9645SThomas Gleixner #else
6655cee9645SThomas Gleixner 	/* Don't worry about loss of precision here .. */
6665cee9645SThomas Gleixner 	if (x >= ~0UL / HZ * USER_HZ)
6675cee9645SThomas Gleixner 		return ~0UL;
6685cee9645SThomas Gleixner 
6695cee9645SThomas Gleixner 	/* .. but do try to contain it here */
6705cee9645SThomas Gleixner 	return div_u64((u64)x * HZ, USER_HZ);
6715cee9645SThomas Gleixner #endif
6725cee9645SThomas Gleixner }
6735cee9645SThomas Gleixner EXPORT_SYMBOL(clock_t_to_jiffies);
6745cee9645SThomas Gleixner 
6755cee9645SThomas Gleixner u64 jiffies_64_to_clock_t(u64 x)
6765cee9645SThomas Gleixner {
6775cee9645SThomas Gleixner #if (TICK_NSEC % (NSEC_PER_SEC / USER_HZ)) == 0
6785cee9645SThomas Gleixner # if HZ < USER_HZ
6795cee9645SThomas Gleixner 	x = div_u64(x * USER_HZ, HZ);
6805cee9645SThomas Gleixner # elif HZ > USER_HZ
6815cee9645SThomas Gleixner 	x = div_u64(x, HZ / USER_HZ);
6825cee9645SThomas Gleixner # else
6835cee9645SThomas Gleixner 	/* Nothing to do */
6845cee9645SThomas Gleixner # endif
6855cee9645SThomas Gleixner #else
6865cee9645SThomas Gleixner 	/*
6875cee9645SThomas Gleixner 	 * There are better ways that don't overflow early,
6885cee9645SThomas Gleixner 	 * but even this doesn't overflow in hundreds of years
6895cee9645SThomas Gleixner 	 * in 64 bits, so..
6905cee9645SThomas Gleixner 	 */
6915cee9645SThomas Gleixner 	x = div_u64(x * TICK_NSEC, (NSEC_PER_SEC / USER_HZ));
6925cee9645SThomas Gleixner #endif
6935cee9645SThomas Gleixner 	return x;
6945cee9645SThomas Gleixner }
6955cee9645SThomas Gleixner EXPORT_SYMBOL(jiffies_64_to_clock_t);
6965cee9645SThomas Gleixner 
6975cee9645SThomas Gleixner u64 nsec_to_clock_t(u64 x)
6985cee9645SThomas Gleixner {
6995cee9645SThomas Gleixner #if (NSEC_PER_SEC % USER_HZ) == 0
7005cee9645SThomas Gleixner 	return div_u64(x, NSEC_PER_SEC / USER_HZ);
7015cee9645SThomas Gleixner #elif (USER_HZ % 512) == 0
7025cee9645SThomas Gleixner 	return div_u64(x * USER_HZ / 512, NSEC_PER_SEC / 512);
7035cee9645SThomas Gleixner #else
7045cee9645SThomas Gleixner 	/*
7055cee9645SThomas Gleixner          * max relative error 5.7e-8 (1.8s per year) for USER_HZ <= 1024,
7065cee9645SThomas Gleixner          * overflow after 64.99 years.
7075cee9645SThomas Gleixner          * exact for HZ=60, 72, 90, 120, 144, 180, 300, 600, 900, ...
7085cee9645SThomas Gleixner          */
7095cee9645SThomas Gleixner 	return div_u64(x * 9, (9ull * NSEC_PER_SEC + (USER_HZ / 2)) / USER_HZ);
7105cee9645SThomas Gleixner #endif
7115cee9645SThomas Gleixner }
7125cee9645SThomas Gleixner 
71307e5f5e3SFrederic Weisbecker u64 jiffies64_to_nsecs(u64 j)
71407e5f5e3SFrederic Weisbecker {
71507e5f5e3SFrederic Weisbecker #if !(NSEC_PER_SEC % HZ)
71607e5f5e3SFrederic Weisbecker 	return (NSEC_PER_SEC / HZ) * j;
71707e5f5e3SFrederic Weisbecker # else
71807e5f5e3SFrederic Weisbecker 	return div_u64(j * HZ_TO_NSEC_NUM, HZ_TO_NSEC_DEN);
71907e5f5e3SFrederic Weisbecker #endif
72007e5f5e3SFrederic Weisbecker }
72107e5f5e3SFrederic Weisbecker EXPORT_SYMBOL(jiffies64_to_nsecs);
72207e5f5e3SFrederic Weisbecker 
7235cee9645SThomas Gleixner /**
7245cee9645SThomas Gleixner  * nsecs_to_jiffies64 - Convert nsecs in u64 to jiffies64
7255cee9645SThomas Gleixner  *
7265cee9645SThomas Gleixner  * @n:	nsecs in u64
7275cee9645SThomas Gleixner  *
7285cee9645SThomas Gleixner  * Unlike {m,u}secs_to_jiffies, type of input is not unsigned int but u64.
7295cee9645SThomas Gleixner  * And this doesn't return MAX_JIFFY_OFFSET since this function is designed
7305cee9645SThomas Gleixner  * for scheduler, not for use in device drivers to calculate timeout value.
7315cee9645SThomas Gleixner  *
7325cee9645SThomas Gleixner  * note:
7335cee9645SThomas Gleixner  *   NSEC_PER_SEC = 10^9 = (5^9 * 2^9) = (1953125 * 512)
7345cee9645SThomas Gleixner  *   ULLONG_MAX ns = 18446744073.709551615 secs = about 584 years
7355cee9645SThomas Gleixner  */
7365cee9645SThomas Gleixner u64 nsecs_to_jiffies64(u64 n)
7375cee9645SThomas Gleixner {
7385cee9645SThomas Gleixner #if (NSEC_PER_SEC % HZ) == 0
7395cee9645SThomas Gleixner 	/* Common case, HZ = 100, 128, 200, 250, 256, 500, 512, 1000 etc. */
7405cee9645SThomas Gleixner 	return div_u64(n, NSEC_PER_SEC / HZ);
7415cee9645SThomas Gleixner #elif (HZ % 512) == 0
7425cee9645SThomas Gleixner 	/* overflow after 292 years if HZ = 1024 */
7435cee9645SThomas Gleixner 	return div_u64(n * HZ / 512, NSEC_PER_SEC / 512);
7445cee9645SThomas Gleixner #else
7455cee9645SThomas Gleixner 	/*
7465cee9645SThomas Gleixner 	 * Generic case - optimized for cases where HZ is a multiple of 3.
7475cee9645SThomas Gleixner 	 * overflow after 64.99 years, exact for HZ = 60, 72, 90, 120 etc.
7485cee9645SThomas Gleixner 	 */
7495cee9645SThomas Gleixner 	return div_u64(n * 9, (9ull * NSEC_PER_SEC + HZ / 2) / HZ);
7505cee9645SThomas Gleixner #endif
7515cee9645SThomas Gleixner }
7527bd0e226SDaniel Vetter EXPORT_SYMBOL(nsecs_to_jiffies64);
7535cee9645SThomas Gleixner 
7545cee9645SThomas Gleixner /**
7555cee9645SThomas Gleixner  * nsecs_to_jiffies - Convert nsecs in u64 to jiffies
7565cee9645SThomas Gleixner  *
7575cee9645SThomas Gleixner  * @n:	nsecs in u64
7585cee9645SThomas Gleixner  *
7595cee9645SThomas Gleixner  * Unlike {m,u}secs_to_jiffies, type of input is not unsigned int but u64.
7605cee9645SThomas Gleixner  * And this doesn't return MAX_JIFFY_OFFSET since this function is designed
7615cee9645SThomas Gleixner  * for scheduler, not for use in device drivers to calculate timeout value.
7625cee9645SThomas Gleixner  *
7635cee9645SThomas Gleixner  * note:
7645cee9645SThomas Gleixner  *   NSEC_PER_SEC = 10^9 = (5^9 * 2^9) = (1953125 * 512)
7655cee9645SThomas Gleixner  *   ULLONG_MAX ns = 18446744073.709551615 secs = about 584 years
7665cee9645SThomas Gleixner  */
7675cee9645SThomas Gleixner unsigned long nsecs_to_jiffies(u64 n)
7685cee9645SThomas Gleixner {
7695cee9645SThomas Gleixner 	return (unsigned long)nsecs_to_jiffies64(n);
7705cee9645SThomas Gleixner }
771d560fed6SThomas Gleixner EXPORT_SYMBOL_GPL(nsecs_to_jiffies);
7725cee9645SThomas Gleixner 
7735cee9645SThomas Gleixner /*
7745cee9645SThomas Gleixner  * Add two timespec values and do a safety check for overflow.
7755cee9645SThomas Gleixner  * It's assumed that both values are valid (>= 0)
7765cee9645SThomas Gleixner  */
7775cee9645SThomas Gleixner struct timespec timespec_add_safe(const struct timespec lhs,
7785cee9645SThomas Gleixner 				  const struct timespec rhs)
7795cee9645SThomas Gleixner {
7805cee9645SThomas Gleixner 	struct timespec res;
7815cee9645SThomas Gleixner 
7825cee9645SThomas Gleixner 	set_normalized_timespec(&res, lhs.tv_sec + rhs.tv_sec,
7835cee9645SThomas Gleixner 				lhs.tv_nsec + rhs.tv_nsec);
7845cee9645SThomas Gleixner 
7855cee9645SThomas Gleixner 	if (res.tv_sec < lhs.tv_sec || res.tv_sec < rhs.tv_sec)
7865cee9645SThomas Gleixner 		res.tv_sec = TIME_T_MAX;
7875cee9645SThomas Gleixner 
7885cee9645SThomas Gleixner 	return res;
7895cee9645SThomas Gleixner }
790bc2c53e5SDeepa Dinamani 
791bc2c53e5SDeepa Dinamani /*
792bc2c53e5SDeepa Dinamani  * Add two timespec64 values and do a safety check for overflow.
793bc2c53e5SDeepa Dinamani  * It's assumed that both values are valid (>= 0).
794bc2c53e5SDeepa Dinamani  * And, each timespec64 is in normalized form.
795bc2c53e5SDeepa Dinamani  */
796bc2c53e5SDeepa Dinamani struct timespec64 timespec64_add_safe(const struct timespec64 lhs,
797bc2c53e5SDeepa Dinamani 				const struct timespec64 rhs)
798bc2c53e5SDeepa Dinamani {
799bc2c53e5SDeepa Dinamani 	struct timespec64 res;
800bc2c53e5SDeepa Dinamani 
801469e857fSVegard Nossum 	set_normalized_timespec64(&res, (timeu64_t) lhs.tv_sec + rhs.tv_sec,
802bc2c53e5SDeepa Dinamani 			lhs.tv_nsec + rhs.tv_nsec);
803bc2c53e5SDeepa Dinamani 
804bc2c53e5SDeepa Dinamani 	if (unlikely(res.tv_sec < lhs.tv_sec || res.tv_sec < rhs.tv_sec)) {
805bc2c53e5SDeepa Dinamani 		res.tv_sec = TIME64_MAX;
806bc2c53e5SDeepa Dinamani 		res.tv_nsec = 0;
807bc2c53e5SDeepa Dinamani 	}
808bc2c53e5SDeepa Dinamani 
809bc2c53e5SDeepa Dinamani 	return res;
810bc2c53e5SDeepa Dinamani }
811