15cee9645SThomas Gleixner /* 25cee9645SThomas Gleixner * linux/kernel/itimer.c 35cee9645SThomas Gleixner * 45cee9645SThomas Gleixner * Copyright (C) 1992 Darren Senn 55cee9645SThomas Gleixner */ 65cee9645SThomas Gleixner 75cee9645SThomas Gleixner /* These are all the functions necessary to implement itimers */ 85cee9645SThomas Gleixner 95cee9645SThomas Gleixner #include <linux/mm.h> 105cee9645SThomas Gleixner #include <linux/interrupt.h> 115cee9645SThomas Gleixner #include <linux/syscalls.h> 125cee9645SThomas Gleixner #include <linux/time.h> 135cee9645SThomas Gleixner #include <linux/posix-timers.h> 145cee9645SThomas Gleixner #include <linux/hrtimer.h> 155cee9645SThomas Gleixner #include <trace/events/timer.h> 165cee9645SThomas Gleixner 177c0f6ba6SLinus Torvalds #include <linux/uaccess.h> 185cee9645SThomas Gleixner 195cee9645SThomas Gleixner /** 205cee9645SThomas Gleixner * itimer_get_remtime - get remaining time for the timer 215cee9645SThomas Gleixner * 225cee9645SThomas Gleixner * @timer: the timer to read 235cee9645SThomas Gleixner * 245cee9645SThomas Gleixner * Returns the delta between the expiry time and now, which can be 255cee9645SThomas Gleixner * less than zero or 1usec for an pending expired timer 265cee9645SThomas Gleixner */ 275cee9645SThomas Gleixner static struct timeval itimer_get_remtime(struct hrtimer *timer) 285cee9645SThomas Gleixner { 2951cbb524SThomas Gleixner ktime_t rem = __hrtimer_get_remaining(timer, true); 305cee9645SThomas Gleixner 315cee9645SThomas Gleixner /* 325cee9645SThomas Gleixner * Racy but safe: if the itimer expires after the above 335cee9645SThomas Gleixner * hrtimer_get_remtime() call but before this condition 345cee9645SThomas Gleixner * then we return 0 - which is correct. 355cee9645SThomas Gleixner */ 365cee9645SThomas Gleixner if (hrtimer_active(timer)) { 37*2456e855SThomas Gleixner if (rem <= 0) 38*2456e855SThomas Gleixner rem = NSEC_PER_USEC; 395cee9645SThomas Gleixner } else 40*2456e855SThomas Gleixner rem = 0; 415cee9645SThomas Gleixner 425cee9645SThomas Gleixner return ktime_to_timeval(rem); 435cee9645SThomas Gleixner } 445cee9645SThomas Gleixner 455cee9645SThomas Gleixner static void get_cpu_itimer(struct task_struct *tsk, unsigned int clock_id, 465cee9645SThomas Gleixner struct itimerval *const value) 475cee9645SThomas Gleixner { 485cee9645SThomas Gleixner cputime_t cval, cinterval; 495cee9645SThomas Gleixner struct cpu_itimer *it = &tsk->signal->it[clock_id]; 505cee9645SThomas Gleixner 515cee9645SThomas Gleixner spin_lock_irq(&tsk->sighand->siglock); 525cee9645SThomas Gleixner 535cee9645SThomas Gleixner cval = it->expires; 545cee9645SThomas Gleixner cinterval = it->incr; 555cee9645SThomas Gleixner if (cval) { 565cee9645SThomas Gleixner struct task_cputime cputime; 575cee9645SThomas Gleixner cputime_t t; 585cee9645SThomas Gleixner 595cee9645SThomas Gleixner thread_group_cputimer(tsk, &cputime); 605cee9645SThomas Gleixner if (clock_id == CPUCLOCK_PROF) 615cee9645SThomas Gleixner t = cputime.utime + cputime.stime; 625cee9645SThomas Gleixner else 635cee9645SThomas Gleixner /* CPUCLOCK_VIRT */ 645cee9645SThomas Gleixner t = cputime.utime; 655cee9645SThomas Gleixner 665cee9645SThomas Gleixner if (cval < t) 675cee9645SThomas Gleixner /* about to fire */ 685cee9645SThomas Gleixner cval = cputime_one_jiffy; 695cee9645SThomas Gleixner else 705cee9645SThomas Gleixner cval = cval - t; 715cee9645SThomas Gleixner } 725cee9645SThomas Gleixner 735cee9645SThomas Gleixner spin_unlock_irq(&tsk->sighand->siglock); 745cee9645SThomas Gleixner 755cee9645SThomas Gleixner cputime_to_timeval(cval, &value->it_value); 765cee9645SThomas Gleixner cputime_to_timeval(cinterval, &value->it_interval); 775cee9645SThomas Gleixner } 785cee9645SThomas Gleixner 795cee9645SThomas Gleixner int do_getitimer(int which, struct itimerval *value) 805cee9645SThomas Gleixner { 815cee9645SThomas Gleixner struct task_struct *tsk = current; 825cee9645SThomas Gleixner 835cee9645SThomas Gleixner switch (which) { 845cee9645SThomas Gleixner case ITIMER_REAL: 855cee9645SThomas Gleixner spin_lock_irq(&tsk->sighand->siglock); 865cee9645SThomas Gleixner value->it_value = itimer_get_remtime(&tsk->signal->real_timer); 875cee9645SThomas Gleixner value->it_interval = 885cee9645SThomas Gleixner ktime_to_timeval(tsk->signal->it_real_incr); 895cee9645SThomas Gleixner spin_unlock_irq(&tsk->sighand->siglock); 905cee9645SThomas Gleixner break; 915cee9645SThomas Gleixner case ITIMER_VIRTUAL: 925cee9645SThomas Gleixner get_cpu_itimer(tsk, CPUCLOCK_VIRT, value); 935cee9645SThomas Gleixner break; 945cee9645SThomas Gleixner case ITIMER_PROF: 955cee9645SThomas Gleixner get_cpu_itimer(tsk, CPUCLOCK_PROF, value); 965cee9645SThomas Gleixner break; 975cee9645SThomas Gleixner default: 985cee9645SThomas Gleixner return(-EINVAL); 995cee9645SThomas Gleixner } 1005cee9645SThomas Gleixner return 0; 1015cee9645SThomas Gleixner } 1025cee9645SThomas Gleixner 1035cee9645SThomas Gleixner SYSCALL_DEFINE2(getitimer, int, which, struct itimerval __user *, value) 1045cee9645SThomas Gleixner { 1055cee9645SThomas Gleixner int error = -EFAULT; 1065cee9645SThomas Gleixner struct itimerval get_buffer; 1075cee9645SThomas Gleixner 1085cee9645SThomas Gleixner if (value) { 1095cee9645SThomas Gleixner error = do_getitimer(which, &get_buffer); 1105cee9645SThomas Gleixner if (!error && 1115cee9645SThomas Gleixner copy_to_user(value, &get_buffer, sizeof(get_buffer))) 1125cee9645SThomas Gleixner error = -EFAULT; 1135cee9645SThomas Gleixner } 1145cee9645SThomas Gleixner return error; 1155cee9645SThomas Gleixner } 1165cee9645SThomas Gleixner 1175cee9645SThomas Gleixner 1185cee9645SThomas Gleixner /* 1195cee9645SThomas Gleixner * The timer is automagically restarted, when interval != 0 1205cee9645SThomas Gleixner */ 1215cee9645SThomas Gleixner enum hrtimer_restart it_real_fn(struct hrtimer *timer) 1225cee9645SThomas Gleixner { 1235cee9645SThomas Gleixner struct signal_struct *sig = 1245cee9645SThomas Gleixner container_of(timer, struct signal_struct, real_timer); 1255cee9645SThomas Gleixner 1265cee9645SThomas Gleixner trace_itimer_expire(ITIMER_REAL, sig->leader_pid, 0); 1275cee9645SThomas Gleixner kill_pid_info(SIGALRM, SEND_SIG_PRIV, sig->leader_pid); 1285cee9645SThomas Gleixner 1295cee9645SThomas Gleixner return HRTIMER_NORESTART; 1305cee9645SThomas Gleixner } 1315cee9645SThomas Gleixner 1325cee9645SThomas Gleixner static inline u32 cputime_sub_ns(cputime_t ct, s64 real_ns) 1335cee9645SThomas Gleixner { 1345cee9645SThomas Gleixner struct timespec ts; 1355cee9645SThomas Gleixner s64 cpu_ns; 1365cee9645SThomas Gleixner 1375cee9645SThomas Gleixner cputime_to_timespec(ct, &ts); 1385cee9645SThomas Gleixner cpu_ns = timespec_to_ns(&ts); 1395cee9645SThomas Gleixner 1405cee9645SThomas Gleixner return (cpu_ns <= real_ns) ? 0 : cpu_ns - real_ns; 1415cee9645SThomas Gleixner } 1425cee9645SThomas Gleixner 1435cee9645SThomas Gleixner static void set_cpu_itimer(struct task_struct *tsk, unsigned int clock_id, 1445cee9645SThomas Gleixner const struct itimerval *const value, 1455cee9645SThomas Gleixner struct itimerval *const ovalue) 1465cee9645SThomas Gleixner { 1475cee9645SThomas Gleixner cputime_t cval, nval, cinterval, ninterval; 1485cee9645SThomas Gleixner s64 ns_ninterval, ns_nval; 1495cee9645SThomas Gleixner u32 error, incr_error; 1505cee9645SThomas Gleixner struct cpu_itimer *it = &tsk->signal->it[clock_id]; 1515cee9645SThomas Gleixner 1525cee9645SThomas Gleixner nval = timeval_to_cputime(&value->it_value); 1535cee9645SThomas Gleixner ns_nval = timeval_to_ns(&value->it_value); 1545cee9645SThomas Gleixner ninterval = timeval_to_cputime(&value->it_interval); 1555cee9645SThomas Gleixner ns_ninterval = timeval_to_ns(&value->it_interval); 1565cee9645SThomas Gleixner 1575cee9645SThomas Gleixner error = cputime_sub_ns(nval, ns_nval); 1585cee9645SThomas Gleixner incr_error = cputime_sub_ns(ninterval, ns_ninterval); 1595cee9645SThomas Gleixner 1605cee9645SThomas Gleixner spin_lock_irq(&tsk->sighand->siglock); 1615cee9645SThomas Gleixner 1625cee9645SThomas Gleixner cval = it->expires; 1635cee9645SThomas Gleixner cinterval = it->incr; 1645cee9645SThomas Gleixner if (cval || nval) { 1655cee9645SThomas Gleixner if (nval > 0) 1665cee9645SThomas Gleixner nval += cputime_one_jiffy; 1675cee9645SThomas Gleixner set_process_cpu_timer(tsk, clock_id, &nval, &cval); 1685cee9645SThomas Gleixner } 1695cee9645SThomas Gleixner it->expires = nval; 1705cee9645SThomas Gleixner it->incr = ninterval; 1715cee9645SThomas Gleixner it->error = error; 1725cee9645SThomas Gleixner it->incr_error = incr_error; 1735cee9645SThomas Gleixner trace_itimer_state(clock_id == CPUCLOCK_VIRT ? 1745cee9645SThomas Gleixner ITIMER_VIRTUAL : ITIMER_PROF, value, nval); 1755cee9645SThomas Gleixner 1765cee9645SThomas Gleixner spin_unlock_irq(&tsk->sighand->siglock); 1775cee9645SThomas Gleixner 1785cee9645SThomas Gleixner if (ovalue) { 1795cee9645SThomas Gleixner cputime_to_timeval(cval, &ovalue->it_value); 1805cee9645SThomas Gleixner cputime_to_timeval(cinterval, &ovalue->it_interval); 1815cee9645SThomas Gleixner } 1825cee9645SThomas Gleixner } 1835cee9645SThomas Gleixner 1845cee9645SThomas Gleixner /* 1855cee9645SThomas Gleixner * Returns true if the timeval is in canonical form 1865cee9645SThomas Gleixner */ 1875cee9645SThomas Gleixner #define timeval_valid(t) \ 1885cee9645SThomas Gleixner (((t)->tv_sec >= 0) && (((unsigned long) (t)->tv_usec) < USEC_PER_SEC)) 1895cee9645SThomas Gleixner 1905cee9645SThomas Gleixner int do_setitimer(int which, struct itimerval *value, struct itimerval *ovalue) 1915cee9645SThomas Gleixner { 1925cee9645SThomas Gleixner struct task_struct *tsk = current; 1935cee9645SThomas Gleixner struct hrtimer *timer; 1945cee9645SThomas Gleixner ktime_t expires; 1955cee9645SThomas Gleixner 1965cee9645SThomas Gleixner /* 1975cee9645SThomas Gleixner * Validate the timevals in value. 1985cee9645SThomas Gleixner */ 1995cee9645SThomas Gleixner if (!timeval_valid(&value->it_value) || 2005cee9645SThomas Gleixner !timeval_valid(&value->it_interval)) 2015cee9645SThomas Gleixner return -EINVAL; 2025cee9645SThomas Gleixner 2035cee9645SThomas Gleixner switch (which) { 2045cee9645SThomas Gleixner case ITIMER_REAL: 2055cee9645SThomas Gleixner again: 2065cee9645SThomas Gleixner spin_lock_irq(&tsk->sighand->siglock); 2075cee9645SThomas Gleixner timer = &tsk->signal->real_timer; 2085cee9645SThomas Gleixner if (ovalue) { 2095cee9645SThomas Gleixner ovalue->it_value = itimer_get_remtime(timer); 2105cee9645SThomas Gleixner ovalue->it_interval 2115cee9645SThomas Gleixner = ktime_to_timeval(tsk->signal->it_real_incr); 2125cee9645SThomas Gleixner } 2135cee9645SThomas Gleixner /* We are sharing ->siglock with it_real_fn() */ 2145cee9645SThomas Gleixner if (hrtimer_try_to_cancel(timer) < 0) { 2155cee9645SThomas Gleixner spin_unlock_irq(&tsk->sighand->siglock); 2165cee9645SThomas Gleixner goto again; 2175cee9645SThomas Gleixner } 2185cee9645SThomas Gleixner expires = timeval_to_ktime(value->it_value); 219*2456e855SThomas Gleixner if (expires != 0) { 2205cee9645SThomas Gleixner tsk->signal->it_real_incr = 2215cee9645SThomas Gleixner timeval_to_ktime(value->it_interval); 2225cee9645SThomas Gleixner hrtimer_start(timer, expires, HRTIMER_MODE_REL); 2235cee9645SThomas Gleixner } else 224*2456e855SThomas Gleixner tsk->signal->it_real_incr = 0; 2255cee9645SThomas Gleixner 2265cee9645SThomas Gleixner trace_itimer_state(ITIMER_REAL, value, 0); 2275cee9645SThomas Gleixner spin_unlock_irq(&tsk->sighand->siglock); 2285cee9645SThomas Gleixner break; 2295cee9645SThomas Gleixner case ITIMER_VIRTUAL: 2305cee9645SThomas Gleixner set_cpu_itimer(tsk, CPUCLOCK_VIRT, value, ovalue); 2315cee9645SThomas Gleixner break; 2325cee9645SThomas Gleixner case ITIMER_PROF: 2335cee9645SThomas Gleixner set_cpu_itimer(tsk, CPUCLOCK_PROF, value, ovalue); 2345cee9645SThomas Gleixner break; 2355cee9645SThomas Gleixner default: 2365cee9645SThomas Gleixner return -EINVAL; 2375cee9645SThomas Gleixner } 2385cee9645SThomas Gleixner return 0; 2395cee9645SThomas Gleixner } 2405cee9645SThomas Gleixner 24174ba181eSNicolas Pitre #ifdef __ARCH_WANT_SYS_ALARM 24274ba181eSNicolas Pitre 2435cee9645SThomas Gleixner /** 2445cee9645SThomas Gleixner * alarm_setitimer - set alarm in seconds 2455cee9645SThomas Gleixner * 2465cee9645SThomas Gleixner * @seconds: number of seconds until alarm 2475cee9645SThomas Gleixner * 0 disables the alarm 2485cee9645SThomas Gleixner * 2495cee9645SThomas Gleixner * Returns the remaining time in seconds of a pending timer or 0 when 2505cee9645SThomas Gleixner * the timer is not active. 2515cee9645SThomas Gleixner * 2525cee9645SThomas Gleixner * On 32 bit machines the seconds value is limited to (INT_MAX/2) to avoid 2535cee9645SThomas Gleixner * negative timeval settings which would cause immediate expiry. 2545cee9645SThomas Gleixner */ 25574ba181eSNicolas Pitre static unsigned int alarm_setitimer(unsigned int seconds) 2565cee9645SThomas Gleixner { 2575cee9645SThomas Gleixner struct itimerval it_new, it_old; 2585cee9645SThomas Gleixner 2595cee9645SThomas Gleixner #if BITS_PER_LONG < 64 2605cee9645SThomas Gleixner if (seconds > INT_MAX) 2615cee9645SThomas Gleixner seconds = INT_MAX; 2625cee9645SThomas Gleixner #endif 2635cee9645SThomas Gleixner it_new.it_value.tv_sec = seconds; 2645cee9645SThomas Gleixner it_new.it_value.tv_usec = 0; 2655cee9645SThomas Gleixner it_new.it_interval.tv_sec = it_new.it_interval.tv_usec = 0; 2665cee9645SThomas Gleixner 2675cee9645SThomas Gleixner do_setitimer(ITIMER_REAL, &it_new, &it_old); 2685cee9645SThomas Gleixner 2695cee9645SThomas Gleixner /* 2705cee9645SThomas Gleixner * We can't return 0 if we have an alarm pending ... And we'd 2715cee9645SThomas Gleixner * better return too much than too little anyway 2725cee9645SThomas Gleixner */ 2735cee9645SThomas Gleixner if ((!it_old.it_value.tv_sec && it_old.it_value.tv_usec) || 2745cee9645SThomas Gleixner it_old.it_value.tv_usec >= 500000) 2755cee9645SThomas Gleixner it_old.it_value.tv_sec++; 2765cee9645SThomas Gleixner 2775cee9645SThomas Gleixner return it_old.it_value.tv_sec; 2785cee9645SThomas Gleixner } 2795cee9645SThomas Gleixner 28074ba181eSNicolas Pitre /* 28174ba181eSNicolas Pitre * For backwards compatibility? This can be done in libc so Alpha 28274ba181eSNicolas Pitre * and all newer ports shouldn't need it. 28374ba181eSNicolas Pitre */ 28474ba181eSNicolas Pitre SYSCALL_DEFINE1(alarm, unsigned int, seconds) 28574ba181eSNicolas Pitre { 28674ba181eSNicolas Pitre return alarm_setitimer(seconds); 28774ba181eSNicolas Pitre } 28874ba181eSNicolas Pitre 28974ba181eSNicolas Pitre #endif 29074ba181eSNicolas Pitre 2915cee9645SThomas Gleixner SYSCALL_DEFINE3(setitimer, int, which, struct itimerval __user *, value, 2925cee9645SThomas Gleixner struct itimerval __user *, ovalue) 2935cee9645SThomas Gleixner { 2945cee9645SThomas Gleixner struct itimerval set_buffer, get_buffer; 2955cee9645SThomas Gleixner int error; 2965cee9645SThomas Gleixner 2975cee9645SThomas Gleixner if (value) { 2985cee9645SThomas Gleixner if(copy_from_user(&set_buffer, value, sizeof(set_buffer))) 2995cee9645SThomas Gleixner return -EFAULT; 3005cee9645SThomas Gleixner } else { 3015cee9645SThomas Gleixner memset(&set_buffer, 0, sizeof(set_buffer)); 3025cee9645SThomas Gleixner printk_once(KERN_WARNING "%s calls setitimer() with new_value NULL pointer." 3035cee9645SThomas Gleixner " Misfeature support will be removed\n", 3045cee9645SThomas Gleixner current->comm); 3055cee9645SThomas Gleixner } 3065cee9645SThomas Gleixner 3075cee9645SThomas Gleixner error = do_setitimer(which, &set_buffer, ovalue ? &get_buffer : NULL); 3085cee9645SThomas Gleixner if (error || !ovalue) 3095cee9645SThomas Gleixner return error; 3105cee9645SThomas Gleixner 3115cee9645SThomas Gleixner if (copy_to_user(ovalue, &get_buffer, sizeof(get_buffer))) 3125cee9645SThomas Gleixner return -EFAULT; 3135cee9645SThomas Gleixner return 0; 3145cee9645SThomas Gleixner } 315