Lines Matching +full:tmr +full:- +full:add

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.
20 #include <linux/posix-clock.h>
21 #include <linux/posix-timers.h>
31 #include "posix-timers.h"
73 __cond_lock(&__timr->it_lock, __timr = __lock_timer(tid)); \
80 spin_unlock_irq(&timr->it_lock); in unlock_timer()
84 scoped_cond_guard(lock_timer, return -EINVAL, _id)
98 struct signal_struct *sig = current->signal; in posix_timer_by_id()
102 hlist_for_each_entry_rcu(timer, &bucket->head, t_hash) { in posix_timer_by_id()
103 /* timer->it_signal can be set concurrently */ in posix_timer_by_id()
104 if ((READ_ONCE(timer->it_signal) == sig) && (timer->it_id == id)) in posix_timer_by_id()
112 unsigned long val = (unsigned long)timer->it_signal; in posix_sig_owner()
124 struct hlist_head *head = &bucket->head; in posix_timer_hashed()
127 hlist_for_each_entry_rcu(timer, head, t_hash, lockdep_is_held(&bucket->lock)) { in posix_timer_hashed()
128 if ((posix_sig_owner(timer) == sig) && (timer->it_id == id)) in posix_timer_hashed()
138 scoped_guard (spinlock, &bucket->lock) { in posix_timer_add_at()
155 timer->it_id = (timer_t)id; in posix_timer_add_at()
156 timer->it_signal = (struct signal_struct *)((unsigned long)sig | 1UL); in posix_timer_add_at()
157 hlist_add_head_rcu(&timer->t_hash, &bucket->head); in posix_timer_add_at()
166 struct signal_struct *sig = current->signal; in posix_timer_add()
170 return -EBUSY; in posix_timer_add()
178 atomic_set(&sig->next_posix_timer_id, req_id + 1); in posix_timer_add()
184 unsigned int id = atomic_fetch_inc(&sig->next_posix_timer_id) & INT_MAX; in posix_timer_add()
191 return -EAGAIN; in posix_timer_add()
281 tp->tv_sec = 0; in posix_get_hrtimer_res()
282 tp->tv_nsec = hrtimer_resolution; in posix_get_hrtimer_res()
292 if (timr->it_overrun_last > (s64)INT_MAX) in timer_overrun_to_int()
295 return (int)timr->it_overrun_last; in timer_overrun_to_int()
300 struct hrtimer *timer = &timr->it.real.timer; in common_hrtimer_rearm()
302 timr->it_overrun += hrtimer_forward(timer, timer->base->get_time(), in common_hrtimer_rearm()
303 timr->it_interval); in common_hrtimer_rearm()
309 guard(spinlock)(&timr->it_lock); in __posixtimer_deliver_signal()
316 if (timr->it_signal_seq != timr->it_sigqueue_seq || WARN_ON_ONCE(!posixtimer_valid(timr))) in __posixtimer_deliver_signal()
319 if (!timr->it_interval || WARN_ON_ONCE(timr->it_status != POSIX_TIMER_REQUEUE_PENDING)) in __posixtimer_deliver_signal()
322 timr->kclock->timer_rearm(timr); in __posixtimer_deliver_signal()
323 timr->it_status = POSIX_TIMER_ARMED; in __posixtimer_deliver_signal()
324 timr->it_overrun_last = timr->it_overrun; in __posixtimer_deliver_signal()
325 timr->it_overrun = -1LL; in __posixtimer_deliver_signal()
326 ++timr->it_signal_seq; in __posixtimer_deliver_signal()
327 info->si_overrun = timer_overrun_to_int(timr); in __posixtimer_deliver_signal()
346 spin_unlock(&current->sighand->siglock); in posixtimer_deliver_signal()
353 spin_lock(&current->sighand->siglock); in posixtimer_deliver_signal()
359 lockdep_assert_held(&timr->it_lock); in posix_timer_queue_signal()
364 timr->it_status = timr->it_interval ? POSIX_TIMER_REQUEUE_PENDING : POSIX_TIMER_DISARMED; in posix_timer_queue_signal()
379 guard(spinlock_irqsave)(&timr->it_lock); in posix_timer_fn()
388 current->signal->timer_create_restore_ids = 0; in posixtimer_create_prctl()
391 current->signal->timer_create_restore_ids = 1; in posixtimer_create_prctl()
394 return current->signal->timer_create_restore_ids; in posixtimer_create_prctl()
396 return -EINVAL; in posixtimer_create_prctl()
404 switch (event->sigev_notify) { in good_sigevent()
406 pid = find_vpid(event->sigev_notify_thread_id); in good_sigevent()
413 if (event->sigev_signo <= 0 || event->sigev_signo > SIGRTMAX) in good_sigevent()
425 struct k_itimer *tmr; in alloc_posix_timer() local
430 tmr = kmem_cache_zalloc(posix_timers_cache, GFP_KERNEL); in alloc_posix_timer()
431 if (!tmr) in alloc_posix_timer()
432 return tmr; in alloc_posix_timer()
434 if (unlikely(!posixtimer_init_sigqueue(&tmr->sigq))) { in alloc_posix_timer()
435 kmem_cache_free(posix_timers_cache, tmr); in alloc_posix_timer()
438 rcuref_init(&tmr->rcuref, 1); in alloc_posix_timer()
439 return tmr; in alloc_posix_timer()
442 void posixtimer_free_timer(struct k_itimer *tmr) in posixtimer_free_timer() argument
444 put_pid(tmr->it_pid); in posixtimer_free_timer()
445 if (tmr->sigq.ucounts) in posixtimer_free_timer()
446 dec_rlimit_put_ucounts(tmr->sigq.ucounts, UCOUNT_RLIMIT_SIGPENDING); in posixtimer_free_timer()
447 kfree_rcu(tmr, rcu); in posixtimer_free_timer()
450 static void posix_timer_unhash_and_free(struct k_itimer *tmr) in posix_timer_unhash_and_free() argument
452 struct timer_hash_bucket *bucket = hash_bucket(posix_sig_owner(tmr), tmr->it_id); in posix_timer_unhash_and_free()
454 scoped_guard (spinlock, &bucket->lock) in posix_timer_unhash_and_free()
455 hlist_del_rcu(&tmr->t_hash); in posix_timer_unhash_and_free()
456 posixtimer_putref(tmr); in posix_timer_unhash_and_free()
461 hrtimer_setup(&new_timer->it.real.timer, posix_timer_fn, new_timer->it_clock, 0); in common_timer_create()
475 return -EINVAL; in do_timer_create()
476 if (!kc->timer_create) in do_timer_create()
477 return -EOPNOTSUPP; in do_timer_create()
481 return -EAGAIN; in do_timer_create()
483 spin_lock_init(&new_timer->it_lock); in do_timer_create()
486 if (unlikely(current->signal->timer_create_restore_ids)) { in do_timer_create()
488 return -EFAULT; in do_timer_create()
491 return -EINVAL; in do_timer_create()
495 * Add the timer to the hash table. The timer is not yet valid in do_timer_create()
504 new_timer->it_clock = which_clock; in do_timer_create()
505 new_timer->kclock = kc; in do_timer_create()
506 new_timer->it_overrun = -1LL; in do_timer_create()
510 new_timer->it_pid = get_pid(good_sigevent(event)); in do_timer_create()
511 if (!new_timer->it_pid) { in do_timer_create()
512 error = -EINVAL; in do_timer_create()
515 new_timer->it_sigev_notify = event->sigev_notify; in do_timer_create()
516 new_timer->sigq.info.si_signo = event->sigev_signo; in do_timer_create()
517 new_timer->sigq.info.si_value = event->sigev_value; in do_timer_create()
519 new_timer->it_sigev_notify = SIGEV_SIGNAL; in do_timer_create()
520 new_timer->sigq.info.si_signo = SIGALRM; in do_timer_create()
521 new_timer->sigq.info.si_value.sival_int = new_timer->it_id; in do_timer_create()
522 new_timer->it_pid = get_pid(task_tgid(current)); in do_timer_create()
525 if (new_timer->it_sigev_notify & SIGEV_THREAD_ID) in do_timer_create()
526 new_timer->it_pid_type = PIDTYPE_PID; in do_timer_create()
528 new_timer->it_pid_type = PIDTYPE_TGID; in do_timer_create()
530 new_timer->sigq.info.si_tid = new_timer->it_id; in do_timer_create()
531 new_timer->sigq.info.si_code = SI_TIMER; in do_timer_create()
534 error = -EFAULT; in do_timer_create()
544 error = kc->timer_create(new_timer); in do_timer_create()
554 scoped_guard (spinlock_irq, &new_timer->it_lock) { in do_timer_create()
555 guard(spinlock)(&current->sighand->siglock); in do_timer_create()
561 WRITE_ONCE(new_timer->it_signal, current->signal); in do_timer_create()
562 hlist_add_head_rcu(&new_timer->list, &current->signal->posix_timers); in do_timer_create()
582 return -EFAULT; in SYSCALL_DEFINE3()
597 return -EFAULT; in COMPAT_SYSCALL_DEFINE3()
646 spin_lock_irq(&timr->it_lock); in __lock_timer()
651 if (timr->it_signal == current->signal) in __lock_timer()
653 spin_unlock_irq(&timr->it_lock); in __lock_timer()
660 struct hrtimer *timer = &timr->it.real.timer; in common_hrtimer_remaining()
667 struct hrtimer *timer = &timr->it.real.timer; in common_hrtimer_forward()
669 return hrtimer_forward(timer, now, timr->it_interval); in common_hrtimer_forward()
686 const struct k_clock *kc = timr->kclock; in common_timer_get()
690 sig_none = timr->it_sigev_notify == SIGEV_NONE; in common_timer_get()
691 iv = timr->it_interval; in common_timer_get()
695 cur_setting->it_interval = ktime_to_timespec64(iv); in common_timer_get()
696 } else if (timr->it_status == POSIX_TIMER_DISARMED) { in common_timer_get()
699 * timr->it_status is always DISARMED. The check below in common_timer_get()
709 now = kc->clock_get_ktime(timr->it_clock); in common_timer_get()
716 if (iv && timr->it_status != POSIX_TIMER_ARMED) in common_timer_get()
717 timr->it_overrun += kc->timer_forward(timr, now); in common_timer_get()
719 remaining = kc->timer_remaining(timr, now); in common_timer_get()
737 cur_setting->it_value.tv_nsec = 1; in common_timer_get()
739 cur_setting->it_value = ktime_to_timespec64(remaining); in common_timer_get()
747 scoped_timer->kclock->timer_get(scoped_timer, setting); in do_timer_gettime()
760 ret = -EFAULT; in SYSCALL_DEFINE2()
775 ret = -EFAULT; in SYSCALL_DEFINE2()
783 * sys_timer_getoverrun - Get the number of overruns of a POSIX.1b interval timer
797 * -EINVAL @timer_id is invalid
809 struct hrtimer *timer = &timr->it.real.timer; in common_hrtimer_arm()
816 * hood. See hrtimer_setup(). Update timr->kclock, so the generic in common_hrtimer_arm()
817 * functions which use timr->kclock->clock_get_*() work. in common_hrtimer_arm()
822 if (timr->it_clock == CLOCK_REALTIME) in common_hrtimer_arm()
823 timr->kclock = absolute ? &clock_realtime : &clock_monotonic; in common_hrtimer_arm()
825 hrtimer_setup(&timr->it.real.timer, posix_timer_fn, timr->it_clock, mode); in common_hrtimer_arm()
828 expires = ktime_add_safe(expires, timer->base->get_time()); in common_hrtimer_arm()
837 return hrtimer_try_to_cancel(&timr->it.real.timer); in common_hrtimer_try_to_cancel()
842 hrtimer_cancel_wait_running(&timer->it.real.timer); in common_timer_wait_running()
862 * kc->timer_wait_running() might drop RCU lock. So @timer in timer_wait_running()
865 timer->kclock->timer_wait_running(timer); in timer_wait_running()
873 if (new_setting->it_value.tv_sec || new_setting->it_value.tv_nsec) in posix_timer_set_common()
874 timer->it_interval = timespec64_to_ktime(new_setting->it_interval); in posix_timer_set_common()
876 timer->it_interval = 0; in posix_timer_set_common()
879 timer->it_overrun_last = 0; in posix_timer_set_common()
880 timer->it_overrun = -1LL; in posix_timer_set_common()
888 const struct k_clock *kc = timr->kclock; in common_timer_set()
897 * active and spinning on timr->it_lock. in common_timer_set()
899 if (kc->timer_try_to_cancel(timr) < 0) in common_timer_set()
902 timr->it_status = POSIX_TIMER_DISARMED; in common_timer_set()
906 if (!new_setting->it_value.tv_sec && !new_setting->it_value.tv_nsec) in common_timer_set()
909 expires = timespec64_to_ktime(new_setting->it_value); in common_timer_set()
911 expires = timens_ktime_to_host(timr->it_clock, expires); in common_timer_set()
912 sigev_none = timr->it_sigev_notify == SIGEV_NONE; in common_timer_set()
914 kc->timer_arm(timr, expires, flags & TIMER_ABSTIME, sigev_none); in common_timer_set()
916 timr->it_status = POSIX_TIMER_ARMED; in common_timer_set()
923 if (!timespec64_valid(&new_spec64->it_interval) || in do_timer_settime()
924 !timespec64_valid(&new_spec64->it_value)) in do_timer_settime()
925 return -EINVAL; in do_timer_settime()
937 old_spec64->it_interval = ktime_to_timespec64(timr->it_interval); in do_timer_settime()
940 timr->it_signal_seq++; in do_timer_settime()
942 int ret = timr->kclock->timer_set(timr, tmr_flags, new_spec64, old_spec64); in do_timer_settime()
963 return -EINVAL; in SYSCALL_DEFINE4()
966 return -EFAULT; in SYSCALL_DEFINE4()
972 error = -EFAULT; in SYSCALL_DEFINE4()
987 return -EINVAL; in SYSCALL_DEFINE4()
989 return -EFAULT; in SYSCALL_DEFINE4()
994 error = -EFAULT; in SYSCALL_DEFINE4()
1002 const struct k_clock *kc = timer->kclock; in common_timer_del()
1004 if (kc->timer_try_to_cancel(timer) < 0) in common_timer_del()
1006 timer->it_status = POSIX_TIMER_DISARMED; in common_timer_del()
1014 static inline void posix_timer_cleanup_ignored(struct k_itimer *tmr) in posix_timer_cleanup_ignored() argument
1016 if (!hlist_unhashed(&tmr->ignored_list)) { in posix_timer_cleanup_ignored()
1017 hlist_del_init(&tmr->ignored_list); in posix_timer_cleanup_ignored()
1018 posixtimer_putref(tmr); in posix_timer_cleanup_ignored()
1041 timer->it_signal_seq++; in posix_timer_delete()
1043 scoped_guard (spinlock, &current->sighand->siglock) { in posix_timer_delete()
1044 unsigned long sig = (unsigned long)timer->it_signal | 1UL; in posix_timer_delete()
1046 WRITE_ONCE(timer->it_signal, (struct signal_struct *)sig); in posix_timer_delete()
1047 hlist_del_rcu(&timer->list); in posix_timer_delete()
1051 while (timer->kclock->timer_del(timer) == TIMER_RETRY) { in posix_timer_delete()
1053 spin_unlock_irq(&timer->it_lock); in posix_timer_delete()
1055 spin_lock_irq(&timer->it_lock); in posix_timer_delete()
1085 tsk->signal->timer_create_restore_ids = 0; in exit_itimers()
1087 if (hlist_empty(&tsk->signal->posix_timers)) in exit_itimers()
1091 scoped_guard (spinlock_irq, &tsk->sighand->siglock) in exit_itimers()
1092 hlist_move_list(&tsk->signal->posix_timers, &timers); in exit_itimers()
1096 scoped_guard (spinlock_irq, &timer->it_lock) in exit_itimers()
1106 if (!WARN_ON_ONCE(!hlist_empty(&tsk->signal->ignored_posix_timers))) in exit_itimers()
1109 hlist_move_list(&tsk->signal->ignored_posix_timers, &timers); in exit_itimers()
1122 if (!kc || !kc->clock_set) in SYSCALL_DEFINE2()
1123 return -EINVAL; in SYSCALL_DEFINE2()
1126 return -EFAULT; in SYSCALL_DEFINE2()
1132 return kc->clock_set(which_clock, &new_tp); in SYSCALL_DEFINE2()
1143 return -EINVAL; in SYSCALL_DEFINE2()
1145 error = kc->clock_get_timespec(which_clock, &kernel_tp); in SYSCALL_DEFINE2()
1148 error = -EFAULT; in SYSCALL_DEFINE2()
1158 return -EINVAL; in do_clock_adjtime()
1159 if (!kc->clock_adj) in do_clock_adjtime()
1160 return -EOPNOTSUPP; in do_clock_adjtime()
1162 return kc->clock_adj(which_clock, ktx); in do_clock_adjtime()
1172 return -EFAULT; in SYSCALL_DEFINE2()
1177 return -EFAULT; in SYSCALL_DEFINE2()
1183 * sys_clock_getres - Get the resolution of a clock
1190 * clock. Clock resolutions are implementation-defined and cannot be set by
1250 * -EINVAL @which_clock is not a valid clock ID
1251 * -EFAULT Copying the resolution to @tp faulted
1252 * -ENODEV Dynamic POSIX clock is not backed by a device
1253 * -EOPNOTSUPP Dynamic POSIX clock does not support getres()
1263 return -EINVAL; in SYSCALL_DEFINE2()
1265 error = kc->clock_getres(which_clock, &rtn_tp); in SYSCALL_DEFINE2()
1268 error = -EFAULT; in SYSCALL_DEFINE2()
1281 if (!kc || !kc->clock_set) in SYSCALL_DEFINE2()
1282 return -EINVAL; in SYSCALL_DEFINE2()
1285 return -EFAULT; in SYSCALL_DEFINE2()
1287 return kc->clock_set(which_clock, &ts); in SYSCALL_DEFINE2()
1298 return -EINVAL; in SYSCALL_DEFINE2()
1300 err = kc->clock_get_timespec(which_clock, &ts); in SYSCALL_DEFINE2()
1303 err = -EFAULT; in SYSCALL_DEFINE2()
1321 return -EFAULT; in SYSCALL_DEFINE2()
1334 return -EINVAL; in SYSCALL_DEFINE2()
1336 err = kc->clock_getres(which_clock, &ts); in SYSCALL_DEFINE2()
1338 return -EFAULT; in SYSCALL_DEFINE2()
1361 * Absolute nanosleeps for these clocks are time-namespace adjusted.
1384 return -EINVAL; in SYSCALL_DEFINE4()
1385 if (!kc->nsleep) in SYSCALL_DEFINE4()
1386 return -EOPNOTSUPP; in SYSCALL_DEFINE4()
1389 return -EFAULT; in SYSCALL_DEFINE4()
1392 return -EINVAL; in SYSCALL_DEFINE4()
1395 current->restart_block.fn = do_no_restart_syscall; in SYSCALL_DEFINE4()
1396 current->restart_block.nanosleep.type = rmtp ? TT_NATIVE : TT_NONE; in SYSCALL_DEFINE4()
1397 current->restart_block.nanosleep.rmtp = rmtp; in SYSCALL_DEFINE4()
1399 return kc->nsleep(which_clock, flags, &t); in SYSCALL_DEFINE4()
1412 return -EINVAL; in SYSCALL_DEFINE4()
1413 if (!kc->nsleep) in SYSCALL_DEFINE4()
1414 return -EOPNOTSUPP; in SYSCALL_DEFINE4()
1417 return -EFAULT; in SYSCALL_DEFINE4()
1420 return -EINVAL; in SYSCALL_DEFINE4()
1423 current->restart_block.fn = do_no_restart_syscall; in SYSCALL_DEFINE4()
1424 current->restart_block.nanosleep.type = rmtp ? TT_COMPAT : TT_NONE; in SYSCALL_DEFINE4()
1425 current->restart_block.nanosleep.compat_rmtp = rmtp; in SYSCALL_DEFINE4()
1427 return kc->nsleep(which_clock, flags, &t); in SYSCALL_DEFINE4()
1564 timer_hashmask = size - 1; in posixtimer_init()