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 103b180db2cSAl Viro #ifdef CONFIG_COMPAT 104b180db2cSAl Viro #ifdef __ARCH_WANT_COMPAT_SYS_TIME 105b180db2cSAl Viro 106b180db2cSAl Viro /* compat_time_t is a 32 bit "long" and needs to get converted. */ 107b180db2cSAl Viro COMPAT_SYSCALL_DEFINE1(time, compat_time_t __user *, tloc) 108b180db2cSAl Viro { 109b180db2cSAl Viro struct timeval tv; 110b180db2cSAl Viro compat_time_t i; 111b180db2cSAl Viro 112b180db2cSAl Viro do_gettimeofday(&tv); 113b180db2cSAl Viro i = tv.tv_sec; 114b180db2cSAl Viro 115b180db2cSAl Viro if (tloc) { 116b180db2cSAl Viro if (put_user(i,tloc)) 117b180db2cSAl Viro return -EFAULT; 118b180db2cSAl Viro } 119b180db2cSAl Viro force_successful_syscall_return(); 120b180db2cSAl Viro return i; 121b180db2cSAl Viro } 122b180db2cSAl Viro 123b180db2cSAl Viro COMPAT_SYSCALL_DEFINE1(stime, compat_time_t __user *, tptr) 124b180db2cSAl Viro { 125b180db2cSAl Viro struct timespec tv; 126b180db2cSAl Viro int err; 127b180db2cSAl Viro 128b180db2cSAl Viro if (get_user(tv.tv_sec, tptr)) 129b180db2cSAl Viro return -EFAULT; 130b180db2cSAl Viro 131b180db2cSAl Viro tv.tv_nsec = 0; 132b180db2cSAl Viro 133b180db2cSAl Viro err = security_settime(&tv, NULL); 134b180db2cSAl Viro if (err) 135b180db2cSAl Viro return err; 136b180db2cSAl Viro 137b180db2cSAl Viro do_settimeofday(&tv); 138b180db2cSAl Viro return 0; 139b180db2cSAl Viro } 140b180db2cSAl Viro 141b180db2cSAl Viro #endif /* __ARCH_WANT_COMPAT_SYS_TIME */ 142b180db2cSAl Viro #endif 143b180db2cSAl Viro 1445cee9645SThomas Gleixner SYSCALL_DEFINE2(gettimeofday, struct timeval __user *, tv, 1455cee9645SThomas Gleixner struct timezone __user *, tz) 1465cee9645SThomas Gleixner { 1475cee9645SThomas Gleixner if (likely(tv != NULL)) { 1485cee9645SThomas Gleixner struct timeval ktv; 1495cee9645SThomas Gleixner do_gettimeofday(&ktv); 1505cee9645SThomas Gleixner if (copy_to_user(tv, &ktv, sizeof(ktv))) 1515cee9645SThomas Gleixner return -EFAULT; 1525cee9645SThomas Gleixner } 1535cee9645SThomas Gleixner if (unlikely(tz != NULL)) { 1545cee9645SThomas Gleixner if (copy_to_user(tz, &sys_tz, sizeof(sys_tz))) 1555cee9645SThomas Gleixner return -EFAULT; 1565cee9645SThomas Gleixner } 1575cee9645SThomas Gleixner return 0; 1585cee9645SThomas Gleixner } 1595cee9645SThomas Gleixner 1605cee9645SThomas Gleixner /* 1615cee9645SThomas Gleixner * In case for some reason the CMOS clock has not already been running 1625cee9645SThomas Gleixner * in UTC, but in some local time: The first time we set the timezone, 1635cee9645SThomas Gleixner * we will warp the clock so that it is ticking UTC time instead of 1645cee9645SThomas Gleixner * local time. Presumably, if someone is setting the timezone then we 1655cee9645SThomas Gleixner * are running in an environment where the programs understand about 1665cee9645SThomas Gleixner * timezones. This should be done at boot time in the /etc/rc script, 1675cee9645SThomas Gleixner * as soon as possible, so that the clock can be set right. Otherwise, 1685cee9645SThomas Gleixner * various programs will get confused when the clock gets warped. 1695cee9645SThomas Gleixner */ 1705cee9645SThomas Gleixner 17186d34732SBaolin Wang int do_sys_settimeofday64(const struct timespec64 *tv, const struct timezone *tz) 1725cee9645SThomas Gleixner { 1735cee9645SThomas Gleixner static int firsttime = 1; 1745cee9645SThomas Gleixner int error = 0; 1755cee9645SThomas Gleixner 17686d34732SBaolin Wang if (tv && !timespec64_valid(tv)) 1775cee9645SThomas Gleixner return -EINVAL; 1785cee9645SThomas Gleixner 17986d34732SBaolin Wang error = security_settime64(tv, tz); 1805cee9645SThomas Gleixner if (error) 1815cee9645SThomas Gleixner return error; 1825cee9645SThomas Gleixner 1835cee9645SThomas Gleixner if (tz) { 1846f7d7984SSasha Levin /* Verify we're witin the +-15 hrs range */ 1856f7d7984SSasha Levin if (tz->tz_minuteswest > 15*60 || tz->tz_minuteswest < -15*60) 1866f7d7984SSasha Levin return -EINVAL; 1876f7d7984SSasha Levin 1885cee9645SThomas Gleixner sys_tz = *tz; 1895cee9645SThomas Gleixner update_vsyscall_tz(); 1905cee9645SThomas Gleixner if (firsttime) { 1915cee9645SThomas Gleixner firsttime = 0; 1925cee9645SThomas Gleixner if (!tv) 193e0956dccSArnd Bergmann timekeeping_warp_clock(); 1945cee9645SThomas Gleixner } 1955cee9645SThomas Gleixner } 1965cee9645SThomas Gleixner if (tv) 19786d34732SBaolin Wang return do_settimeofday64(tv); 1985cee9645SThomas Gleixner return 0; 1995cee9645SThomas Gleixner } 2005cee9645SThomas Gleixner 2015cee9645SThomas Gleixner SYSCALL_DEFINE2(settimeofday, struct timeval __user *, tv, 2025cee9645SThomas Gleixner struct timezone __user *, tz) 2035cee9645SThomas Gleixner { 2042ac00f17SDeepa Dinamani struct timespec64 new_ts; 2055cee9645SThomas Gleixner struct timeval user_tv; 2065cee9645SThomas Gleixner struct timezone new_tz; 2075cee9645SThomas Gleixner 2085cee9645SThomas Gleixner if (tv) { 2095cee9645SThomas Gleixner if (copy_from_user(&user_tv, tv, sizeof(*tv))) 2105cee9645SThomas Gleixner return -EFAULT; 2116ada1fc0SSasha Levin 2126ada1fc0SSasha Levin if (!timeval_valid(&user_tv)) 2136ada1fc0SSasha Levin return -EINVAL; 2146ada1fc0SSasha Levin 2155cee9645SThomas Gleixner new_ts.tv_sec = user_tv.tv_sec; 2165cee9645SThomas Gleixner new_ts.tv_nsec = user_tv.tv_usec * NSEC_PER_USEC; 2175cee9645SThomas Gleixner } 2185cee9645SThomas Gleixner if (tz) { 2195cee9645SThomas Gleixner if (copy_from_user(&new_tz, tz, sizeof(*tz))) 2205cee9645SThomas Gleixner return -EFAULT; 2215cee9645SThomas Gleixner } 2225cee9645SThomas Gleixner 2232ac00f17SDeepa Dinamani return do_sys_settimeofday64(tv ? &new_ts : NULL, tz ? &new_tz : NULL); 2245cee9645SThomas Gleixner } 2255cee9645SThomas Gleixner 2262b2d0285SAl Viro #ifdef CONFIG_COMPAT 2272b2d0285SAl Viro COMPAT_SYSCALL_DEFINE2(gettimeofday, struct compat_timeval __user *, tv, 2282b2d0285SAl Viro struct timezone __user *, tz) 2292b2d0285SAl Viro { 2302b2d0285SAl Viro if (tv) { 2312b2d0285SAl Viro struct timeval ktv; 2322b2d0285SAl Viro 2332b2d0285SAl Viro do_gettimeofday(&ktv); 2342b2d0285SAl Viro if (compat_put_timeval(&ktv, tv)) 2352b2d0285SAl Viro return -EFAULT; 2362b2d0285SAl Viro } 2372b2d0285SAl Viro if (tz) { 2382b2d0285SAl Viro if (copy_to_user(tz, &sys_tz, sizeof(sys_tz))) 2392b2d0285SAl Viro return -EFAULT; 2402b2d0285SAl Viro } 2412b2d0285SAl Viro 2422b2d0285SAl Viro return 0; 2432b2d0285SAl Viro } 2442b2d0285SAl Viro 2452b2d0285SAl Viro COMPAT_SYSCALL_DEFINE2(settimeofday, struct compat_timeval __user *, tv, 2462b2d0285SAl Viro struct timezone __user *, tz) 2472b2d0285SAl Viro { 2482b2d0285SAl Viro struct timespec64 new_ts; 2492b2d0285SAl Viro struct timeval user_tv; 2502b2d0285SAl Viro struct timezone new_tz; 2512b2d0285SAl Viro 2522b2d0285SAl Viro if (tv) { 2532b2d0285SAl Viro if (compat_get_timeval(&user_tv, tv)) 2542b2d0285SAl Viro return -EFAULT; 2552b2d0285SAl Viro new_ts.tv_sec = user_tv.tv_sec; 2562b2d0285SAl Viro new_ts.tv_nsec = user_tv.tv_usec * NSEC_PER_USEC; 2572b2d0285SAl Viro } 2582b2d0285SAl Viro if (tz) { 2592b2d0285SAl Viro if (copy_from_user(&new_tz, tz, sizeof(*tz))) 2602b2d0285SAl Viro return -EFAULT; 2612b2d0285SAl Viro } 2622b2d0285SAl Viro 2632b2d0285SAl Viro return do_sys_settimeofday64(tv ? &new_ts : NULL, tz ? &new_tz : NULL); 2642b2d0285SAl Viro } 2652b2d0285SAl Viro #endif 2662b2d0285SAl Viro 2675cee9645SThomas Gleixner SYSCALL_DEFINE1(adjtimex, struct timex __user *, txc_p) 2685cee9645SThomas Gleixner { 2695cee9645SThomas Gleixner struct timex txc; /* Local copy of parameter */ 2705cee9645SThomas Gleixner int ret; 2715cee9645SThomas Gleixner 2725cee9645SThomas Gleixner /* Copy the user data space into the kernel copy 2735cee9645SThomas Gleixner * structure. But bear in mind that the structures 2745cee9645SThomas Gleixner * may change 2755cee9645SThomas Gleixner */ 2765cee9645SThomas Gleixner if (copy_from_user(&txc, txc_p, sizeof(struct timex))) 2775cee9645SThomas Gleixner return -EFAULT; 2785cee9645SThomas Gleixner ret = do_adjtimex(&txc); 2795cee9645SThomas Gleixner return copy_to_user(txc_p, &txc, sizeof(struct timex)) ? -EFAULT : ret; 2805cee9645SThomas Gleixner } 2815cee9645SThomas Gleixner 2823a4d44b6SAl Viro #ifdef CONFIG_COMPAT 2833a4d44b6SAl Viro 2843a4d44b6SAl Viro COMPAT_SYSCALL_DEFINE1(adjtimex, struct compat_timex __user *, utp) 2853a4d44b6SAl Viro { 2863a4d44b6SAl Viro struct timex txc; 2873a4d44b6SAl Viro int err, ret; 2883a4d44b6SAl Viro 2893a4d44b6SAl Viro err = compat_get_timex(&txc, utp); 2903a4d44b6SAl Viro if (err) 2913a4d44b6SAl Viro return err; 2923a4d44b6SAl Viro 2933a4d44b6SAl Viro ret = do_adjtimex(&txc); 2943a4d44b6SAl Viro 2953a4d44b6SAl Viro err = compat_put_timex(utp, &txc); 2963a4d44b6SAl Viro if (err) 2973a4d44b6SAl Viro return err; 2983a4d44b6SAl Viro 2993a4d44b6SAl Viro return ret; 3003a4d44b6SAl Viro } 3013a4d44b6SAl Viro #endif 3023a4d44b6SAl Viro 3035cee9645SThomas Gleixner /* 3045cee9645SThomas Gleixner * Convert jiffies to milliseconds and back. 3055cee9645SThomas Gleixner * 3065cee9645SThomas Gleixner * Avoid unnecessary multiplications/divisions in the 3075cee9645SThomas Gleixner * two most common HZ cases: 3085cee9645SThomas Gleixner */ 3095cee9645SThomas Gleixner unsigned int jiffies_to_msecs(const unsigned long j) 3105cee9645SThomas Gleixner { 3115cee9645SThomas Gleixner #if HZ <= MSEC_PER_SEC && !(MSEC_PER_SEC % HZ) 3125cee9645SThomas Gleixner return (MSEC_PER_SEC / HZ) * j; 3135cee9645SThomas Gleixner #elif HZ > MSEC_PER_SEC && !(HZ % MSEC_PER_SEC) 3145cee9645SThomas Gleixner return (j + (HZ / MSEC_PER_SEC) - 1)/(HZ / MSEC_PER_SEC); 3155cee9645SThomas Gleixner #else 3165cee9645SThomas Gleixner # if BITS_PER_LONG == 32 3175cee9645SThomas Gleixner return (HZ_TO_MSEC_MUL32 * j) >> HZ_TO_MSEC_SHR32; 3185cee9645SThomas Gleixner # else 3195cee9645SThomas Gleixner return (j * HZ_TO_MSEC_NUM) / HZ_TO_MSEC_DEN; 3205cee9645SThomas Gleixner # endif 3215cee9645SThomas Gleixner #endif 3225cee9645SThomas Gleixner } 3235cee9645SThomas Gleixner EXPORT_SYMBOL(jiffies_to_msecs); 3245cee9645SThomas Gleixner 3255cee9645SThomas Gleixner unsigned int jiffies_to_usecs(const unsigned long j) 3265cee9645SThomas Gleixner { 327e0758676SFrederic Weisbecker /* 328e0758676SFrederic Weisbecker * Hz usually doesn't go much further MSEC_PER_SEC. 329e0758676SFrederic Weisbecker * jiffies_to_usecs() and usecs_to_jiffies() depend on that. 330e0758676SFrederic Weisbecker */ 331e0758676SFrederic Weisbecker BUILD_BUG_ON(HZ > USEC_PER_SEC); 332e0758676SFrederic Weisbecker 333e0758676SFrederic Weisbecker #if !(USEC_PER_SEC % HZ) 3345cee9645SThomas Gleixner return (USEC_PER_SEC / HZ) * j; 3355cee9645SThomas Gleixner #else 3365cee9645SThomas Gleixner # if BITS_PER_LONG == 32 3375cee9645SThomas Gleixner return (HZ_TO_USEC_MUL32 * j) >> HZ_TO_USEC_SHR32; 3385cee9645SThomas Gleixner # else 3395cee9645SThomas Gleixner return (j * HZ_TO_USEC_NUM) / HZ_TO_USEC_DEN; 3405cee9645SThomas Gleixner # endif 3415cee9645SThomas Gleixner #endif 3425cee9645SThomas Gleixner } 3435cee9645SThomas Gleixner EXPORT_SYMBOL(jiffies_to_usecs); 3445cee9645SThomas Gleixner 3455cee9645SThomas Gleixner /** 3465cee9645SThomas Gleixner * timespec_trunc - Truncate timespec to a granularity 3475cee9645SThomas Gleixner * @t: Timespec 3485cee9645SThomas Gleixner * @gran: Granularity in ns. 3495cee9645SThomas Gleixner * 350de4a95faSKarsten Blees * Truncate a timespec to a granularity. Always rounds down. gran must 351de4a95faSKarsten Blees * not be 0 nor greater than a second (NSEC_PER_SEC, or 10^9 ns). 3525cee9645SThomas Gleixner */ 3535cee9645SThomas Gleixner struct timespec timespec_trunc(struct timespec t, unsigned gran) 3545cee9645SThomas Gleixner { 355de4a95faSKarsten Blees /* Avoid division in the common cases 1 ns and 1 s. */ 356de4a95faSKarsten Blees if (gran == 1) { 3575cee9645SThomas Gleixner /* nothing */ 358de4a95faSKarsten Blees } else if (gran == NSEC_PER_SEC) { 3595cee9645SThomas Gleixner t.tv_nsec = 0; 360de4a95faSKarsten Blees } else if (gran > 1 && gran < NSEC_PER_SEC) { 3615cee9645SThomas Gleixner t.tv_nsec -= t.tv_nsec % gran; 362de4a95faSKarsten Blees } else { 363de4a95faSKarsten Blees WARN(1, "illegal file time granularity: %u", gran); 3645cee9645SThomas Gleixner } 3655cee9645SThomas Gleixner return t; 3665cee9645SThomas Gleixner } 3675cee9645SThomas Gleixner EXPORT_SYMBOL(timespec_trunc); 3685cee9645SThomas Gleixner 36990b6ce9cSpang.xunlei /* 37090b6ce9cSpang.xunlei * mktime64 - Converts date to seconds. 37190b6ce9cSpang.xunlei * Converts Gregorian date to seconds since 1970-01-01 00:00:00. 3725cee9645SThomas Gleixner * Assumes input in normal date format, i.e. 1980-12-31 23:59:59 3735cee9645SThomas Gleixner * => year=1980, mon=12, day=31, hour=23, min=59, sec=59. 3745cee9645SThomas Gleixner * 3755cee9645SThomas Gleixner * [For the Julian calendar (which was used in Russia before 1917, 3765cee9645SThomas Gleixner * Britain & colonies before 1752, anywhere else before 1582, 3775cee9645SThomas Gleixner * and is still in use by some communities) leave out the 3785cee9645SThomas Gleixner * -year/100+year/400 terms, and add 10.] 3795cee9645SThomas Gleixner * 3805cee9645SThomas Gleixner * This algorithm was first published by Gauss (I think). 381ede5147dSDavid Howells * 382ede5147dSDavid Howells * A leap second can be indicated by calling this function with sec as 383ede5147dSDavid Howells * 60 (allowable under ISO 8601). The leap second is treated the same 384ede5147dSDavid Howells * as the following second since they don't exist in UNIX time. 385ede5147dSDavid Howells * 386ede5147dSDavid Howells * An encoding of midnight at the end of the day as 24:00:00 - ie. midnight 387ede5147dSDavid Howells * tomorrow - (allowable under ISO 8601) is supported. 3885cee9645SThomas Gleixner */ 38990b6ce9cSpang.xunlei time64_t mktime64(const unsigned int year0, const unsigned int mon0, 3905cee9645SThomas Gleixner const unsigned int day, const unsigned int hour, 3915cee9645SThomas Gleixner const unsigned int min, const unsigned int sec) 3925cee9645SThomas Gleixner { 3935cee9645SThomas Gleixner unsigned int mon = mon0, year = year0; 3945cee9645SThomas Gleixner 3955cee9645SThomas Gleixner /* 1..12 -> 11,12,1..10 */ 3965cee9645SThomas Gleixner if (0 >= (int) (mon -= 2)) { 3975cee9645SThomas Gleixner mon += 12; /* Puts Feb last since it has leap day */ 3985cee9645SThomas Gleixner year -= 1; 3995cee9645SThomas Gleixner } 4005cee9645SThomas Gleixner 40190b6ce9cSpang.xunlei return ((((time64_t) 4025cee9645SThomas Gleixner (year/4 - year/100 + year/400 + 367*mon/12 + day) + 4035cee9645SThomas Gleixner year*365 - 719499 404ede5147dSDavid Howells )*24 + hour /* now have hours - midnight tomorrow handled here */ 4055cee9645SThomas Gleixner )*60 + min /* now have minutes */ 4065cee9645SThomas Gleixner )*60 + sec; /* finally seconds */ 4075cee9645SThomas Gleixner } 40890b6ce9cSpang.xunlei EXPORT_SYMBOL(mktime64); 4095cee9645SThomas Gleixner 410*abc8f96eSArnd Bergmann #if __BITS_PER_LONG == 32 4115cee9645SThomas Gleixner /** 4125cee9645SThomas Gleixner * set_normalized_timespec - set timespec sec and nsec parts and normalize 4135cee9645SThomas Gleixner * 4145cee9645SThomas Gleixner * @ts: pointer to timespec variable to be set 4155cee9645SThomas Gleixner * @sec: seconds to set 4165cee9645SThomas Gleixner * @nsec: nanoseconds to set 4175cee9645SThomas Gleixner * 4185cee9645SThomas Gleixner * Set seconds and nanoseconds field of a timespec variable and 4195cee9645SThomas Gleixner * normalize to the timespec storage format 4205cee9645SThomas Gleixner * 4215cee9645SThomas Gleixner * Note: The tv_nsec part is always in the range of 4225cee9645SThomas Gleixner * 0 <= tv_nsec < NSEC_PER_SEC 4235cee9645SThomas Gleixner * For negative values only the tv_sec field is negative ! 4245cee9645SThomas Gleixner */ 4255cee9645SThomas Gleixner void set_normalized_timespec(struct timespec *ts, time_t sec, s64 nsec) 4265cee9645SThomas Gleixner { 4275cee9645SThomas Gleixner while (nsec >= NSEC_PER_SEC) { 4285cee9645SThomas Gleixner /* 4295cee9645SThomas Gleixner * The following asm() prevents the compiler from 4305cee9645SThomas Gleixner * optimising this loop into a modulo operation. See 4315cee9645SThomas Gleixner * also __iter_div_u64_rem() in include/linux/time.h 4325cee9645SThomas Gleixner */ 4335cee9645SThomas Gleixner asm("" : "+rm"(nsec)); 4345cee9645SThomas Gleixner nsec -= NSEC_PER_SEC; 4355cee9645SThomas Gleixner ++sec; 4365cee9645SThomas Gleixner } 4375cee9645SThomas Gleixner while (nsec < 0) { 4385cee9645SThomas Gleixner asm("" : "+rm"(nsec)); 4395cee9645SThomas Gleixner nsec += NSEC_PER_SEC; 4405cee9645SThomas Gleixner --sec; 4415cee9645SThomas Gleixner } 4425cee9645SThomas Gleixner ts->tv_sec = sec; 4435cee9645SThomas Gleixner ts->tv_nsec = nsec; 4445cee9645SThomas Gleixner } 4455cee9645SThomas Gleixner EXPORT_SYMBOL(set_normalized_timespec); 4465cee9645SThomas Gleixner 4475cee9645SThomas Gleixner /** 4485cee9645SThomas Gleixner * ns_to_timespec - Convert nanoseconds to timespec 4495cee9645SThomas Gleixner * @nsec: the nanoseconds value to be converted 4505cee9645SThomas Gleixner * 4515cee9645SThomas Gleixner * Returns the timespec representation of the nsec parameter. 4525cee9645SThomas Gleixner */ 4535cee9645SThomas Gleixner struct timespec ns_to_timespec(const s64 nsec) 4545cee9645SThomas Gleixner { 4555cee9645SThomas Gleixner struct timespec ts; 4565cee9645SThomas Gleixner s32 rem; 4575cee9645SThomas Gleixner 4585cee9645SThomas Gleixner if (!nsec) 4595cee9645SThomas Gleixner return (struct timespec) {0, 0}; 4605cee9645SThomas Gleixner 4615cee9645SThomas Gleixner ts.tv_sec = div_s64_rem(nsec, NSEC_PER_SEC, &rem); 4625cee9645SThomas Gleixner if (unlikely(rem < 0)) { 4635cee9645SThomas Gleixner ts.tv_sec--; 4645cee9645SThomas Gleixner rem += NSEC_PER_SEC; 4655cee9645SThomas Gleixner } 4665cee9645SThomas Gleixner ts.tv_nsec = rem; 4675cee9645SThomas Gleixner 4685cee9645SThomas Gleixner return ts; 4695cee9645SThomas Gleixner } 4705cee9645SThomas Gleixner EXPORT_SYMBOL(ns_to_timespec); 471*abc8f96eSArnd Bergmann #endif 4725cee9645SThomas Gleixner 4735cee9645SThomas Gleixner /** 4745cee9645SThomas Gleixner * ns_to_timeval - Convert nanoseconds to timeval 4755cee9645SThomas Gleixner * @nsec: the nanoseconds value to be converted 4765cee9645SThomas Gleixner * 4775cee9645SThomas Gleixner * Returns the timeval representation of the nsec parameter. 4785cee9645SThomas Gleixner */ 4795cee9645SThomas Gleixner struct timeval ns_to_timeval(const s64 nsec) 4805cee9645SThomas Gleixner { 4815cee9645SThomas Gleixner struct timespec ts = ns_to_timespec(nsec); 4825cee9645SThomas Gleixner struct timeval tv; 4835cee9645SThomas Gleixner 4845cee9645SThomas Gleixner tv.tv_sec = ts.tv_sec; 4855cee9645SThomas Gleixner tv.tv_usec = (suseconds_t) ts.tv_nsec / 1000; 4865cee9645SThomas Gleixner 4875cee9645SThomas Gleixner return tv; 4885cee9645SThomas Gleixner } 4895cee9645SThomas Gleixner EXPORT_SYMBOL(ns_to_timeval); 4905cee9645SThomas Gleixner 49149cd6f86SJohn Stultz /** 49249cd6f86SJohn Stultz * set_normalized_timespec - set timespec sec and nsec parts and normalize 49349cd6f86SJohn Stultz * 49449cd6f86SJohn Stultz * @ts: pointer to timespec variable to be set 49549cd6f86SJohn Stultz * @sec: seconds to set 49649cd6f86SJohn Stultz * @nsec: nanoseconds to set 49749cd6f86SJohn Stultz * 49849cd6f86SJohn Stultz * Set seconds and nanoseconds field of a timespec variable and 49949cd6f86SJohn Stultz * normalize to the timespec storage format 50049cd6f86SJohn Stultz * 50149cd6f86SJohn Stultz * Note: The tv_nsec part is always in the range of 50249cd6f86SJohn Stultz * 0 <= tv_nsec < NSEC_PER_SEC 50349cd6f86SJohn Stultz * For negative values only the tv_sec field is negative ! 50449cd6f86SJohn Stultz */ 50549cd6f86SJohn Stultz void set_normalized_timespec64(struct timespec64 *ts, time64_t sec, s64 nsec) 50649cd6f86SJohn Stultz { 50749cd6f86SJohn Stultz while (nsec >= NSEC_PER_SEC) { 50849cd6f86SJohn Stultz /* 50949cd6f86SJohn Stultz * The following asm() prevents the compiler from 51049cd6f86SJohn Stultz * optimising this loop into a modulo operation. See 51149cd6f86SJohn Stultz * also __iter_div_u64_rem() in include/linux/time.h 51249cd6f86SJohn Stultz */ 51349cd6f86SJohn Stultz asm("" : "+rm"(nsec)); 51449cd6f86SJohn Stultz nsec -= NSEC_PER_SEC; 51549cd6f86SJohn Stultz ++sec; 51649cd6f86SJohn Stultz } 51749cd6f86SJohn Stultz while (nsec < 0) { 51849cd6f86SJohn Stultz asm("" : "+rm"(nsec)); 51949cd6f86SJohn Stultz nsec += NSEC_PER_SEC; 52049cd6f86SJohn Stultz --sec; 52149cd6f86SJohn Stultz } 52249cd6f86SJohn Stultz ts->tv_sec = sec; 52349cd6f86SJohn Stultz ts->tv_nsec = nsec; 52449cd6f86SJohn Stultz } 52549cd6f86SJohn Stultz EXPORT_SYMBOL(set_normalized_timespec64); 52649cd6f86SJohn Stultz 52749cd6f86SJohn Stultz /** 52849cd6f86SJohn Stultz * ns_to_timespec64 - Convert nanoseconds to timespec64 52949cd6f86SJohn Stultz * @nsec: the nanoseconds value to be converted 53049cd6f86SJohn Stultz * 53149cd6f86SJohn Stultz * Returns the timespec64 representation of the nsec parameter. 53249cd6f86SJohn Stultz */ 53349cd6f86SJohn Stultz struct timespec64 ns_to_timespec64(const s64 nsec) 53449cd6f86SJohn Stultz { 53549cd6f86SJohn Stultz struct timespec64 ts; 53649cd6f86SJohn Stultz s32 rem; 53749cd6f86SJohn Stultz 53849cd6f86SJohn Stultz if (!nsec) 53949cd6f86SJohn Stultz return (struct timespec64) {0, 0}; 54049cd6f86SJohn Stultz 54149cd6f86SJohn Stultz ts.tv_sec = div_s64_rem(nsec, NSEC_PER_SEC, &rem); 54249cd6f86SJohn Stultz if (unlikely(rem < 0)) { 54349cd6f86SJohn Stultz ts.tv_sec--; 54449cd6f86SJohn Stultz rem += NSEC_PER_SEC; 54549cd6f86SJohn Stultz } 54649cd6f86SJohn Stultz ts.tv_nsec = rem; 54749cd6f86SJohn Stultz 54849cd6f86SJohn Stultz return ts; 54949cd6f86SJohn Stultz } 55049cd6f86SJohn Stultz EXPORT_SYMBOL(ns_to_timespec64); 551*abc8f96eSArnd Bergmann 552ca42aaf0SNicholas Mc Guire /** 553ca42aaf0SNicholas Mc Guire * msecs_to_jiffies: - convert milliseconds to jiffies 554ca42aaf0SNicholas Mc Guire * @m: time in milliseconds 555ca42aaf0SNicholas Mc Guire * 556ca42aaf0SNicholas Mc Guire * conversion is done as follows: 5575cee9645SThomas Gleixner * 5585cee9645SThomas Gleixner * - negative values mean 'infinite timeout' (MAX_JIFFY_OFFSET) 5595cee9645SThomas Gleixner * 5605cee9645SThomas Gleixner * - 'too large' values [that would result in larger than 5615cee9645SThomas Gleixner * MAX_JIFFY_OFFSET values] mean 'infinite timeout' too. 5625cee9645SThomas Gleixner * 5635cee9645SThomas Gleixner * - all other values are converted to jiffies by either multiplying 564ca42aaf0SNicholas Mc Guire * the input value by a factor or dividing it with a factor and 565ca42aaf0SNicholas Mc Guire * handling any 32-bit overflows. 566ca42aaf0SNicholas Mc Guire * for the details see __msecs_to_jiffies() 5675cee9645SThomas Gleixner * 568ca42aaf0SNicholas Mc Guire * msecs_to_jiffies() checks for the passed in value being a constant 569ca42aaf0SNicholas Mc Guire * via __builtin_constant_p() allowing gcc to eliminate most of the 570ca42aaf0SNicholas Mc Guire * code, __msecs_to_jiffies() is called if the value passed does not 571ca42aaf0SNicholas Mc Guire * allow constant folding and the actual conversion must be done at 572ca42aaf0SNicholas Mc Guire * runtime. 573ca42aaf0SNicholas Mc Guire * the _msecs_to_jiffies helpers are the HZ dependent conversion 574ca42aaf0SNicholas Mc Guire * routines found in include/linux/jiffies.h 5755cee9645SThomas Gleixner */ 576ca42aaf0SNicholas Mc Guire unsigned long __msecs_to_jiffies(const unsigned int m) 5775cee9645SThomas Gleixner { 5785cee9645SThomas Gleixner /* 5795cee9645SThomas Gleixner * Negative value, means infinite timeout: 5805cee9645SThomas Gleixner */ 5815cee9645SThomas Gleixner if ((int)m < 0) 5825cee9645SThomas Gleixner return MAX_JIFFY_OFFSET; 583ca42aaf0SNicholas Mc Guire return _msecs_to_jiffies(m); 5845cee9645SThomas Gleixner } 585ca42aaf0SNicholas Mc Guire EXPORT_SYMBOL(__msecs_to_jiffies); 5865cee9645SThomas Gleixner 587ae60d6a0SNicholas Mc Guire unsigned long __usecs_to_jiffies(const unsigned int u) 5885cee9645SThomas Gleixner { 5895cee9645SThomas Gleixner if (u > jiffies_to_usecs(MAX_JIFFY_OFFSET)) 5905cee9645SThomas Gleixner return MAX_JIFFY_OFFSET; 591ae60d6a0SNicholas Mc Guire return _usecs_to_jiffies(u); 5925cee9645SThomas Gleixner } 593ae60d6a0SNicholas Mc Guire EXPORT_SYMBOL(__usecs_to_jiffies); 5945cee9645SThomas Gleixner 5955cee9645SThomas Gleixner /* 5965cee9645SThomas Gleixner * The TICK_NSEC - 1 rounds up the value to the next resolution. Note 5975cee9645SThomas Gleixner * that a remainder subtract here would not do the right thing as the 5985cee9645SThomas Gleixner * resolution values don't fall on second boundries. I.e. the line: 5995cee9645SThomas Gleixner * nsec -= nsec % TICK_NSEC; is NOT a correct resolution rounding. 600d78c9300SAndrew Hunter * Note that due to the small error in the multiplier here, this 601d78c9300SAndrew Hunter * rounding is incorrect for sufficiently large values of tv_nsec, but 602d78c9300SAndrew Hunter * well formed timespecs should have tv_nsec < NSEC_PER_SEC, so we're 603d78c9300SAndrew Hunter * OK. 6045cee9645SThomas Gleixner * 6055cee9645SThomas Gleixner * Rather, we just shift the bits off the right. 6065cee9645SThomas Gleixner * 6075cee9645SThomas Gleixner * The >> (NSEC_JIFFIE_SC - SEC_JIFFIE_SC) converts the scaled nsec 6085cee9645SThomas Gleixner * value to a scaled second value. 6095cee9645SThomas Gleixner */ 610d78c9300SAndrew Hunter static unsigned long 6119ca30850SBaolin Wang __timespec64_to_jiffies(u64 sec, long nsec) 6125cee9645SThomas Gleixner { 613d78c9300SAndrew Hunter nsec = nsec + TICK_NSEC - 1; 6145cee9645SThomas Gleixner 6155cee9645SThomas Gleixner if (sec >= MAX_SEC_IN_JIFFIES){ 6165cee9645SThomas Gleixner sec = MAX_SEC_IN_JIFFIES; 6175cee9645SThomas Gleixner nsec = 0; 6185cee9645SThomas Gleixner } 6199ca30850SBaolin Wang return ((sec * SEC_CONVERSION) + 6205cee9645SThomas Gleixner (((u64)nsec * NSEC_CONVERSION) >> 6215cee9645SThomas Gleixner (NSEC_JIFFIE_SC - SEC_JIFFIE_SC))) >> SEC_JIFFIE_SC; 6225cee9645SThomas Gleixner 6235cee9645SThomas Gleixner } 624d78c9300SAndrew Hunter 6259ca30850SBaolin Wang static unsigned long 6269ca30850SBaolin Wang __timespec_to_jiffies(unsigned long sec, long nsec) 627d78c9300SAndrew Hunter { 6289ca30850SBaolin Wang return __timespec64_to_jiffies((u64)sec, nsec); 629d78c9300SAndrew Hunter } 630d78c9300SAndrew Hunter 6319ca30850SBaolin Wang unsigned long 6329ca30850SBaolin Wang timespec64_to_jiffies(const struct timespec64 *value) 6339ca30850SBaolin Wang { 6349ca30850SBaolin Wang return __timespec64_to_jiffies(value->tv_sec, value->tv_nsec); 6359ca30850SBaolin Wang } 6369ca30850SBaolin Wang EXPORT_SYMBOL(timespec64_to_jiffies); 6375cee9645SThomas Gleixner 6385cee9645SThomas Gleixner void 6399ca30850SBaolin Wang jiffies_to_timespec64(const unsigned long jiffies, struct timespec64 *value) 6405cee9645SThomas Gleixner { 6415cee9645SThomas Gleixner /* 6425cee9645SThomas Gleixner * Convert jiffies to nanoseconds and separate with 6435cee9645SThomas Gleixner * one divide. 6445cee9645SThomas Gleixner */ 6455cee9645SThomas Gleixner u32 rem; 6465cee9645SThomas Gleixner value->tv_sec = div_u64_rem((u64)jiffies * TICK_NSEC, 6475cee9645SThomas Gleixner NSEC_PER_SEC, &rem); 6485cee9645SThomas Gleixner value->tv_nsec = rem; 6495cee9645SThomas Gleixner } 6509ca30850SBaolin Wang EXPORT_SYMBOL(jiffies_to_timespec64); 6515cee9645SThomas Gleixner 652d78c9300SAndrew Hunter /* 653d78c9300SAndrew Hunter * We could use a similar algorithm to timespec_to_jiffies (with a 654d78c9300SAndrew Hunter * different multiplier for usec instead of nsec). But this has a 655d78c9300SAndrew Hunter * problem with rounding: we can't exactly add TICK_NSEC - 1 to the 656d78c9300SAndrew Hunter * usec value, since it's not necessarily integral. 6575cee9645SThomas Gleixner * 658d78c9300SAndrew Hunter * We could instead round in the intermediate scaled representation 659d78c9300SAndrew Hunter * (i.e. in units of 1/2^(large scale) jiffies) but that's also 660d78c9300SAndrew Hunter * perilous: the scaling introduces a small positive error, which 661d78c9300SAndrew Hunter * combined with a division-rounding-upward (i.e. adding 2^(scale) - 1 662d78c9300SAndrew Hunter * units to the intermediate before shifting) leads to accidental 663d78c9300SAndrew Hunter * overflow and overestimates. 664d78c9300SAndrew Hunter * 665d78c9300SAndrew Hunter * At the cost of one additional multiplication by a constant, just 666d78c9300SAndrew Hunter * use the timespec implementation. 6675cee9645SThomas Gleixner */ 6685cee9645SThomas Gleixner unsigned long 6695cee9645SThomas Gleixner timeval_to_jiffies(const struct timeval *value) 6705cee9645SThomas Gleixner { 671d78c9300SAndrew Hunter return __timespec_to_jiffies(value->tv_sec, 672d78c9300SAndrew Hunter value->tv_usec * NSEC_PER_USEC); 6735cee9645SThomas Gleixner } 6745cee9645SThomas Gleixner EXPORT_SYMBOL(timeval_to_jiffies); 6755cee9645SThomas Gleixner 6765cee9645SThomas Gleixner void jiffies_to_timeval(const unsigned long jiffies, struct timeval *value) 6775cee9645SThomas Gleixner { 6785cee9645SThomas Gleixner /* 6795cee9645SThomas Gleixner * Convert jiffies to nanoseconds and separate with 6805cee9645SThomas Gleixner * one divide. 6815cee9645SThomas Gleixner */ 6825cee9645SThomas Gleixner u32 rem; 6835cee9645SThomas Gleixner 6845cee9645SThomas Gleixner value->tv_sec = div_u64_rem((u64)jiffies * TICK_NSEC, 6855cee9645SThomas Gleixner NSEC_PER_SEC, &rem); 6865cee9645SThomas Gleixner value->tv_usec = rem / NSEC_PER_USEC; 6875cee9645SThomas Gleixner } 6885cee9645SThomas Gleixner EXPORT_SYMBOL(jiffies_to_timeval); 6895cee9645SThomas Gleixner 6905cee9645SThomas Gleixner /* 6915cee9645SThomas Gleixner * Convert jiffies/jiffies_64 to clock_t and back. 6925cee9645SThomas Gleixner */ 6935cee9645SThomas Gleixner clock_t jiffies_to_clock_t(unsigned long x) 6945cee9645SThomas Gleixner { 6955cee9645SThomas Gleixner #if (TICK_NSEC % (NSEC_PER_SEC / USER_HZ)) == 0 6965cee9645SThomas Gleixner # if HZ < USER_HZ 6975cee9645SThomas Gleixner return x * (USER_HZ / HZ); 6985cee9645SThomas Gleixner # else 6995cee9645SThomas Gleixner return x / (HZ / USER_HZ); 7005cee9645SThomas Gleixner # endif 7015cee9645SThomas Gleixner #else 7025cee9645SThomas Gleixner return div_u64((u64)x * TICK_NSEC, NSEC_PER_SEC / USER_HZ); 7035cee9645SThomas Gleixner #endif 7045cee9645SThomas Gleixner } 7055cee9645SThomas Gleixner EXPORT_SYMBOL(jiffies_to_clock_t); 7065cee9645SThomas Gleixner 7075cee9645SThomas Gleixner unsigned long clock_t_to_jiffies(unsigned long x) 7085cee9645SThomas Gleixner { 7095cee9645SThomas Gleixner #if (HZ % USER_HZ)==0 7105cee9645SThomas Gleixner if (x >= ~0UL / (HZ / USER_HZ)) 7115cee9645SThomas Gleixner return ~0UL; 7125cee9645SThomas Gleixner return x * (HZ / USER_HZ); 7135cee9645SThomas Gleixner #else 7145cee9645SThomas Gleixner /* Don't worry about loss of precision here .. */ 7155cee9645SThomas Gleixner if (x >= ~0UL / HZ * USER_HZ) 7165cee9645SThomas Gleixner return ~0UL; 7175cee9645SThomas Gleixner 7185cee9645SThomas Gleixner /* .. but do try to contain it here */ 7195cee9645SThomas Gleixner return div_u64((u64)x * HZ, USER_HZ); 7205cee9645SThomas Gleixner #endif 7215cee9645SThomas Gleixner } 7225cee9645SThomas Gleixner EXPORT_SYMBOL(clock_t_to_jiffies); 7235cee9645SThomas Gleixner 7245cee9645SThomas Gleixner u64 jiffies_64_to_clock_t(u64 x) 7255cee9645SThomas Gleixner { 7265cee9645SThomas Gleixner #if (TICK_NSEC % (NSEC_PER_SEC / USER_HZ)) == 0 7275cee9645SThomas Gleixner # if HZ < USER_HZ 7285cee9645SThomas Gleixner x = div_u64(x * USER_HZ, HZ); 7295cee9645SThomas Gleixner # elif HZ > USER_HZ 7305cee9645SThomas Gleixner x = div_u64(x, HZ / USER_HZ); 7315cee9645SThomas Gleixner # else 7325cee9645SThomas Gleixner /* Nothing to do */ 7335cee9645SThomas Gleixner # endif 7345cee9645SThomas Gleixner #else 7355cee9645SThomas Gleixner /* 7365cee9645SThomas Gleixner * There are better ways that don't overflow early, 7375cee9645SThomas Gleixner * but even this doesn't overflow in hundreds of years 7385cee9645SThomas Gleixner * in 64 bits, so.. 7395cee9645SThomas Gleixner */ 7405cee9645SThomas Gleixner x = div_u64(x * TICK_NSEC, (NSEC_PER_SEC / USER_HZ)); 7415cee9645SThomas Gleixner #endif 7425cee9645SThomas Gleixner return x; 7435cee9645SThomas Gleixner } 7445cee9645SThomas Gleixner EXPORT_SYMBOL(jiffies_64_to_clock_t); 7455cee9645SThomas Gleixner 7465cee9645SThomas Gleixner u64 nsec_to_clock_t(u64 x) 7475cee9645SThomas Gleixner { 7485cee9645SThomas Gleixner #if (NSEC_PER_SEC % USER_HZ) == 0 7495cee9645SThomas Gleixner return div_u64(x, NSEC_PER_SEC / USER_HZ); 7505cee9645SThomas Gleixner #elif (USER_HZ % 512) == 0 7515cee9645SThomas Gleixner return div_u64(x * USER_HZ / 512, NSEC_PER_SEC / 512); 7525cee9645SThomas Gleixner #else 7535cee9645SThomas Gleixner /* 7545cee9645SThomas Gleixner * max relative error 5.7e-8 (1.8s per year) for USER_HZ <= 1024, 7555cee9645SThomas Gleixner * overflow after 64.99 years. 7565cee9645SThomas Gleixner * exact for HZ=60, 72, 90, 120, 144, 180, 300, 600, 900, ... 7575cee9645SThomas Gleixner */ 7585cee9645SThomas Gleixner return div_u64(x * 9, (9ull * NSEC_PER_SEC + (USER_HZ / 2)) / USER_HZ); 7595cee9645SThomas Gleixner #endif 7605cee9645SThomas Gleixner } 7615cee9645SThomas Gleixner 76207e5f5e3SFrederic Weisbecker u64 jiffies64_to_nsecs(u64 j) 76307e5f5e3SFrederic Weisbecker { 76407e5f5e3SFrederic Weisbecker #if !(NSEC_PER_SEC % HZ) 76507e5f5e3SFrederic Weisbecker return (NSEC_PER_SEC / HZ) * j; 76607e5f5e3SFrederic Weisbecker # else 76707e5f5e3SFrederic Weisbecker return div_u64(j * HZ_TO_NSEC_NUM, HZ_TO_NSEC_DEN); 76807e5f5e3SFrederic Weisbecker #endif 76907e5f5e3SFrederic Weisbecker } 77007e5f5e3SFrederic Weisbecker EXPORT_SYMBOL(jiffies64_to_nsecs); 77107e5f5e3SFrederic Weisbecker 7725cee9645SThomas Gleixner /** 7735cee9645SThomas Gleixner * nsecs_to_jiffies64 - Convert nsecs in u64 to jiffies64 7745cee9645SThomas Gleixner * 7755cee9645SThomas Gleixner * @n: nsecs in u64 7765cee9645SThomas Gleixner * 7775cee9645SThomas Gleixner * Unlike {m,u}secs_to_jiffies, type of input is not unsigned int but u64. 7785cee9645SThomas Gleixner * And this doesn't return MAX_JIFFY_OFFSET since this function is designed 7795cee9645SThomas Gleixner * for scheduler, not for use in device drivers to calculate timeout value. 7805cee9645SThomas Gleixner * 7815cee9645SThomas Gleixner * note: 7825cee9645SThomas Gleixner * NSEC_PER_SEC = 10^9 = (5^9 * 2^9) = (1953125 * 512) 7835cee9645SThomas Gleixner * ULLONG_MAX ns = 18446744073.709551615 secs = about 584 years 7845cee9645SThomas Gleixner */ 7855cee9645SThomas Gleixner u64 nsecs_to_jiffies64(u64 n) 7865cee9645SThomas Gleixner { 7875cee9645SThomas Gleixner #if (NSEC_PER_SEC % HZ) == 0 7885cee9645SThomas Gleixner /* Common case, HZ = 100, 128, 200, 250, 256, 500, 512, 1000 etc. */ 7895cee9645SThomas Gleixner return div_u64(n, NSEC_PER_SEC / HZ); 7905cee9645SThomas Gleixner #elif (HZ % 512) == 0 7915cee9645SThomas Gleixner /* overflow after 292 years if HZ = 1024 */ 7925cee9645SThomas Gleixner return div_u64(n * HZ / 512, NSEC_PER_SEC / 512); 7935cee9645SThomas Gleixner #else 7945cee9645SThomas Gleixner /* 7955cee9645SThomas Gleixner * Generic case - optimized for cases where HZ is a multiple of 3. 7965cee9645SThomas Gleixner * overflow after 64.99 years, exact for HZ = 60, 72, 90, 120 etc. 7975cee9645SThomas Gleixner */ 7985cee9645SThomas Gleixner return div_u64(n * 9, (9ull * NSEC_PER_SEC + HZ / 2) / HZ); 7995cee9645SThomas Gleixner #endif 8005cee9645SThomas Gleixner } 8017bd0e226SDaniel Vetter EXPORT_SYMBOL(nsecs_to_jiffies64); 8025cee9645SThomas Gleixner 8035cee9645SThomas Gleixner /** 8045cee9645SThomas Gleixner * nsecs_to_jiffies - Convert nsecs in u64 to jiffies 8055cee9645SThomas Gleixner * 8065cee9645SThomas Gleixner * @n: nsecs in u64 8075cee9645SThomas Gleixner * 8085cee9645SThomas Gleixner * Unlike {m,u}secs_to_jiffies, type of input is not unsigned int but u64. 8095cee9645SThomas Gleixner * And this doesn't return MAX_JIFFY_OFFSET since this function is designed 8105cee9645SThomas Gleixner * for scheduler, not for use in device drivers to calculate timeout value. 8115cee9645SThomas Gleixner * 8125cee9645SThomas Gleixner * note: 8135cee9645SThomas Gleixner * NSEC_PER_SEC = 10^9 = (5^9 * 2^9) = (1953125 * 512) 8145cee9645SThomas Gleixner * ULLONG_MAX ns = 18446744073.709551615 secs = about 584 years 8155cee9645SThomas Gleixner */ 8165cee9645SThomas Gleixner unsigned long nsecs_to_jiffies(u64 n) 8175cee9645SThomas Gleixner { 8185cee9645SThomas Gleixner return (unsigned long)nsecs_to_jiffies64(n); 8195cee9645SThomas Gleixner } 820d560fed6SThomas Gleixner EXPORT_SYMBOL_GPL(nsecs_to_jiffies); 8215cee9645SThomas Gleixner 8225cee9645SThomas Gleixner /* 823bc2c53e5SDeepa Dinamani * Add two timespec64 values and do a safety check for overflow. 824bc2c53e5SDeepa Dinamani * It's assumed that both values are valid (>= 0). 825bc2c53e5SDeepa Dinamani * And, each timespec64 is in normalized form. 826bc2c53e5SDeepa Dinamani */ 827bc2c53e5SDeepa Dinamani struct timespec64 timespec64_add_safe(const struct timespec64 lhs, 828bc2c53e5SDeepa Dinamani const struct timespec64 rhs) 829bc2c53e5SDeepa Dinamani { 830bc2c53e5SDeepa Dinamani struct timespec64 res; 831bc2c53e5SDeepa Dinamani 832469e857fSVegard Nossum set_normalized_timespec64(&res, (timeu64_t) lhs.tv_sec + rhs.tv_sec, 833bc2c53e5SDeepa Dinamani lhs.tv_nsec + rhs.tv_nsec); 834bc2c53e5SDeepa Dinamani 835bc2c53e5SDeepa Dinamani if (unlikely(res.tv_sec < lhs.tv_sec || res.tv_sec < rhs.tv_sec)) { 836bc2c53e5SDeepa Dinamani res.tv_sec = TIME64_MAX; 837bc2c53e5SDeepa Dinamani res.tv_nsec = 0; 838bc2c53e5SDeepa Dinamani } 839bc2c53e5SDeepa Dinamani 840bc2c53e5SDeepa Dinamani return res; 841bc2c53e5SDeepa Dinamani } 842f59dd9c8SDeepa Dinamani 843f59dd9c8SDeepa Dinamani int get_timespec64(struct timespec64 *ts, 844f59dd9c8SDeepa Dinamani const struct timespec __user *uts) 845f59dd9c8SDeepa Dinamani { 846f59dd9c8SDeepa Dinamani struct timespec kts; 847f59dd9c8SDeepa Dinamani int ret; 848f59dd9c8SDeepa Dinamani 849f59dd9c8SDeepa Dinamani ret = copy_from_user(&kts, uts, sizeof(kts)); 850f59dd9c8SDeepa Dinamani if (ret) 851f59dd9c8SDeepa Dinamani return -EFAULT; 852f59dd9c8SDeepa Dinamani 853f59dd9c8SDeepa Dinamani ts->tv_sec = kts.tv_sec; 854f59dd9c8SDeepa Dinamani ts->tv_nsec = kts.tv_nsec; 855f59dd9c8SDeepa Dinamani 856f59dd9c8SDeepa Dinamani return 0; 857f59dd9c8SDeepa Dinamani } 858f59dd9c8SDeepa Dinamani EXPORT_SYMBOL_GPL(get_timespec64); 859f59dd9c8SDeepa Dinamani 860f59dd9c8SDeepa Dinamani int put_timespec64(const struct timespec64 *ts, 861f59dd9c8SDeepa Dinamani struct timespec __user *uts) 862f59dd9c8SDeepa Dinamani { 863f59dd9c8SDeepa Dinamani struct timespec kts = { 864f59dd9c8SDeepa Dinamani .tv_sec = ts->tv_sec, 865f59dd9c8SDeepa Dinamani .tv_nsec = ts->tv_nsec 866f59dd9c8SDeepa Dinamani }; 867f59dd9c8SDeepa Dinamani return copy_to_user(uts, &kts, sizeof(kts)) ? -EFAULT : 0; 868f59dd9c8SDeepa Dinamani } 869f59dd9c8SDeepa Dinamani EXPORT_SYMBOL_GPL(put_timespec64); 870d5b7ffbfSDeepa Dinamani 871d5b7ffbfSDeepa Dinamani int get_itimerspec64(struct itimerspec64 *it, 872d5b7ffbfSDeepa Dinamani const struct itimerspec __user *uit) 873d5b7ffbfSDeepa Dinamani { 874d5b7ffbfSDeepa Dinamani int ret; 875d5b7ffbfSDeepa Dinamani 876d5b7ffbfSDeepa Dinamani ret = get_timespec64(&it->it_interval, &uit->it_interval); 877d5b7ffbfSDeepa Dinamani if (ret) 878d5b7ffbfSDeepa Dinamani return ret; 879d5b7ffbfSDeepa Dinamani 880d5b7ffbfSDeepa Dinamani ret = get_timespec64(&it->it_value, &uit->it_value); 881d5b7ffbfSDeepa Dinamani 882d5b7ffbfSDeepa Dinamani return ret; 883d5b7ffbfSDeepa Dinamani } 884d5b7ffbfSDeepa Dinamani EXPORT_SYMBOL_GPL(get_itimerspec64); 885d5b7ffbfSDeepa Dinamani 886d5b7ffbfSDeepa Dinamani int put_itimerspec64(const struct itimerspec64 *it, 887d5b7ffbfSDeepa Dinamani struct itimerspec __user *uit) 888d5b7ffbfSDeepa Dinamani { 889d5b7ffbfSDeepa Dinamani int ret; 890d5b7ffbfSDeepa Dinamani 891d5b7ffbfSDeepa Dinamani ret = put_timespec64(&it->it_interval, &uit->it_interval); 892d5b7ffbfSDeepa Dinamani if (ret) 893d5b7ffbfSDeepa Dinamani return ret; 894d5b7ffbfSDeepa Dinamani 895d5b7ffbfSDeepa Dinamani ret = put_timespec64(&it->it_value, &uit->it_value); 896d5b7ffbfSDeepa Dinamani 897d5b7ffbfSDeepa Dinamani return ret; 898d5b7ffbfSDeepa Dinamani } 899d5b7ffbfSDeepa Dinamani EXPORT_SYMBOL_GPL(put_itimerspec64); 900