linux/kernel/time/itimer.c
<<
>>
Prefs
   1// SPDX-License-Identifier: GPL-2.0
   2/*
   3 * Copyright (C) 1992 Darren Senn
   4 */
   5
   6/* These are all the functions necessary to implement itimers */
   7
   8#include <linux/mm.h>
   9#include <linux/interrupt.h>
  10#include <linux/syscalls.h>
  11#include <linux/time.h>
  12#include <linux/sched/signal.h>
  13#include <linux/sched/cputime.h>
  14#include <linux/posix-timers.h>
  15#include <linux/hrtimer.h>
  16#include <trace/events/timer.h>
  17#include <linux/compat.h>
  18
  19#include <linux/uaccess.h>
  20
  21/**
  22 * itimer_get_remtime - get remaining time for the timer
  23 *
  24 * @timer: the timer to read
  25 *
  26 * Returns the delta between the expiry time and now, which can be
  27 * less than zero or 1usec for an pending expired timer
  28 */
  29static struct timespec64 itimer_get_remtime(struct hrtimer *timer)
  30{
  31        ktime_t rem = __hrtimer_get_remaining(timer, true);
  32
  33        /*
  34         * Racy but safe: if the itimer expires after the above
  35         * hrtimer_get_remtime() call but before this condition
  36         * then we return 0 - which is correct.
  37         */
  38        if (hrtimer_active(timer)) {
  39                if (rem <= 0)
  40                        rem = NSEC_PER_USEC;
  41        } else
  42                rem = 0;
  43
  44        return ktime_to_timespec64(rem);
  45}
  46
  47static void get_cpu_itimer(struct task_struct *tsk, unsigned int clock_id,
  48                           struct itimerspec64 *const value)
  49{
  50        u64 val, interval;
  51        struct cpu_itimer *it = &tsk->signal->it[clock_id];
  52
  53        spin_lock_irq(&tsk->sighand->siglock);
  54
  55        val = it->expires;
  56        interval = it->incr;
  57        if (val) {
  58                u64 t, samples[CPUCLOCK_MAX];
  59
  60                thread_group_sample_cputime(tsk, samples);
  61                t = samples[clock_id];
  62
  63                if (val < t)
  64                        /* about to fire */
  65                        val = TICK_NSEC;
  66                else
  67                        val -= t;
  68        }
  69
  70        spin_unlock_irq(&tsk->sighand->siglock);
  71
  72        value->it_value = ns_to_timespec64(val);
  73        value->it_interval = ns_to_timespec64(interval);
  74}
  75
  76static int do_getitimer(int which, struct itimerspec64 *value)
  77{
  78        struct task_struct *tsk = current;
  79
  80        switch (which) {
  81        case ITIMER_REAL:
  82                spin_lock_irq(&tsk->sighand->siglock);
  83                value->it_value = itimer_get_remtime(&tsk->signal->real_timer);
  84                value->it_interval =
  85                        ktime_to_timespec64(tsk->signal->it_real_incr);
  86                spin_unlock_irq(&tsk->sighand->siglock);
  87                break;
  88        case ITIMER_VIRTUAL:
  89                get_cpu_itimer(tsk, CPUCLOCK_VIRT, value);
  90                break;
  91        case ITIMER_PROF:
  92                get_cpu_itimer(tsk, CPUCLOCK_PROF, value);
  93                break;
  94        default:
  95                return(-EINVAL);
  96        }
  97        return 0;
  98}
  99
 100static int put_itimerval(struct __kernel_old_itimerval __user *o,
 101                         const struct itimerspec64 *i)
 102{
 103        struct __kernel_old_itimerval v;
 104
 105        v.it_interval.tv_sec = i->it_interval.tv_sec;
 106        v.it_interval.tv_usec = i->it_interval.tv_nsec / NSEC_PER_USEC;
 107        v.it_value.tv_sec = i->it_value.tv_sec;
 108        v.it_value.tv_usec = i->it_value.tv_nsec / NSEC_PER_USEC;
 109        return copy_to_user(o, &v, sizeof(struct __kernel_old_itimerval)) ? -EFAULT : 0;
 110}
 111
 112
 113SYSCALL_DEFINE2(getitimer, int, which, struct __kernel_old_itimerval __user *, value)
 114{
 115        struct itimerspec64 get_buffer;
 116        int error = do_getitimer(which, &get_buffer);
 117
 118        if (!error && put_itimerval(value, &get_buffer))
 119                error = -EFAULT;
 120        return error;
 121}
 122
 123#if defined(CONFIG_COMPAT) || defined(CONFIG_ALPHA)
 124struct old_itimerval32 {
 125        struct old_timeval32    it_interval;
 126        struct old_timeval32    it_value;
 127};
 128
 129static int put_old_itimerval32(struct old_itimerval32 __user *o,
 130                               const struct itimerspec64 *i)
 131{
 132        struct old_itimerval32 v32;
 133
 134        v32.it_interval.tv_sec = i->it_interval.tv_sec;
 135        v32.it_interval.tv_usec = i->it_interval.tv_nsec / NSEC_PER_USEC;
 136        v32.it_value.tv_sec = i->it_value.tv_sec;
 137        v32.it_value.tv_usec = i->it_value.tv_nsec / NSEC_PER_USEC;
 138        return copy_to_user(o, &v32, sizeof(struct old_itimerval32)) ? -EFAULT : 0;
 139}
 140
 141COMPAT_SYSCALL_DEFINE2(getitimer, int, which,
 142                       struct old_itimerval32 __user *, value)
 143{
 144        struct itimerspec64 get_buffer;
 145        int error = do_getitimer(which, &get_buffer);
 146
 147        if (!error && put_old_itimerval32(value, &get_buffer))
 148                error = -EFAULT;
 149        return error;
 150}
 151#endif
 152
 153/*
 154 * The timer is automagically restarted, when interval != 0
 155 */
 156enum hrtimer_restart it_real_fn(struct hrtimer *timer)
 157{
 158        struct signal_struct *sig =
 159                container_of(timer, struct signal_struct, real_timer);
 160        struct pid *leader_pid = sig->pids[PIDTYPE_TGID];
 161
 162        trace_itimer_expire(ITIMER_REAL, leader_pid, 0);
 163        kill_pid_info(SIGALRM, SEND_SIG_PRIV, leader_pid);
 164
 165        return HRTIMER_NORESTART;
 166}
 167
 168static void set_cpu_itimer(struct task_struct *tsk, unsigned int clock_id,
 169                           const struct itimerspec64 *const value,
 170                           struct itimerspec64 *const ovalue)
 171{
 172        u64 oval, nval, ointerval, ninterval;
 173        struct cpu_itimer *it = &tsk->signal->it[clock_id];
 174
 175        /*
 176         * Use the to_ktime conversion because that clamps the maximum
 177         * value to KTIME_MAX and avoid multiplication overflows.
 178         */
 179        nval = timespec64_to_ns(&value->it_value);
 180        ninterval = timespec64_to_ns(&value->it_interval);
 181
 182        spin_lock_irq(&tsk->sighand->siglock);
 183
 184        oval = it->expires;
 185        ointerval = it->incr;
 186        if (oval || nval) {
 187                if (nval > 0)
 188                        nval += TICK_NSEC;
 189                set_process_cpu_timer(tsk, clock_id, &nval, &oval);
 190        }
 191        it->expires = nval;
 192        it->incr = ninterval;
 193        trace_itimer_state(clock_id == CPUCLOCK_VIRT ?
 194                           ITIMER_VIRTUAL : ITIMER_PROF, value, nval);
 195
 196        spin_unlock_irq(&tsk->sighand->siglock);
 197
 198        if (ovalue) {
 199                ovalue->it_value = ns_to_timespec64(oval);
 200                ovalue->it_interval = ns_to_timespec64(ointerval);
 201        }
 202}
 203
 204/*
 205 * Returns true if the timeval is in canonical form
 206 */
 207#define timeval_valid(t) \
 208        (((t)->tv_sec >= 0) && (((unsigned long) (t)->tv_usec) < USEC_PER_SEC))
 209
 210static int do_setitimer(int which, struct itimerspec64 *value,
 211                        struct itimerspec64 *ovalue)
 212{
 213        struct task_struct *tsk = current;
 214        struct hrtimer *timer;
 215        ktime_t expires;
 216
 217        switch (which) {
 218        case ITIMER_REAL:
 219again:
 220                spin_lock_irq(&tsk->sighand->siglock);
 221                timer = &tsk->signal->real_timer;
 222                if (ovalue) {
 223                        ovalue->it_value = itimer_get_remtime(timer);
 224                        ovalue->it_interval
 225                                = ktime_to_timespec64(tsk->signal->it_real_incr);
 226                }
 227                /* We are sharing ->siglock with it_real_fn() */
 228                if (hrtimer_try_to_cancel(timer) < 0) {
 229                        spin_unlock_irq(&tsk->sighand->siglock);
 230                        hrtimer_cancel_wait_running(timer);
 231                        goto again;
 232                }
 233                expires = timespec64_to_ktime(value->it_value);
 234                if (expires != 0) {
 235                        tsk->signal->it_real_incr =
 236                                timespec64_to_ktime(value->it_interval);
 237                        hrtimer_start(timer, expires, HRTIMER_MODE_REL);
 238                } else
 239                        tsk->signal->it_real_incr = 0;
 240
 241                trace_itimer_state(ITIMER_REAL, value, 0);
 242                spin_unlock_irq(&tsk->sighand->siglock);
 243                break;
 244        case ITIMER_VIRTUAL:
 245                set_cpu_itimer(tsk, CPUCLOCK_VIRT, value, ovalue);
 246                break;
 247        case ITIMER_PROF:
 248                set_cpu_itimer(tsk, CPUCLOCK_PROF, value, ovalue);
 249                break;
 250        default:
 251                return -EINVAL;
 252        }
 253        return 0;
 254}
 255
 256#ifdef CONFIG_SECURITY_SELINUX
 257void clear_itimer(void)
 258{
 259        struct itimerspec64 v = {};
 260        int i;
 261
 262        for (i = 0; i < 3; i++)
 263                do_setitimer(i, &v, NULL);
 264}
 265#endif
 266
 267#ifdef __ARCH_WANT_SYS_ALARM
 268
 269/**
 270 * alarm_setitimer - set alarm in seconds
 271 *
 272 * @seconds:    number of seconds until alarm
 273 *              0 disables the alarm
 274 *
 275 * Returns the remaining time in seconds of a pending timer or 0 when
 276 * the timer is not active.
 277 *
 278 * On 32 bit machines the seconds value is limited to (INT_MAX/2) to avoid
 279 * negative timeval settings which would cause immediate expiry.
 280 */
 281static unsigned int alarm_setitimer(unsigned int seconds)
 282{
 283        struct itimerspec64 it_new, it_old;
 284
 285#if BITS_PER_LONG < 64
 286        if (seconds > INT_MAX)
 287                seconds = INT_MAX;
 288#endif
 289        it_new.it_value.tv_sec = seconds;
 290        it_new.it_value.tv_nsec = 0;
 291        it_new.it_interval.tv_sec = it_new.it_interval.tv_nsec = 0;
 292
 293        do_setitimer(ITIMER_REAL, &it_new, &it_old);
 294
 295        /*
 296         * We can't return 0 if we have an alarm pending ...  And we'd
 297         * better return too much than too little anyway
 298         */
 299        if ((!it_old.it_value.tv_sec && it_old.it_value.tv_nsec) ||
 300              it_old.it_value.tv_nsec >= (NSEC_PER_SEC / 2))
 301                it_old.it_value.tv_sec++;
 302
 303        return it_old.it_value.tv_sec;
 304}
 305
 306/*
 307 * For backwards compatibility?  This can be done in libc so Alpha
 308 * and all newer ports shouldn't need it.
 309 */
 310SYSCALL_DEFINE1(alarm, unsigned int, seconds)
 311{
 312        return alarm_setitimer(seconds);
 313}
 314
 315#endif
 316
 317static int get_itimerval(struct itimerspec64 *o, const struct __kernel_old_itimerval __user *i)
 318{
 319        struct __kernel_old_itimerval v;
 320
 321        if (copy_from_user(&v, i, sizeof(struct __kernel_old_itimerval)))
 322                return -EFAULT;
 323
 324        /* Validate the timevals in value. */
 325        if (!timeval_valid(&v.it_value) ||
 326            !timeval_valid(&v.it_interval))
 327                return -EINVAL;
 328
 329        o->it_interval.tv_sec = v.it_interval.tv_sec;
 330        o->it_interval.tv_nsec = v.it_interval.tv_usec * NSEC_PER_USEC;
 331        o->it_value.tv_sec = v.it_value.tv_sec;
 332        o->it_value.tv_nsec = v.it_value.tv_usec * NSEC_PER_USEC;
 333        return 0;
 334}
 335
 336SYSCALL_DEFINE3(setitimer, int, which, struct __kernel_old_itimerval __user *, value,
 337                struct __kernel_old_itimerval __user *, ovalue)
 338{
 339        struct itimerspec64 set_buffer, get_buffer;
 340        int error;
 341
 342        if (value) {
 343                error = get_itimerval(&set_buffer, value);
 344                if (error)
 345                        return error;
 346        } else {
 347                memset(&set_buffer, 0, sizeof(set_buffer));
 348                printk_once(KERN_WARNING "%s calls setitimer() with new_value NULL pointer."
 349                            " Misfeature support will be removed\n",
 350                            current->comm);
 351        }
 352
 353        error = do_setitimer(which, &set_buffer, ovalue ? &get_buffer : NULL);
 354        if (error || !ovalue)
 355                return error;
 356
 357        if (put_itimerval(ovalue, &get_buffer))
 358                return -EFAULT;
 359        return 0;
 360}
 361
 362#if defined(CONFIG_COMPAT) || defined(CONFIG_ALPHA)
 363static int get_old_itimerval32(struct itimerspec64 *o, const struct old_itimerval32 __user *i)
 364{
 365        struct old_itimerval32 v32;
 366
 367        if (copy_from_user(&v32, i, sizeof(struct old_itimerval32)))
 368                return -EFAULT;
 369
 370        /* Validate the timevals in value.  */
 371        if (!timeval_valid(&v32.it_value) ||
 372            !timeval_valid(&v32.it_interval))
 373                return -EINVAL;
 374
 375        o->it_interval.tv_sec = v32.it_interval.tv_sec;
 376        o->it_interval.tv_nsec = v32.it_interval.tv_usec * NSEC_PER_USEC;
 377        o->it_value.tv_sec = v32.it_value.tv_sec;
 378        o->it_value.tv_nsec = v32.it_value.tv_usec * NSEC_PER_USEC;
 379        return 0;
 380}
 381
 382COMPAT_SYSCALL_DEFINE3(setitimer, int, which,
 383                       struct old_itimerval32 __user *, value,
 384                       struct old_itimerval32 __user *, ovalue)
 385{
 386        struct itimerspec64 set_buffer, get_buffer;
 387        int error;
 388
 389        if (value) {
 390                error = get_old_itimerval32(&set_buffer, value);
 391                if (error)
 392                        return error;
 393        } else {
 394                memset(&set_buffer, 0, sizeof(set_buffer));
 395                printk_once(KERN_WARNING "%s calls setitimer() with new_value NULL pointer."
 396                            " Misfeature support will be removed\n",
 397                            current->comm);
 398        }
 399
 400        error = do_setitimer(which, &set_buffer, ovalue ? &get_buffer : NULL);
 401        if (error || !ovalue)
 402                return error;
 403        if (put_old_itimerval32(ovalue, &get_buffer))
 404                return -EFAULT;
 405        return 0;
 406}
 407#endif
 408