Lines Matching +full:local +full:- +full:timers

1 // SPDX-License-Identifier: GPL-2.0+
3 * 2002-10-15 Posix Clocks & timers
7 * 2004-06-01 Fix CLOCK_REALTIME clock/timer TIMER_ABSTIME bug.
10 * These are all the functions necessary to implement POSIX clocks & timers
24 #include <linux/posix-clock.h>
25 #include <linux/posix-timers.h>
36 #include "posix-timers.h"
39 * Management arrays for POSIX timers. Timers are now kept in static hash table
41 * Timer ids are allocated by local routine, which selects proper hash head by
42 * key, constructed from current->signal address and per signal struct counter.
48 * Lets keep our timers in a slab cache :-)
72 * a) checking that idr_find() returns other than -1.
100 * clocks may be set able by any user (i.e. local process
109 __cond_lock(&__timr->it_lock, __timr = __lock_timer(tid, flags)); \
126 if ((timer->it_signal == sig) && (timer->it_id == id)) in __posix_timers_find()
134 struct signal_struct *sig = current->signal; in posix_timer_by_id()
142 struct signal_struct *sig = current->signal; in posix_timer_add()
143 int first_free_id = sig->posix_timer_id; in posix_timer_add()
145 int ret = -ENOENT; in posix_timer_add()
149 head = &posix_timers_hashtable[hash(sig, sig->posix_timer_id)]; in posix_timer_add()
150 if (!__posix_timers_find(head, sig, sig->posix_timer_id)) { in posix_timer_add()
151 hlist_add_head_rcu(&timer->t_hash, head); in posix_timer_add()
152 ret = sig->posix_timer_id; in posix_timer_add()
154 if (++sig->posix_timer_id < 0) in posix_timer_add()
155 sig->posix_timer_id = 0; in posix_timer_add()
156 if ((sig->posix_timer_id == first_free_id) && (ret == -ENOENT)) in posix_timer_add()
158 ret = -EAGAIN; in posix_timer_add()
160 } while (ret == -ENOENT); in posix_timer_add()
166 spin_unlock_irqrestore(&timr->it_lock, flags); in unlock_timer()
195 * Get monotonic time for posix timers
210 * Get monotonic-raw time for posix timers
265 tp->tv_sec = 0; in posix_get_hrtimer_res()
266 tp->tv_nsec = hrtimer_resolution; in posix_get_hrtimer_res()
271 * Initialize everything, well, just everything in Posix clocks/timers ;)
288 s64 sum = timr->it_overrun_last + (s64)baseval; in timer_overrun_to_int()
295 struct hrtimer *timer = &timr->it.real.timer; in common_hrtimer_rearm()
297 timr->it_overrun += hrtimer_forward(timer, timer->base->get_time(), in common_hrtimer_rearm()
298 timr->it_interval); in common_hrtimer_rearm()
318 timr = lock_timer(info->si_tid, &flags); in posixtimer_rearm()
322 if (timr->it_interval && timr->it_requeue_pending == info->si_sys_private) { in posixtimer_rearm()
323 timr->kclock->timer_rearm(timr); in posixtimer_rearm()
325 timr->it_active = 1; in posixtimer_rearm()
326 timr->it_overrun_last = timr->it_overrun; in posixtimer_rearm()
327 timr->it_overrun = -1LL; in posixtimer_rearm()
328 ++timr->it_requeue_pending; in posixtimer_rearm()
330 info->si_overrun = timer_overrun_to_int(timr, info->si_overrun); in posixtimer_rearm()
341 * FIXME: if ->sigq is queued we can race with in posix_timer_event()
342 * dequeue_signal()->posixtimer_rearm(). in posix_timer_event()
346 * We re-queue ->sigq and drop ->it_lock(). in posix_timer_event()
348 * and re-schedules it while ->sigq is pending. in posix_timer_event()
351 timr->sigq->info.si_sys_private = si_private; in posix_timer_event()
353 type = !(timr->it_sigev_notify & SIGEV_THREAD_ID) ? PIDTYPE_TGID : PIDTYPE_PID; in posix_timer_event()
354 ret = send_sigqueue(timr->sigq, timr->it_pid, type); in posix_timer_event()
364 * This code is for CLOCK_REALTIME* and CLOCK_MONOTONIC* timers.
374 spin_lock_irqsave(&timr->it_lock, flags); in posix_timer_fn()
376 timr->it_active = 0; in posix_timer_fn()
377 if (timr->it_interval != 0) in posix_timer_fn()
378 si_private = ++timr->it_requeue_pending; in posix_timer_fn()
386 if (timr->it_interval != 0) { in posix_timer_fn()
397 * For now we just let timers with an interval in posix_timer_fn()
415 if (timr->it_interval < kj) in posix_timer_fn()
419 timr->it_overrun += hrtimer_forward(timer, now, in posix_timer_fn()
420 timr->it_interval); in posix_timer_fn()
422 ++timr->it_requeue_pending; in posix_timer_fn()
423 timr->it_active = 1; in posix_timer_fn()
436 switch (event->sigev_notify) { in good_sigevent()
438 pid = find_vpid(event->sigev_notify_thread_id); in good_sigevent()
445 if (event->sigev_signo <= 0 || event->sigev_signo > SIGRTMAX) in good_sigevent()
461 if (unlikely(!(tmr->sigq = sigqueue_alloc()))) { in alloc_posix_timer()
465 clear_siginfo(&tmr->sigq->info); in alloc_posix_timer()
483 hlist_del_rcu(&tmr->t_hash); in release_posix_timer()
486 put_pid(tmr->it_pid); in release_posix_timer()
487 sigqueue_free(tmr->sigq); in release_posix_timer()
488 call_rcu(&tmr->rcu, k_itimer_rcu_free); in release_posix_timer()
493 hrtimer_init(&new_timer->it.real.timer, new_timer->it_clock, 0); in common_timer_create()
507 return -EINVAL; in do_timer_create()
508 if (!kc->timer_create) in do_timer_create()
509 return -EOPNOTSUPP; in do_timer_create()
513 return -EAGAIN; in do_timer_create()
515 spin_lock_init(&new_timer->it_lock); in do_timer_create()
523 new_timer->it_id = (timer_t) new_timer_id; in do_timer_create()
524 new_timer->it_clock = which_clock; in do_timer_create()
525 new_timer->kclock = kc; in do_timer_create()
526 new_timer->it_overrun = -1LL; in do_timer_create()
530 new_timer->it_pid = get_pid(good_sigevent(event)); in do_timer_create()
532 if (!new_timer->it_pid) { in do_timer_create()
533 error = -EINVAL; in do_timer_create()
536 new_timer->it_sigev_notify = event->sigev_notify; in do_timer_create()
537 new_timer->sigq->info.si_signo = event->sigev_signo; in do_timer_create()
538 new_timer->sigq->info.si_value = event->sigev_value; in do_timer_create()
540 new_timer->it_sigev_notify = SIGEV_SIGNAL; in do_timer_create()
541 new_timer->sigq->info.si_signo = SIGALRM; in do_timer_create()
542 memset(&new_timer->sigq->info.si_value, 0, sizeof(sigval_t)); in do_timer_create()
543 new_timer->sigq->info.si_value.sival_int = new_timer->it_id; in do_timer_create()
544 new_timer->it_pid = get_pid(task_tgid(current)); in do_timer_create()
547 new_timer->sigq->info.si_tid = new_timer->it_id; in do_timer_create()
548 new_timer->sigq->info.si_code = SI_TIMER; in do_timer_create()
552 error = -EFAULT; in do_timer_create()
556 error = kc->timer_create(new_timer); in do_timer_create()
560 spin_lock_irq(&current->sighand->siglock); in do_timer_create()
561 new_timer->it_signal = current->signal; in do_timer_create()
562 list_add(&new_timer->list, &current->signal->posix_timers); in do_timer_create()
563 spin_unlock_irq(&current->sighand->siglock); in do_timer_create()
585 return -EFAULT; in SYSCALL_DEFINE3()
600 return -EFAULT; in COMPAT_SYSCALL_DEFINE3()
628 spin_lock_irqsave(&timr->it_lock, *flags); in __lock_timer()
629 if (timr->it_signal == current->signal) { in __lock_timer()
633 spin_unlock_irqrestore(&timr->it_lock, *flags); in __lock_timer()
642 struct hrtimer *timer = &timr->it.real.timer; in common_hrtimer_remaining()
649 struct hrtimer *timer = &timr->it.real.timer; in common_hrtimer_forward()
651 return hrtimer_forward(timer, now, timr->it_interval); in common_hrtimer_forward()
660 * of a timer that has a requeue pending. These timers should appear to
672 const struct k_clock *kc = timr->kclock; in common_timer_get()
676 sig_none = timr->it_sigev_notify == SIGEV_NONE; in common_timer_get()
677 iv = timr->it_interval; in common_timer_get()
681 cur_setting->it_interval = ktime_to_timespec64(iv); in common_timer_get()
682 } else if (!timr->it_active) { in common_timer_get()
684 * SIGEV_NONE oneshot timers are never queued. Check them in common_timer_get()
691 now = kc->clock_get_ktime(timr->it_clock); in common_timer_get()
697 if (iv && (timr->it_requeue_pending & REQUEUE_PENDING || sig_none)) in common_timer_get()
698 timr->it_overrun += kc->timer_forward(timr, now); in common_timer_get()
700 remaining = kc->timer_remaining(timr, now); in common_timer_get()
708 cur_setting->it_value.tv_nsec = 1; in common_timer_get()
710 cur_setting->it_value = ktime_to_timespec64(remaining); in common_timer_get()
724 return -EINVAL; in do_timer_gettime()
727 kc = timr->kclock; in do_timer_gettime()
728 if (WARN_ON_ONCE(!kc || !kc->timer_get)) in do_timer_gettime()
729 ret = -EINVAL; in do_timer_gettime()
731 kc->timer_get(timr, setting); in do_timer_gettime()
746 ret = -EFAULT; in SYSCALL_DEFINE2()
761 ret = -EFAULT; in SYSCALL_DEFINE2()
785 return -EINVAL; in SYSCALL_DEFINE1()
796 struct hrtimer *timer = &timr->it.real.timer; in common_hrtimer_arm()
801 * Posix magic: Relative CLOCK_REALTIME timers are not affected by in common_hrtimer_arm()
803 * hood. See hrtimer_init(). Update timr->kclock, so the generic in common_hrtimer_arm()
804 * functions which use timr->kclock->clock_get_*() work. in common_hrtimer_arm()
809 if (timr->it_clock == CLOCK_REALTIME) in common_hrtimer_arm()
810 timr->kclock = absolute ? &clock_realtime : &clock_monotonic; in common_hrtimer_arm()
812 hrtimer_init(&timr->it.real.timer, timr->it_clock, mode); in common_hrtimer_arm()
813 timr->it.real.timer.function = posix_timer_fn; in common_hrtimer_arm()
816 expires = ktime_add_safe(expires, timer->base->get_time()); in common_hrtimer_arm()
825 return hrtimer_try_to_cancel(&timr->it.real.timer); in common_hrtimer_try_to_cancel()
830 hrtimer_cancel_wait_running(&timer->it.real.timer); in common_timer_wait_running()
842 const struct k_clock *kc = READ_ONCE(timer->kclock); in timer_wait_running()
843 timer_t timer_id = READ_ONCE(timer->it_id); in timer_wait_running()
849 if (!WARN_ON_ONCE(!kc->timer_wait_running)) in timer_wait_running()
850 kc->timer_wait_running(timer); in timer_wait_running()
862 const struct k_clock *kc = timr->kclock; in common_timer_set()
870 timr->it_interval = 0; in common_timer_set()
873 * active and spinning on timr->it_lock. in common_timer_set()
875 if (kc->timer_try_to_cancel(timr) < 0) in common_timer_set()
878 timr->it_active = 0; in common_timer_set()
879 timr->it_requeue_pending = (timr->it_requeue_pending + 2) & in common_timer_set()
881 timr->it_overrun_last = 0; in common_timer_set()
884 if (!new_setting->it_value.tv_sec && !new_setting->it_value.tv_nsec) in common_timer_set()
887 timr->it_interval = timespec64_to_ktime(new_setting->it_interval); in common_timer_set()
888 expires = timespec64_to_ktime(new_setting->it_value); in common_timer_set()
890 expires = timens_ktime_to_host(timr->it_clock, expires); in common_timer_set()
891 sigev_none = timr->it_sigev_notify == SIGEV_NONE; in common_timer_set()
893 kc->timer_arm(timr, expires, flags & TIMER_ABSTIME, sigev_none); in common_timer_set()
894 timr->it_active = !sigev_none; in common_timer_set()
907 if (!timespec64_valid(&new_spec64->it_interval) || in do_timer_settime()
908 !timespec64_valid(&new_spec64->it_value)) in do_timer_settime()
909 return -EINVAL; in do_timer_settime()
917 return -EINVAL; in do_timer_settime()
919 kc = timr->kclock; in do_timer_settime()
920 if (WARN_ON_ONCE(!kc || !kc->timer_set)) in do_timer_settime()
921 error = -EINVAL; in do_timer_settime()
923 error = kc->timer_set(timr, tmr_flags, new_spec64, old_spec64); in do_timer_settime()
947 return -EINVAL; in SYSCALL_DEFINE4()
950 return -EFAULT; in SYSCALL_DEFINE4()
955 error = -EFAULT; in SYSCALL_DEFINE4()
970 return -EINVAL; in SYSCALL_DEFINE4()
972 return -EFAULT; in SYSCALL_DEFINE4()
977 error = -EFAULT; in SYSCALL_DEFINE4()
985 const struct k_clock *kc = timer->kclock; in common_timer_del()
987 timer->it_interval = 0; in common_timer_del()
988 if (kc->timer_try_to_cancel(timer) < 0) in common_timer_del()
990 timer->it_active = 0; in common_timer_del()
996 const struct k_clock *kc = timer->kclock; in timer_delete_hook()
998 if (WARN_ON_ONCE(!kc || !kc->timer_del)) in timer_delete_hook()
999 return -EINVAL; in timer_delete_hook()
1000 return kc->timer_del(timer); in timer_delete_hook()
1013 return -EINVAL; in SYSCALL_DEFINE1()
1021 spin_lock(&current->sighand->siglock); in SYSCALL_DEFINE1()
1022 list_del(&timer->list); in SYSCALL_DEFINE1()
1023 spin_unlock(&current->sighand->siglock); in SYSCALL_DEFINE1()
1028 timer->it_signal = NULL; in SYSCALL_DEFINE1()
1041 spin_lock_irq(&timer->it_lock); in itimer_delete()
1044 spin_unlock_irq(&timer->it_lock); in itimer_delete()
1047 list_del(&timer->list); in itimer_delete()
1049 spin_unlock_irq(&timer->it_lock); in itimer_delete()
1055 * modify the signal->posix_timers list. Yet we need sighand->siglock
1056 * to prevent the race with /proc/pid/timers.
1060 struct list_head timers; in exit_itimers() local
1063 if (list_empty(&tsk->signal->posix_timers)) in exit_itimers()
1066 spin_lock_irq(&tsk->sighand->siglock); in exit_itimers()
1067 list_replace_init(&tsk->signal->posix_timers, &timers); in exit_itimers()
1068 spin_unlock_irq(&tsk->sighand->siglock); in exit_itimers()
1070 while (!list_empty(&timers)) { in exit_itimers()
1071 tmr = list_first_entry(&timers, struct k_itimer, list); in exit_itimers()
1082 if (!kc || !kc->clock_set) in SYSCALL_DEFINE2()
1083 return -EINVAL; in SYSCALL_DEFINE2()
1086 return -EFAULT; in SYSCALL_DEFINE2()
1088 return kc->clock_set(which_clock, &new_tp); in SYSCALL_DEFINE2()
1099 return -EINVAL; in SYSCALL_DEFINE2()
1101 error = kc->clock_get_timespec(which_clock, &kernel_tp); in SYSCALL_DEFINE2()
1104 error = -EFAULT; in SYSCALL_DEFINE2()
1114 return -EINVAL; in do_clock_adjtime()
1115 if (!kc->clock_adj) in do_clock_adjtime()
1116 return -EOPNOTSUPP; in do_clock_adjtime()
1118 return kc->clock_adj(which_clock, ktx); in do_clock_adjtime()
1128 return -EFAULT; in SYSCALL_DEFINE2()
1133 return -EFAULT; in SYSCALL_DEFINE2()
1146 return -EINVAL; in SYSCALL_DEFINE2()
1148 error = kc->clock_getres(which_clock, &rtn_tp); in SYSCALL_DEFINE2()
1151 error = -EFAULT; in SYSCALL_DEFINE2()
1164 if (!kc || !kc->clock_set) in SYSCALL_DEFINE2()
1165 return -EINVAL; in SYSCALL_DEFINE2()
1168 return -EFAULT; in SYSCALL_DEFINE2()
1170 return kc->clock_set(which_clock, &ts); in SYSCALL_DEFINE2()
1181 return -EINVAL; in SYSCALL_DEFINE2()
1183 err = kc->clock_get_timespec(which_clock, &ts); in SYSCALL_DEFINE2()
1186 err = -EFAULT; in SYSCALL_DEFINE2()
1204 return -EFAULT; in SYSCALL_DEFINE2()
1217 return -EINVAL; in SYSCALL_DEFINE2()
1219 err = kc->clock_getres(which_clock, &ts); in SYSCALL_DEFINE2()
1221 return -EFAULT; in SYSCALL_DEFINE2()
1262 return -EINVAL; in SYSCALL_DEFINE4()
1263 if (!kc->nsleep) in SYSCALL_DEFINE4()
1264 return -EOPNOTSUPP; in SYSCALL_DEFINE4()
1267 return -EFAULT; in SYSCALL_DEFINE4()
1270 return -EINVAL; in SYSCALL_DEFINE4()
1273 current->restart_block.nanosleep.type = rmtp ? TT_NATIVE : TT_NONE; in SYSCALL_DEFINE4()
1274 current->restart_block.nanosleep.rmtp = rmtp; in SYSCALL_DEFINE4()
1276 return kc->nsleep(which_clock, flags, &t); in SYSCALL_DEFINE4()
1289 return -EINVAL; in SYSCALL_DEFINE4()
1290 if (!kc->nsleep) in SYSCALL_DEFINE4()
1291 return -EOPNOTSUPP; in SYSCALL_DEFINE4()
1294 return -EFAULT; in SYSCALL_DEFINE4()
1297 return -EINVAL; in SYSCALL_DEFINE4()
1300 current->restart_block.nanosleep.type = rmtp ? TT_COMPAT : TT_NONE; in SYSCALL_DEFINE4()
1301 current->restart_block.nanosleep.compat_rmtp = rmtp; in SYSCALL_DEFINE4()
1303 return kc->nsleep(which_clock, flags, &t); in SYSCALL_DEFINE4()