| // SPDX-License-Identifier: GPL-2.0 | 
 | /* | 
 |  * Implement CPU time clocks for the POSIX clock interface. | 
 |  */ | 
 |  | 
 | #include <linux/sched/signal.h> | 
 | #include <linux/sched/cputime.h> | 
 | #include <linux/posix-timers.h> | 
 | #include <linux/errno.h> | 
 | #include <linux/math64.h> | 
 | #include <linux/uaccess.h> | 
 | #include <linux/kernel_stat.h> | 
 | #include <trace/events/timer.h> | 
 | #include <linux/tick.h> | 
 | #include <linux/workqueue.h> | 
 | #include <linux/compat.h> | 
 | #include <linux/sched/deadline.h> | 
 |  | 
 | #include "posix-timers.h" | 
 |  | 
 | static void posix_cpu_timer_rearm(struct k_itimer *timer); | 
 |  | 
 | void posix_cputimers_group_init(struct posix_cputimers *pct, u64 cpu_limit) | 
 | { | 
 | 	posix_cputimers_init(pct); | 
 | 	if (cpu_limit != RLIM_INFINITY) { | 
 | 		pct->bases[CPUCLOCK_PROF].nextevt = cpu_limit * NSEC_PER_SEC; | 
 | 		pct->timers_active = true; | 
 | 	} | 
 | } | 
 |  | 
 | /* | 
 |  * Called after updating RLIMIT_CPU to run cpu timer and update | 
 |  * tsk->signal->posix_cputimers.bases[clock].nextevt expiration cache if | 
 |  * necessary. Needs siglock protection since other code may update the | 
 |  * expiration cache as well. | 
 |  */ | 
 | void update_rlimit_cpu(struct task_struct *task, unsigned long rlim_new) | 
 | { | 
 | 	u64 nsecs = rlim_new * NSEC_PER_SEC; | 
 |  | 
 | 	spin_lock_irq(&task->sighand->siglock); | 
 | 	set_process_cpu_timer(task, CPUCLOCK_PROF, &nsecs, NULL); | 
 | 	spin_unlock_irq(&task->sighand->siglock); | 
 | } | 
 |  | 
 | /* | 
 |  * Functions for validating access to tasks. | 
 |  */ | 
 | static struct task_struct *lookup_task(const pid_t pid, bool thread, | 
 | 				       bool gettime) | 
 | { | 
 | 	struct task_struct *p; | 
 |  | 
 | 	/* | 
 | 	 * If the encoded PID is 0, then the timer is targeted at current | 
 | 	 * or the process to which current belongs. | 
 | 	 */ | 
 | 	if (!pid) | 
 | 		return thread ? current : current->group_leader; | 
 |  | 
 | 	p = find_task_by_vpid(pid); | 
 | 	if (!p) | 
 | 		return p; | 
 |  | 
 | 	if (thread) | 
 | 		return same_thread_group(p, current) ? p : NULL; | 
 |  | 
 | 	if (gettime) { | 
 | 		/* | 
 | 		 * For clock_gettime(PROCESS) the task does not need to be | 
 | 		 * the actual group leader. tsk->sighand gives | 
 | 		 * access to the group's clock. | 
 | 		 * | 
 | 		 * Timers need the group leader because they take a | 
 | 		 * reference on it and store the task pointer until the | 
 | 		 * timer is destroyed. | 
 | 		 */ | 
 | 		return (p == current || thread_group_leader(p)) ? p : NULL; | 
 | 	} | 
 |  | 
 | 	/* | 
 | 	 * For processes require that p is group leader. | 
 | 	 */ | 
 | 	return has_group_leader_pid(p) ? p : NULL; | 
 | } | 
 |  | 
 | static struct task_struct *__get_task_for_clock(const clockid_t clock, | 
 | 						bool getref, bool gettime) | 
 | { | 
 | 	const bool thread = !!CPUCLOCK_PERTHREAD(clock); | 
 | 	const pid_t pid = CPUCLOCK_PID(clock); | 
 | 	struct task_struct *p; | 
 |  | 
 | 	if (CPUCLOCK_WHICH(clock) >= CPUCLOCK_MAX) | 
 | 		return NULL; | 
 |  | 
 | 	rcu_read_lock(); | 
 | 	p = lookup_task(pid, thread, gettime); | 
 | 	if (p && getref) | 
 | 		get_task_struct(p); | 
 | 	rcu_read_unlock(); | 
 | 	return p; | 
 | } | 
 |  | 
 | static inline struct task_struct *get_task_for_clock(const clockid_t clock) | 
 | { | 
 | 	return __get_task_for_clock(clock, true, false); | 
 | } | 
 |  | 
 | static inline struct task_struct *get_task_for_clock_get(const clockid_t clock) | 
 | { | 
 | 	return __get_task_for_clock(clock, true, true); | 
 | } | 
 |  | 
 | static inline int validate_clock_permissions(const clockid_t clock) | 
 | { | 
 | 	return __get_task_for_clock(clock, false, false) ? 0 : -EINVAL; | 
 | } | 
 |  | 
 | /* | 
 |  * Update expiry time from increment, and increase overrun count, | 
 |  * given the current clock sample. | 
 |  */ | 
 | static u64 bump_cpu_timer(struct k_itimer *timer, u64 now) | 
 | { | 
 | 	u64 delta, incr, expires = timer->it.cpu.node.expires; | 
 | 	int i; | 
 |  | 
 | 	if (!timer->it_interval) | 
 | 		return expires; | 
 |  | 
 | 	if (now < expires) | 
 | 		return expires; | 
 |  | 
 | 	incr = timer->it_interval; | 
 | 	delta = now + incr - expires; | 
 |  | 
 | 	/* Don't use (incr*2 < delta), incr*2 might overflow. */ | 
 | 	for (i = 0; incr < delta - incr; i++) | 
 | 		incr = incr << 1; | 
 |  | 
 | 	for (; i >= 0; incr >>= 1, i--) { | 
 | 		if (delta < incr) | 
 | 			continue; | 
 |  | 
 | 		timer->it.cpu.node.expires += incr; | 
 | 		timer->it_overrun += 1LL << i; | 
 | 		delta -= incr; | 
 | 	} | 
 | 	return timer->it.cpu.node.expires; | 
 | } | 
 |  | 
 | /* Check whether all cache entries contain U64_MAX, i.e. eternal expiry time */ | 
 | static inline bool expiry_cache_is_inactive(const struct posix_cputimers *pct) | 
 | { | 
 | 	return !(~pct->bases[CPUCLOCK_PROF].nextevt | | 
 | 		 ~pct->bases[CPUCLOCK_VIRT].nextevt | | 
 | 		 ~pct->bases[CPUCLOCK_SCHED].nextevt); | 
 | } | 
 |  | 
 | static int | 
 | posix_cpu_clock_getres(const clockid_t which_clock, struct timespec64 *tp) | 
 | { | 
 | 	int error = validate_clock_permissions(which_clock); | 
 |  | 
 | 	if (!error) { | 
 | 		tp->tv_sec = 0; | 
 | 		tp->tv_nsec = ((NSEC_PER_SEC + HZ - 1) / HZ); | 
 | 		if (CPUCLOCK_WHICH(which_clock) == CPUCLOCK_SCHED) { | 
 | 			/* | 
 | 			 * If sched_clock is using a cycle counter, we | 
 | 			 * don't have any idea of its true resolution | 
 | 			 * exported, but it is much more than 1s/HZ. | 
 | 			 */ | 
 | 			tp->tv_nsec = 1; | 
 | 		} | 
 | 	} | 
 | 	return error; | 
 | } | 
 |  | 
 | static int | 
 | posix_cpu_clock_set(const clockid_t clock, const struct timespec64 *tp) | 
 | { | 
 | 	int error = validate_clock_permissions(clock); | 
 |  | 
 | 	/* | 
 | 	 * You can never reset a CPU clock, but we check for other errors | 
 | 	 * in the call before failing with EPERM. | 
 | 	 */ | 
 | 	return error ? : -EPERM; | 
 | } | 
 |  | 
 | /* | 
 |  * Sample a per-thread clock for the given task. clkid is validated. | 
 |  */ | 
 | static u64 cpu_clock_sample(const clockid_t clkid, struct task_struct *p) | 
 | { | 
 | 	u64 utime, stime; | 
 |  | 
 | 	if (clkid == CPUCLOCK_SCHED) | 
 | 		return task_sched_runtime(p); | 
 |  | 
 | 	task_cputime(p, &utime, &stime); | 
 |  | 
 | 	switch (clkid) { | 
 | 	case CPUCLOCK_PROF: | 
 | 		return utime + stime; | 
 | 	case CPUCLOCK_VIRT: | 
 | 		return utime; | 
 | 	default: | 
 | 		WARN_ON_ONCE(1); | 
 | 	} | 
 | 	return 0; | 
 | } | 
 |  | 
 | static inline void store_samples(u64 *samples, u64 stime, u64 utime, u64 rtime) | 
 | { | 
 | 	samples[CPUCLOCK_PROF] = stime + utime; | 
 | 	samples[CPUCLOCK_VIRT] = utime; | 
 | 	samples[CPUCLOCK_SCHED] = rtime; | 
 | } | 
 |  | 
 | static void task_sample_cputime(struct task_struct *p, u64 *samples) | 
 | { | 
 | 	u64 stime, utime; | 
 |  | 
 | 	task_cputime(p, &utime, &stime); | 
 | 	store_samples(samples, stime, utime, p->se.sum_exec_runtime); | 
 | } | 
 |  | 
 | static void proc_sample_cputime_atomic(struct task_cputime_atomic *at, | 
 | 				       u64 *samples) | 
 | { | 
 | 	u64 stime, utime, rtime; | 
 |  | 
 | 	utime = atomic64_read(&at->utime); | 
 | 	stime = atomic64_read(&at->stime); | 
 | 	rtime = atomic64_read(&at->sum_exec_runtime); | 
 | 	store_samples(samples, stime, utime, rtime); | 
 | } | 
 |  | 
 | /* | 
 |  * Set cputime to sum_cputime if sum_cputime > cputime. Use cmpxchg | 
 |  * to avoid race conditions with concurrent updates to cputime. | 
 |  */ | 
 | static inline void __update_gt_cputime(atomic64_t *cputime, u64 sum_cputime) | 
 | { | 
 | 	u64 curr_cputime; | 
 | retry: | 
 | 	curr_cputime = atomic64_read(cputime); | 
 | 	if (sum_cputime > curr_cputime) { | 
 | 		if (atomic64_cmpxchg(cputime, curr_cputime, sum_cputime) != curr_cputime) | 
 | 			goto retry; | 
 | 	} | 
 | } | 
 |  | 
 | static void update_gt_cputime(struct task_cputime_atomic *cputime_atomic, | 
 | 			      struct task_cputime *sum) | 
 | { | 
 | 	__update_gt_cputime(&cputime_atomic->utime, sum->utime); | 
 | 	__update_gt_cputime(&cputime_atomic->stime, sum->stime); | 
 | 	__update_gt_cputime(&cputime_atomic->sum_exec_runtime, sum->sum_exec_runtime); | 
 | } | 
 |  | 
 | /** | 
 |  * thread_group_sample_cputime - Sample cputime for a given task | 
 |  * @tsk:	Task for which cputime needs to be started | 
 |  * @samples:	Storage for time samples | 
 |  * | 
 |  * Called from sys_getitimer() to calculate the expiry time of an active | 
 |  * timer. That means group cputime accounting is already active. Called | 
 |  * with task sighand lock held. | 
 |  * | 
 |  * Updates @times with an uptodate sample of the thread group cputimes. | 
 |  */ | 
 | void thread_group_sample_cputime(struct task_struct *tsk, u64 *samples) | 
 | { | 
 | 	struct thread_group_cputimer *cputimer = &tsk->signal->cputimer; | 
 | 	struct posix_cputimers *pct = &tsk->signal->posix_cputimers; | 
 |  | 
 | 	WARN_ON_ONCE(!pct->timers_active); | 
 |  | 
 | 	proc_sample_cputime_atomic(&cputimer->cputime_atomic, samples); | 
 | } | 
 |  | 
 | /** | 
 |  * thread_group_start_cputime - Start cputime and return a sample | 
 |  * @tsk:	Task for which cputime needs to be started | 
 |  * @samples:	Storage for time samples | 
 |  * | 
 |  * The thread group cputime accouting is avoided when there are no posix | 
 |  * CPU timers armed. Before starting a timer it's required to check whether | 
 |  * the time accounting is active. If not, a full update of the atomic | 
 |  * accounting store needs to be done and the accounting enabled. | 
 |  * | 
 |  * Updates @times with an uptodate sample of the thread group cputimes. | 
 |  */ | 
 | static void thread_group_start_cputime(struct task_struct *tsk, u64 *samples) | 
 | { | 
 | 	struct thread_group_cputimer *cputimer = &tsk->signal->cputimer; | 
 | 	struct posix_cputimers *pct = &tsk->signal->posix_cputimers; | 
 |  | 
 | 	/* Check if cputimer isn't running. This is accessed without locking. */ | 
 | 	if (!READ_ONCE(pct->timers_active)) { | 
 | 		struct task_cputime sum; | 
 |  | 
 | 		/* | 
 | 		 * The POSIX timer interface allows for absolute time expiry | 
 | 		 * values through the TIMER_ABSTIME flag, therefore we have | 
 | 		 * to synchronize the timer to the clock every time we start it. | 
 | 		 */ | 
 | 		thread_group_cputime(tsk, &sum); | 
 | 		update_gt_cputime(&cputimer->cputime_atomic, &sum); | 
 |  | 
 | 		/* | 
 | 		 * We're setting timers_active without a lock. Ensure this | 
 | 		 * only gets written to in one operation. We set it after | 
 | 		 * update_gt_cputime() as a small optimization, but | 
 | 		 * barriers are not required because update_gt_cputime() | 
 | 		 * can handle concurrent updates. | 
 | 		 */ | 
 | 		WRITE_ONCE(pct->timers_active, true); | 
 | 	} | 
 | 	proc_sample_cputime_atomic(&cputimer->cputime_atomic, samples); | 
 | } | 
 |  | 
 | static void __thread_group_cputime(struct task_struct *tsk, u64 *samples) | 
 | { | 
 | 	struct task_cputime ct; | 
 |  | 
 | 	thread_group_cputime(tsk, &ct); | 
 | 	store_samples(samples, ct.stime, ct.utime, ct.sum_exec_runtime); | 
 | } | 
 |  | 
 | /* | 
 |  * Sample a process (thread group) clock for the given task clkid. If the | 
 |  * group's cputime accounting is already enabled, read the atomic | 
 |  * store. Otherwise a full update is required.  Task's sighand lock must be | 
 |  * held to protect the task traversal on a full update. clkid is already | 
 |  * validated. | 
 |  */ | 
 | static u64 cpu_clock_sample_group(const clockid_t clkid, struct task_struct *p, | 
 | 				  bool start) | 
 | { | 
 | 	struct thread_group_cputimer *cputimer = &p->signal->cputimer; | 
 | 	struct posix_cputimers *pct = &p->signal->posix_cputimers; | 
 | 	u64 samples[CPUCLOCK_MAX]; | 
 |  | 
 | 	if (!READ_ONCE(pct->timers_active)) { | 
 | 		if (start) | 
 | 			thread_group_start_cputime(p, samples); | 
 | 		else | 
 | 			__thread_group_cputime(p, samples); | 
 | 	} else { | 
 | 		proc_sample_cputime_atomic(&cputimer->cputime_atomic, samples); | 
 | 	} | 
 |  | 
 | 	return samples[clkid]; | 
 | } | 
 |  | 
 | static int posix_cpu_clock_get(const clockid_t clock, struct timespec64 *tp) | 
 | { | 
 | 	const clockid_t clkid = CPUCLOCK_WHICH(clock); | 
 | 	struct task_struct *tsk; | 
 | 	u64 t; | 
 |  | 
 | 	tsk = get_task_for_clock_get(clock); | 
 | 	if (!tsk) | 
 | 		return -EINVAL; | 
 |  | 
 | 	if (CPUCLOCK_PERTHREAD(clock)) | 
 | 		t = cpu_clock_sample(clkid, tsk); | 
 | 	else | 
 | 		t = cpu_clock_sample_group(clkid, tsk, false); | 
 | 	put_task_struct(tsk); | 
 |  | 
 | 	*tp = ns_to_timespec64(t); | 
 | 	return 0; | 
 | } | 
 |  | 
 | /* | 
 |  * Validate the clockid_t for a new CPU-clock timer, and initialize the timer. | 
 |  * This is called from sys_timer_create() and do_cpu_nanosleep() with the | 
 |  * new timer already all-zeros initialized. | 
 |  */ | 
 | static int posix_cpu_timer_create(struct k_itimer *new_timer) | 
 | { | 
 | 	struct task_struct *p = get_task_for_clock(new_timer->it_clock); | 
 |  | 
 | 	if (!p) | 
 | 		return -EINVAL; | 
 |  | 
 | 	new_timer->kclock = &clock_posix_cpu; | 
 | 	timerqueue_init(&new_timer->it.cpu.node); | 
 | 	new_timer->it.cpu.task = p; | 
 | 	return 0; | 
 | } | 
 |  | 
 | /* | 
 |  * Clean up a CPU-clock timer that is about to be destroyed. | 
 |  * This is called from timer deletion with the timer already locked. | 
 |  * If we return TIMER_RETRY, it's necessary to release the timer's lock | 
 |  * and try again.  (This happens when the timer is in the middle of firing.) | 
 |  */ | 
 | static int posix_cpu_timer_del(struct k_itimer *timer) | 
 | { | 
 | 	struct cpu_timer *ctmr = &timer->it.cpu; | 
 | 	struct task_struct *p = ctmr->task; | 
 | 	struct sighand_struct *sighand; | 
 | 	unsigned long flags; | 
 | 	int ret = 0; | 
 |  | 
 | 	if (WARN_ON_ONCE(!p)) | 
 | 		return -EINVAL; | 
 |  | 
 | 	/* | 
 | 	 * Protect against sighand release/switch in exit/exec and process/ | 
 | 	 * thread timer list entry concurrent read/writes. | 
 | 	 */ | 
 | 	sighand = lock_task_sighand(p, &flags); | 
 | 	if (unlikely(sighand == NULL)) { | 
 | 		/* | 
 | 		 * This raced with the reaping of the task. The exit cleanup | 
 | 		 * should have removed this timer from the timer queue. | 
 | 		 */ | 
 | 		WARN_ON_ONCE(ctmr->head || timerqueue_node_queued(&ctmr->node)); | 
 | 	} else { | 
 | 		if (timer->it.cpu.firing) | 
 | 			ret = TIMER_RETRY; | 
 | 		else | 
 | 			cpu_timer_dequeue(ctmr); | 
 |  | 
 | 		unlock_task_sighand(p, &flags); | 
 | 	} | 
 |  | 
 | 	if (!ret) | 
 | 		put_task_struct(p); | 
 |  | 
 | 	return ret; | 
 | } | 
 |  | 
 | static void cleanup_timerqueue(struct timerqueue_head *head) | 
 | { | 
 | 	struct timerqueue_node *node; | 
 | 	struct cpu_timer *ctmr; | 
 |  | 
 | 	while ((node = timerqueue_getnext(head))) { | 
 | 		timerqueue_del(head, node); | 
 | 		ctmr = container_of(node, struct cpu_timer, node); | 
 | 		ctmr->head = NULL; | 
 | 	} | 
 | } | 
 |  | 
 | /* | 
 |  * Clean out CPU timers which are still armed when a thread exits. The | 
 |  * timers are only removed from the list. No other updates are done. The | 
 |  * corresponding posix timers are still accessible, but cannot be rearmed. | 
 |  * | 
 |  * This must be called with the siglock held. | 
 |  */ | 
 | static void cleanup_timers(struct posix_cputimers *pct) | 
 | { | 
 | 	cleanup_timerqueue(&pct->bases[CPUCLOCK_PROF].tqhead); | 
 | 	cleanup_timerqueue(&pct->bases[CPUCLOCK_VIRT].tqhead); | 
 | 	cleanup_timerqueue(&pct->bases[CPUCLOCK_SCHED].tqhead); | 
 | } | 
 |  | 
 | /* | 
 |  * These are both called with the siglock held, when the current thread | 
 |  * is being reaped.  When the final (leader) thread in the group is reaped, | 
 |  * posix_cpu_timers_exit_group will be called after posix_cpu_timers_exit. | 
 |  */ | 
 | void posix_cpu_timers_exit(struct task_struct *tsk) | 
 | { | 
 | 	cleanup_timers(&tsk->posix_cputimers); | 
 | } | 
 | void posix_cpu_timers_exit_group(struct task_struct *tsk) | 
 | { | 
 | 	cleanup_timers(&tsk->signal->posix_cputimers); | 
 | } | 
 |  | 
 | /* | 
 |  * Insert the timer on the appropriate list before any timers that | 
 |  * expire later.  This must be called with the sighand lock held. | 
 |  */ | 
 | static void arm_timer(struct k_itimer *timer) | 
 | { | 
 | 	int clkidx = CPUCLOCK_WHICH(timer->it_clock); | 
 | 	struct cpu_timer *ctmr = &timer->it.cpu; | 
 | 	u64 newexp = cpu_timer_getexpires(ctmr); | 
 | 	struct task_struct *p = ctmr->task; | 
 | 	struct posix_cputimer_base *base; | 
 |  | 
 | 	if (CPUCLOCK_PERTHREAD(timer->it_clock)) | 
 | 		base = p->posix_cputimers.bases + clkidx; | 
 | 	else | 
 | 		base = p->signal->posix_cputimers.bases + clkidx; | 
 |  | 
 | 	if (!cpu_timer_enqueue(&base->tqhead, ctmr)) | 
 | 		return; | 
 |  | 
 | 	/* | 
 | 	 * We are the new earliest-expiring POSIX 1.b timer, hence | 
 | 	 * need to update expiration cache. Take into account that | 
 | 	 * for process timers we share expiration cache with itimers | 
 | 	 * and RLIMIT_CPU and for thread timers with RLIMIT_RTTIME. | 
 | 	 */ | 
 | 	if (newexp < base->nextevt) | 
 | 		base->nextevt = newexp; | 
 |  | 
 | 	if (CPUCLOCK_PERTHREAD(timer->it_clock)) | 
 | 		tick_dep_set_task(p, TICK_DEP_BIT_POSIX_TIMER); | 
 | 	else | 
 | 		tick_dep_set_signal(p->signal, TICK_DEP_BIT_POSIX_TIMER); | 
 | } | 
 |  | 
 | /* | 
 |  * The timer is locked, fire it and arrange for its reload. | 
 |  */ | 
 | static void cpu_timer_fire(struct k_itimer *timer) | 
 | { | 
 | 	struct cpu_timer *ctmr = &timer->it.cpu; | 
 |  | 
 | 	if ((timer->it_sigev_notify & ~SIGEV_THREAD_ID) == SIGEV_NONE) { | 
 | 		/* | 
 | 		 * User don't want any signal. | 
 | 		 */ | 
 | 		cpu_timer_setexpires(ctmr, 0); | 
 | 	} else if (unlikely(timer->sigq == NULL)) { | 
 | 		/* | 
 | 		 * This a special case for clock_nanosleep, | 
 | 		 * not a normal timer from sys_timer_create. | 
 | 		 */ | 
 | 		wake_up_process(timer->it_process); | 
 | 		cpu_timer_setexpires(ctmr, 0); | 
 | 	} else if (!timer->it_interval) { | 
 | 		/* | 
 | 		 * One-shot timer.  Clear it as soon as it's fired. | 
 | 		 */ | 
 | 		posix_timer_event(timer, 0); | 
 | 		cpu_timer_setexpires(ctmr, 0); | 
 | 	} else if (posix_timer_event(timer, ++timer->it_requeue_pending)) { | 
 | 		/* | 
 | 		 * The signal did not get queued because the signal | 
 | 		 * was ignored, so we won't get any callback to | 
 | 		 * reload the timer.  But we need to keep it | 
 | 		 * ticking in case the signal is deliverable next time. | 
 | 		 */ | 
 | 		posix_cpu_timer_rearm(timer); | 
 | 		++timer->it_requeue_pending; | 
 | 	} | 
 | } | 
 |  | 
 | /* | 
 |  * Guts of sys_timer_settime for CPU timers. | 
 |  * This is called with the timer locked and interrupts disabled. | 
 |  * If we return TIMER_RETRY, it's necessary to release the timer's lock | 
 |  * and try again.  (This happens when the timer is in the middle of firing.) | 
 |  */ | 
 | static int posix_cpu_timer_set(struct k_itimer *timer, int timer_flags, | 
 | 			       struct itimerspec64 *new, struct itimerspec64 *old) | 
 | { | 
 | 	clockid_t clkid = CPUCLOCK_WHICH(timer->it_clock); | 
 | 	u64 old_expires, new_expires, old_incr, val; | 
 | 	struct cpu_timer *ctmr = &timer->it.cpu; | 
 | 	struct task_struct *p = ctmr->task; | 
 | 	struct sighand_struct *sighand; | 
 | 	unsigned long flags; | 
 | 	int ret = 0; | 
 |  | 
 | 	if (WARN_ON_ONCE(!p)) | 
 | 		return -EINVAL; | 
 |  | 
 | 	/* | 
 | 	 * Use the to_ktime conversion because that clamps the maximum | 
 | 	 * value to KTIME_MAX and avoid multiplication overflows. | 
 | 	 */ | 
 | 	new_expires = ktime_to_ns(timespec64_to_ktime(new->it_value)); | 
 |  | 
 | 	/* | 
 | 	 * Protect against sighand release/switch in exit/exec and p->cpu_timers | 
 | 	 * and p->signal->cpu_timers read/write in arm_timer() | 
 | 	 */ | 
 | 	sighand = lock_task_sighand(p, &flags); | 
 | 	/* | 
 | 	 * If p has just been reaped, we can no | 
 | 	 * longer get any information about it at all. | 
 | 	 */ | 
 | 	if (unlikely(sighand == NULL)) | 
 | 		return -ESRCH; | 
 |  | 
 | 	/* | 
 | 	 * Disarm any old timer after extracting its expiry time. | 
 | 	 */ | 
 | 	old_incr = timer->it_interval; | 
 | 	old_expires = cpu_timer_getexpires(ctmr); | 
 |  | 
 | 	if (unlikely(timer->it.cpu.firing)) { | 
 | 		timer->it.cpu.firing = -1; | 
 | 		ret = TIMER_RETRY; | 
 | 	} else { | 
 | 		cpu_timer_dequeue(ctmr); | 
 | 	} | 
 |  | 
 | 	/* | 
 | 	 * We need to sample the current value to convert the new | 
 | 	 * value from to relative and absolute, and to convert the | 
 | 	 * old value from absolute to relative.  To set a process | 
 | 	 * timer, we need a sample to balance the thread expiry | 
 | 	 * times (in arm_timer).  With an absolute time, we must | 
 | 	 * check if it's already passed.  In short, we need a sample. | 
 | 	 */ | 
 | 	if (CPUCLOCK_PERTHREAD(timer->it_clock)) | 
 | 		val = cpu_clock_sample(clkid, p); | 
 | 	else | 
 | 		val = cpu_clock_sample_group(clkid, p, true); | 
 |  | 
 | 	if (old) { | 
 | 		if (old_expires == 0) { | 
 | 			old->it_value.tv_sec = 0; | 
 | 			old->it_value.tv_nsec = 0; | 
 | 		} else { | 
 | 			/* | 
 | 			 * Update the timer in case it has overrun already. | 
 | 			 * If it has, we'll report it as having overrun and | 
 | 			 * with the next reloaded timer already ticking, | 
 | 			 * though we are swallowing that pending | 
 | 			 * notification here to install the new setting. | 
 | 			 */ | 
 | 			u64 exp = bump_cpu_timer(timer, val); | 
 |  | 
 | 			if (val < exp) { | 
 | 				old_expires = exp - val; | 
 | 				old->it_value = ns_to_timespec64(old_expires); | 
 | 			} else { | 
 | 				old->it_value.tv_nsec = 1; | 
 | 				old->it_value.tv_sec = 0; | 
 | 			} | 
 | 		} | 
 | 	} | 
 |  | 
 | 	if (unlikely(ret)) { | 
 | 		/* | 
 | 		 * We are colliding with the timer actually firing. | 
 | 		 * Punt after filling in the timer's old value, and | 
 | 		 * disable this firing since we are already reporting | 
 | 		 * it as an overrun (thanks to bump_cpu_timer above). | 
 | 		 */ | 
 | 		unlock_task_sighand(p, &flags); | 
 | 		goto out; | 
 | 	} | 
 |  | 
 | 	if (new_expires != 0 && !(timer_flags & TIMER_ABSTIME)) { | 
 | 		new_expires += val; | 
 | 	} | 
 |  | 
 | 	/* | 
 | 	 * Install the new expiry time (or zero). | 
 | 	 * For a timer with no notification action, we don't actually | 
 | 	 * arm the timer (we'll just fake it for timer_gettime). | 
 | 	 */ | 
 | 	cpu_timer_setexpires(ctmr, new_expires); | 
 | 	if (new_expires != 0 && val < new_expires) { | 
 | 		arm_timer(timer); | 
 | 	} | 
 |  | 
 | 	unlock_task_sighand(p, &flags); | 
 | 	/* | 
 | 	 * Install the new reload setting, and | 
 | 	 * set up the signal and overrun bookkeeping. | 
 | 	 */ | 
 | 	timer->it_interval = timespec64_to_ktime(new->it_interval); | 
 |  | 
 | 	/* | 
 | 	 * This acts as a modification timestamp for the timer, | 
 | 	 * so any automatic reload attempt will punt on seeing | 
 | 	 * that we have reset the timer manually. | 
 | 	 */ | 
 | 	timer->it_requeue_pending = (timer->it_requeue_pending + 2) & | 
 | 		~REQUEUE_PENDING; | 
 | 	timer->it_overrun_last = 0; | 
 | 	timer->it_overrun = -1; | 
 |  | 
 | 	if (new_expires != 0 && !(val < new_expires)) { | 
 | 		/* | 
 | 		 * The designated time already passed, so we notify | 
 | 		 * immediately, even if the thread never runs to | 
 | 		 * accumulate more time on this clock. | 
 | 		 */ | 
 | 		cpu_timer_fire(timer); | 
 | 	} | 
 |  | 
 | 	ret = 0; | 
 |  out: | 
 | 	if (old) | 
 | 		old->it_interval = ns_to_timespec64(old_incr); | 
 |  | 
 | 	return ret; | 
 | } | 
 |  | 
 | static void posix_cpu_timer_get(struct k_itimer *timer, struct itimerspec64 *itp) | 
 | { | 
 | 	clockid_t clkid = CPUCLOCK_WHICH(timer->it_clock); | 
 | 	struct cpu_timer *ctmr = &timer->it.cpu; | 
 | 	u64 now, expires = cpu_timer_getexpires(ctmr); | 
 | 	struct task_struct *p = ctmr->task; | 
 |  | 
 | 	if (WARN_ON_ONCE(!p)) | 
 | 		return; | 
 |  | 
 | 	/* | 
 | 	 * Easy part: convert the reload time. | 
 | 	 */ | 
 | 	itp->it_interval = ktime_to_timespec64(timer->it_interval); | 
 |  | 
 | 	if (!expires) | 
 | 		return; | 
 |  | 
 | 	/* | 
 | 	 * Sample the clock to take the difference with the expiry time. | 
 | 	 */ | 
 | 	if (CPUCLOCK_PERTHREAD(timer->it_clock)) { | 
 | 		now = cpu_clock_sample(clkid, p); | 
 | 	} else { | 
 | 		struct sighand_struct *sighand; | 
 | 		unsigned long flags; | 
 |  | 
 | 		/* | 
 | 		 * Protect against sighand release/switch in exit/exec and | 
 | 		 * also make timer sampling safe if it ends up calling | 
 | 		 * thread_group_cputime(). | 
 | 		 */ | 
 | 		sighand = lock_task_sighand(p, &flags); | 
 | 		if (unlikely(sighand == NULL)) { | 
 | 			/* | 
 | 			 * The process has been reaped. | 
 | 			 * We can't even collect a sample any more. | 
 | 			 * Disarm the timer, nothing else to do. | 
 | 			 */ | 
 | 			cpu_timer_setexpires(ctmr, 0); | 
 | 			return; | 
 | 		} else { | 
 | 			now = cpu_clock_sample_group(clkid, p, false); | 
 | 			unlock_task_sighand(p, &flags); | 
 | 		} | 
 | 	} | 
 |  | 
 | 	if (now < expires) { | 
 | 		itp->it_value = ns_to_timespec64(expires - now); | 
 | 	} else { | 
 | 		/* | 
 | 		 * The timer should have expired already, but the firing | 
 | 		 * hasn't taken place yet.  Say it's just about to expire. | 
 | 		 */ | 
 | 		itp->it_value.tv_nsec = 1; | 
 | 		itp->it_value.tv_sec = 0; | 
 | 	} | 
 | } | 
 |  | 
 | #define MAX_COLLECTED	20 | 
 |  | 
 | static u64 collect_timerqueue(struct timerqueue_head *head, | 
 | 			      struct list_head *firing, u64 now) | 
 | { | 
 | 	struct timerqueue_node *next; | 
 | 	int i = 0; | 
 |  | 
 | 	while ((next = timerqueue_getnext(head))) { | 
 | 		struct cpu_timer *ctmr; | 
 | 		u64 expires; | 
 |  | 
 | 		ctmr = container_of(next, struct cpu_timer, node); | 
 | 		expires = cpu_timer_getexpires(ctmr); | 
 | 		/* Limit the number of timers to expire at once */ | 
 | 		if (++i == MAX_COLLECTED || now < expires) | 
 | 			return expires; | 
 |  | 
 | 		ctmr->firing = 1; | 
 | 		cpu_timer_dequeue(ctmr); | 
 | 		list_add_tail(&ctmr->elist, firing); | 
 | 	} | 
 |  | 
 | 	return U64_MAX; | 
 | } | 
 |  | 
 | static void collect_posix_cputimers(struct posix_cputimers *pct, u64 *samples, | 
 | 				    struct list_head *firing) | 
 | { | 
 | 	struct posix_cputimer_base *base = pct->bases; | 
 | 	int i; | 
 |  | 
 | 	for (i = 0; i < CPUCLOCK_MAX; i++, base++) { | 
 | 		base->nextevt = collect_timerqueue(&base->tqhead, firing, | 
 | 						    samples[i]); | 
 | 	} | 
 | } | 
 |  | 
 | static inline void check_dl_overrun(struct task_struct *tsk) | 
 | { | 
 | 	if (tsk->dl.dl_overrun) { | 
 | 		tsk->dl.dl_overrun = 0; | 
 | 		__group_send_sig_info(SIGXCPU, SEND_SIG_PRIV, tsk); | 
 | 	} | 
 | } | 
 |  | 
 | static bool check_rlimit(u64 time, u64 limit, int signo, bool rt, bool hard) | 
 | { | 
 | 	if (time < limit) | 
 | 		return false; | 
 |  | 
 | 	if (print_fatal_signals) { | 
 | 		pr_info("%s Watchdog Timeout (%s): %s[%d]\n", | 
 | 			rt ? "RT" : "CPU", hard ? "hard" : "soft", | 
 | 			current->comm, task_pid_nr(current)); | 
 | 	} | 
 | 	__group_send_sig_info(signo, SEND_SIG_PRIV, current); | 
 | 	return true; | 
 | } | 
 |  | 
 | /* | 
 |  * Check for any per-thread CPU timers that have fired and move them off | 
 |  * the tsk->cpu_timers[N] list onto the firing list.  Here we update the | 
 |  * tsk->it_*_expires values to reflect the remaining thread CPU timers. | 
 |  */ | 
 | static void check_thread_timers(struct task_struct *tsk, | 
 | 				struct list_head *firing) | 
 | { | 
 | 	struct posix_cputimers *pct = &tsk->posix_cputimers; | 
 | 	u64 samples[CPUCLOCK_MAX]; | 
 | 	unsigned long soft; | 
 |  | 
 | 	if (dl_task(tsk)) | 
 | 		check_dl_overrun(tsk); | 
 |  | 
 | 	if (expiry_cache_is_inactive(pct)) | 
 | 		return; | 
 |  | 
 | 	task_sample_cputime(tsk, samples); | 
 | 	collect_posix_cputimers(pct, samples, firing); | 
 |  | 
 | 	/* | 
 | 	 * Check for the special case thread timers. | 
 | 	 */ | 
 | 	soft = task_rlimit(tsk, RLIMIT_RTTIME); | 
 | 	if (soft != RLIM_INFINITY) { | 
 | 		/* Task RT timeout is accounted in jiffies. RTTIME is usec */ | 
 | 		unsigned long rttime = tsk->rt.timeout * (USEC_PER_SEC / HZ); | 
 | 		unsigned long hard = task_rlimit_max(tsk, RLIMIT_RTTIME); | 
 |  | 
 | 		/* At the hard limit, send SIGKILL. No further action. */ | 
 | 		if (hard != RLIM_INFINITY && | 
 | 		    check_rlimit(rttime, hard, SIGKILL, true, true)) | 
 | 			return; | 
 |  | 
 | 		/* At the soft limit, send a SIGXCPU every second */ | 
 | 		if (check_rlimit(rttime, soft, SIGXCPU, true, false)) { | 
 | 			soft += USEC_PER_SEC; | 
 | 			tsk->signal->rlim[RLIMIT_RTTIME].rlim_cur = soft; | 
 | 		} | 
 | 	} | 
 |  | 
 | 	if (expiry_cache_is_inactive(pct)) | 
 | 		tick_dep_clear_task(tsk, TICK_DEP_BIT_POSIX_TIMER); | 
 | } | 
 |  | 
 | static inline void stop_process_timers(struct signal_struct *sig) | 
 | { | 
 | 	struct posix_cputimers *pct = &sig->posix_cputimers; | 
 |  | 
 | 	/* Turn off the active flag. This is done without locking. */ | 
 | 	WRITE_ONCE(pct->timers_active, false); | 
 | 	tick_dep_clear_signal(sig, TICK_DEP_BIT_POSIX_TIMER); | 
 | } | 
 |  | 
 | static void check_cpu_itimer(struct task_struct *tsk, struct cpu_itimer *it, | 
 | 			     u64 *expires, u64 cur_time, int signo) | 
 | { | 
 | 	if (!it->expires) | 
 | 		return; | 
 |  | 
 | 	if (cur_time >= it->expires) { | 
 | 		if (it->incr) | 
 | 			it->expires += it->incr; | 
 | 		else | 
 | 			it->expires = 0; | 
 |  | 
 | 		trace_itimer_expire(signo == SIGPROF ? | 
 | 				    ITIMER_PROF : ITIMER_VIRTUAL, | 
 | 				    task_tgid(tsk), cur_time); | 
 | 		__group_send_sig_info(signo, SEND_SIG_PRIV, tsk); | 
 | 	} | 
 |  | 
 | 	if (it->expires && it->expires < *expires) | 
 | 		*expires = it->expires; | 
 | } | 
 |  | 
 | /* | 
 |  * Check for any per-thread CPU timers that have fired and move them | 
 |  * off the tsk->*_timers list onto the firing list.  Per-thread timers | 
 |  * have already been taken off. | 
 |  */ | 
 | static void check_process_timers(struct task_struct *tsk, | 
 | 				 struct list_head *firing) | 
 | { | 
 | 	struct signal_struct *const sig = tsk->signal; | 
 | 	struct posix_cputimers *pct = &sig->posix_cputimers; | 
 | 	u64 samples[CPUCLOCK_MAX]; | 
 | 	unsigned long soft; | 
 |  | 
 | 	/* | 
 | 	 * If there are no active process wide timers (POSIX 1.b, itimers, | 
 | 	 * RLIMIT_CPU) nothing to check. Also skip the process wide timer | 
 | 	 * processing when there is already another task handling them. | 
 | 	 */ | 
 | 	if (!READ_ONCE(pct->timers_active) || pct->expiry_active) | 
 | 		return; | 
 |  | 
 | 	/* | 
 | 	 * Signify that a thread is checking for process timers. | 
 | 	 * Write access to this field is protected by the sighand lock. | 
 | 	 */ | 
 | 	pct->expiry_active = true; | 
 |  | 
 | 	/* | 
 | 	 * Collect the current process totals. Group accounting is active | 
 | 	 * so the sample can be taken directly. | 
 | 	 */ | 
 | 	proc_sample_cputime_atomic(&sig->cputimer.cputime_atomic, samples); | 
 | 	collect_posix_cputimers(pct, samples, firing); | 
 |  | 
 | 	/* | 
 | 	 * Check for the special case process timers. | 
 | 	 */ | 
 | 	check_cpu_itimer(tsk, &sig->it[CPUCLOCK_PROF], | 
 | 			 &pct->bases[CPUCLOCK_PROF].nextevt, | 
 | 			 samples[CPUCLOCK_PROF], SIGPROF); | 
 | 	check_cpu_itimer(tsk, &sig->it[CPUCLOCK_VIRT], | 
 | 			 &pct->bases[CPUCLOCK_VIRT].nextevt, | 
 | 			 samples[CPUCLOCK_VIRT], SIGVTALRM); | 
 |  | 
 | 	soft = task_rlimit(tsk, RLIMIT_CPU); | 
 | 	if (soft != RLIM_INFINITY) { | 
 | 		/* RLIMIT_CPU is in seconds. Samples are nanoseconds */ | 
 | 		unsigned long hard = task_rlimit_max(tsk, RLIMIT_CPU); | 
 | 		u64 ptime = samples[CPUCLOCK_PROF]; | 
 | 		u64 softns = (u64)soft * NSEC_PER_SEC; | 
 | 		u64 hardns = (u64)hard * NSEC_PER_SEC; | 
 |  | 
 | 		/* At the hard limit, send SIGKILL. No further action. */ | 
 | 		if (hard != RLIM_INFINITY && | 
 | 		    check_rlimit(ptime, hardns, SIGKILL, false, true)) | 
 | 			return; | 
 |  | 
 | 		/* At the soft limit, send a SIGXCPU every second */ | 
 | 		if (check_rlimit(ptime, softns, SIGXCPU, false, false)) { | 
 | 			sig->rlim[RLIMIT_CPU].rlim_cur = soft + 1; | 
 | 			softns += NSEC_PER_SEC; | 
 | 		} | 
 |  | 
 | 		/* Update the expiry cache */ | 
 | 		if (softns < pct->bases[CPUCLOCK_PROF].nextevt) | 
 | 			pct->bases[CPUCLOCK_PROF].nextevt = softns; | 
 | 	} | 
 |  | 
 | 	if (expiry_cache_is_inactive(pct)) | 
 | 		stop_process_timers(sig); | 
 |  | 
 | 	pct->expiry_active = false; | 
 | } | 
 |  | 
 | /* | 
 |  * This is called from the signal code (via posixtimer_rearm) | 
 |  * when the last timer signal was delivered and we have to reload the timer. | 
 |  */ | 
 | static void posix_cpu_timer_rearm(struct k_itimer *timer) | 
 | { | 
 | 	clockid_t clkid = CPUCLOCK_WHICH(timer->it_clock); | 
 | 	struct cpu_timer *ctmr = &timer->it.cpu; | 
 | 	struct task_struct *p = ctmr->task; | 
 | 	struct sighand_struct *sighand; | 
 | 	unsigned long flags; | 
 | 	u64 now; | 
 |  | 
 | 	if (WARN_ON_ONCE(!p)) | 
 | 		return; | 
 |  | 
 | 	/* | 
 | 	 * Fetch the current sample and update the timer's expiry time. | 
 | 	 */ | 
 | 	if (CPUCLOCK_PERTHREAD(timer->it_clock)) { | 
 | 		now = cpu_clock_sample(clkid, p); | 
 | 		bump_cpu_timer(timer, now); | 
 | 		if (unlikely(p->exit_state)) | 
 | 			return; | 
 |  | 
 | 		/* Protect timer list r/w in arm_timer() */ | 
 | 		sighand = lock_task_sighand(p, &flags); | 
 | 		if (!sighand) | 
 | 			return; | 
 | 	} else { | 
 | 		/* | 
 | 		 * Protect arm_timer() and timer sampling in case of call to | 
 | 		 * thread_group_cputime(). | 
 | 		 */ | 
 | 		sighand = lock_task_sighand(p, &flags); | 
 | 		if (unlikely(sighand == NULL)) { | 
 | 			/* | 
 | 			 * The process has been reaped. | 
 | 			 * We can't even collect a sample any more. | 
 | 			 */ | 
 | 			cpu_timer_setexpires(ctmr, 0); | 
 | 			return; | 
 | 		} else if (unlikely(p->exit_state) && thread_group_empty(p)) { | 
 | 			/* If the process is dying, no need to rearm */ | 
 | 			goto unlock; | 
 | 		} | 
 | 		now = cpu_clock_sample_group(clkid, p, true); | 
 | 		bump_cpu_timer(timer, now); | 
 | 		/* Leave the sighand locked for the call below.  */ | 
 | 	} | 
 |  | 
 | 	/* | 
 | 	 * Now re-arm for the new expiry time. | 
 | 	 */ | 
 | 	arm_timer(timer); | 
 | unlock: | 
 | 	unlock_task_sighand(p, &flags); | 
 | } | 
 |  | 
 | /** | 
 |  * task_cputimers_expired - Check whether posix CPU timers are expired | 
 |  * | 
 |  * @samples:	Array of current samples for the CPUCLOCK clocks | 
 |  * @pct:	Pointer to a posix_cputimers container | 
 |  * | 
 |  * Returns true if any member of @samples is greater than the corresponding | 
 |  * member of @pct->bases[CLK].nextevt. False otherwise | 
 |  */ | 
 | static inline bool | 
 | task_cputimers_expired(const u64 *samples, struct posix_cputimers *pct) | 
 | { | 
 | 	int i; | 
 |  | 
 | 	for (i = 0; i < CPUCLOCK_MAX; i++) { | 
 | 		if (samples[i] >= pct->bases[i].nextevt) | 
 | 			return true; | 
 | 	} | 
 | 	return false; | 
 | } | 
 |  | 
 | /** | 
 |  * fastpath_timer_check - POSIX CPU timers fast path. | 
 |  * | 
 |  * @tsk:	The task (thread) being checked. | 
 |  * | 
 |  * Check the task and thread group timers.  If both are zero (there are no | 
 |  * timers set) return false.  Otherwise snapshot the task and thread group | 
 |  * timers and compare them with the corresponding expiration times.  Return | 
 |  * true if a timer has expired, else return false. | 
 |  */ | 
 | static inline bool fastpath_timer_check(struct task_struct *tsk) | 
 | { | 
 | 	struct posix_cputimers *pct = &tsk->posix_cputimers; | 
 | 	struct signal_struct *sig; | 
 |  | 
 | 	if (!expiry_cache_is_inactive(pct)) { | 
 | 		u64 samples[CPUCLOCK_MAX]; | 
 |  | 
 | 		task_sample_cputime(tsk, samples); | 
 | 		if (task_cputimers_expired(samples, pct)) | 
 | 			return true; | 
 | 	} | 
 |  | 
 | 	sig = tsk->signal; | 
 | 	pct = &sig->posix_cputimers; | 
 | 	/* | 
 | 	 * Check if thread group timers expired when timers are active and | 
 | 	 * no other thread in the group is already handling expiry for | 
 | 	 * thread group cputimers. These fields are read without the | 
 | 	 * sighand lock. However, this is fine because this is meant to be | 
 | 	 * a fastpath heuristic to determine whether we should try to | 
 | 	 * acquire the sighand lock to handle timer expiry. | 
 | 	 * | 
 | 	 * In the worst case scenario, if concurrently timers_active is set | 
 | 	 * or expiry_active is cleared, but the current thread doesn't see | 
 | 	 * the change yet, the timer checks are delayed until the next | 
 | 	 * thread in the group gets a scheduler interrupt to handle the | 
 | 	 * timer. This isn't an issue in practice because these types of | 
 | 	 * delays with signals actually getting sent are expected. | 
 | 	 */ | 
 | 	if (READ_ONCE(pct->timers_active) && !READ_ONCE(pct->expiry_active)) { | 
 | 		u64 samples[CPUCLOCK_MAX]; | 
 |  | 
 | 		proc_sample_cputime_atomic(&sig->cputimer.cputime_atomic, | 
 | 					   samples); | 
 |  | 
 | 		if (task_cputimers_expired(samples, pct)) | 
 | 			return true; | 
 | 	} | 
 |  | 
 | 	if (dl_task(tsk) && tsk->dl.dl_overrun) | 
 | 		return true; | 
 |  | 
 | 	return false; | 
 | } | 
 |  | 
 | /* | 
 |  * This is called from the timer interrupt handler.  The irq handler has | 
 |  * already updated our counts.  We need to check if any timers fire now. | 
 |  * Interrupts are disabled. | 
 |  */ | 
 | void run_posix_cpu_timers(void) | 
 | { | 
 | 	struct task_struct *tsk = current; | 
 | 	struct k_itimer *timer, *next; | 
 | 	unsigned long flags; | 
 | 	LIST_HEAD(firing); | 
 |  | 
 | 	lockdep_assert_irqs_disabled(); | 
 |  | 
 | 	/* | 
 | 	 * The fast path checks that there are no expired thread or thread | 
 | 	 * group timers.  If that's so, just return. | 
 | 	 */ | 
 | 	if (!fastpath_timer_check(tsk)) | 
 | 		return; | 
 |  | 
 | 	if (!lock_task_sighand(tsk, &flags)) | 
 | 		return; | 
 | 	/* | 
 | 	 * Here we take off tsk->signal->cpu_timers[N] and | 
 | 	 * tsk->cpu_timers[N] all the timers that are firing, and | 
 | 	 * put them on the firing list. | 
 | 	 */ | 
 | 	check_thread_timers(tsk, &firing); | 
 |  | 
 | 	check_process_timers(tsk, &firing); | 
 |  | 
 | 	/* | 
 | 	 * We must release these locks before taking any timer's lock. | 
 | 	 * There is a potential race with timer deletion here, as the | 
 | 	 * siglock now protects our private firing list.  We have set | 
 | 	 * the firing flag in each timer, so that a deletion attempt | 
 | 	 * that gets the timer lock before we do will give it up and | 
 | 	 * spin until we've taken care of that timer below. | 
 | 	 */ | 
 | 	unlock_task_sighand(tsk, &flags); | 
 |  | 
 | 	/* | 
 | 	 * Now that all the timers on our list have the firing flag, | 
 | 	 * no one will touch their list entries but us.  We'll take | 
 | 	 * each timer's lock before clearing its firing flag, so no | 
 | 	 * timer call will interfere. | 
 | 	 */ | 
 | 	list_for_each_entry_safe(timer, next, &firing, it.cpu.elist) { | 
 | 		int cpu_firing; | 
 |  | 
 | 		spin_lock(&timer->it_lock); | 
 | 		list_del_init(&timer->it.cpu.elist); | 
 | 		cpu_firing = timer->it.cpu.firing; | 
 | 		timer->it.cpu.firing = 0; | 
 | 		/* | 
 | 		 * The firing flag is -1 if we collided with a reset | 
 | 		 * of the timer, which already reported this | 
 | 		 * almost-firing as an overrun.  So don't generate an event. | 
 | 		 */ | 
 | 		if (likely(cpu_firing >= 0)) | 
 | 			cpu_timer_fire(timer); | 
 | 		spin_unlock(&timer->it_lock); | 
 | 	} | 
 | } | 
 |  | 
 | /* | 
 |  * Set one of the process-wide special case CPU timers or RLIMIT_CPU. | 
 |  * The tsk->sighand->siglock must be held by the caller. | 
 |  */ | 
 | void set_process_cpu_timer(struct task_struct *tsk, unsigned int clkid, | 
 | 			   u64 *newval, u64 *oldval) | 
 | { | 
 | 	u64 now, *nextevt; | 
 |  | 
 | 	if (WARN_ON_ONCE(clkid >= CPUCLOCK_SCHED)) | 
 | 		return; | 
 |  | 
 | 	nextevt = &tsk->signal->posix_cputimers.bases[clkid].nextevt; | 
 | 	now = cpu_clock_sample_group(clkid, tsk, true); | 
 |  | 
 | 	if (oldval) { | 
 | 		/* | 
 | 		 * We are setting itimer. The *oldval is absolute and we update | 
 | 		 * it to be relative, *newval argument is relative and we update | 
 | 		 * it to be absolute. | 
 | 		 */ | 
 | 		if (*oldval) { | 
 | 			if (*oldval <= now) { | 
 | 				/* Just about to fire. */ | 
 | 				*oldval = TICK_NSEC; | 
 | 			} else { | 
 | 				*oldval -= now; | 
 | 			} | 
 | 		} | 
 |  | 
 | 		if (!*newval) | 
 | 			return; | 
 | 		*newval += now; | 
 | 	} | 
 |  | 
 | 	/* | 
 | 	 * Update expiration cache if this is the earliest timer. CPUCLOCK_PROF | 
 | 	 * expiry cache is also used by RLIMIT_CPU!. | 
 | 	 */ | 
 | 	if (*newval < *nextevt) | 
 | 		*nextevt = *newval; | 
 |  | 
 | 	tick_dep_set_signal(tsk->signal, TICK_DEP_BIT_POSIX_TIMER); | 
 | } | 
 |  | 
 | static int do_cpu_nanosleep(const clockid_t which_clock, int flags, | 
 | 			    const struct timespec64 *rqtp) | 
 | { | 
 | 	struct itimerspec64 it; | 
 | 	struct k_itimer timer; | 
 | 	u64 expires; | 
 | 	int error; | 
 |  | 
 | 	/* | 
 | 	 * Set up a temporary timer and then wait for it to go off. | 
 | 	 */ | 
 | 	memset(&timer, 0, sizeof timer); | 
 | 	spin_lock_init(&timer.it_lock); | 
 | 	timer.it_clock = which_clock; | 
 | 	timer.it_overrun = -1; | 
 | 	error = posix_cpu_timer_create(&timer); | 
 | 	timer.it_process = current; | 
 |  | 
 | 	if (!error) { | 
 | 		static struct itimerspec64 zero_it; | 
 | 		struct restart_block *restart; | 
 |  | 
 | 		memset(&it, 0, sizeof(it)); | 
 | 		it.it_value = *rqtp; | 
 |  | 
 | 		spin_lock_irq(&timer.it_lock); | 
 | 		error = posix_cpu_timer_set(&timer, flags, &it, NULL); | 
 | 		if (error) { | 
 | 			spin_unlock_irq(&timer.it_lock); | 
 | 			return error; | 
 | 		} | 
 |  | 
 | 		while (!signal_pending(current)) { | 
 | 			if (!cpu_timer_getexpires(&timer.it.cpu)) { | 
 | 				/* | 
 | 				 * Our timer fired and was reset, below | 
 | 				 * deletion can not fail. | 
 | 				 */ | 
 | 				posix_cpu_timer_del(&timer); | 
 | 				spin_unlock_irq(&timer.it_lock); | 
 | 				return 0; | 
 | 			} | 
 |  | 
 | 			/* | 
 | 			 * Block until cpu_timer_fire (or a signal) wakes us. | 
 | 			 */ | 
 | 			__set_current_state(TASK_INTERRUPTIBLE); | 
 | 			spin_unlock_irq(&timer.it_lock); | 
 | 			schedule(); | 
 | 			spin_lock_irq(&timer.it_lock); | 
 | 		} | 
 |  | 
 | 		/* | 
 | 		 * We were interrupted by a signal. | 
 | 		 */ | 
 | 		expires = cpu_timer_getexpires(&timer.it.cpu); | 
 | 		error = posix_cpu_timer_set(&timer, 0, &zero_it, &it); | 
 | 		if (!error) { | 
 | 			/* | 
 | 			 * Timer is now unarmed, deletion can not fail. | 
 | 			 */ | 
 | 			posix_cpu_timer_del(&timer); | 
 | 		} | 
 | 		spin_unlock_irq(&timer.it_lock); | 
 |  | 
 | 		while (error == TIMER_RETRY) { | 
 | 			/* | 
 | 			 * We need to handle case when timer was or is in the | 
 | 			 * middle of firing. In other cases we already freed | 
 | 			 * resources. | 
 | 			 */ | 
 | 			spin_lock_irq(&timer.it_lock); | 
 | 			error = posix_cpu_timer_del(&timer); | 
 | 			spin_unlock_irq(&timer.it_lock); | 
 | 		} | 
 |  | 
 | 		if ((it.it_value.tv_sec | it.it_value.tv_nsec) == 0) { | 
 | 			/* | 
 | 			 * It actually did fire already. | 
 | 			 */ | 
 | 			return 0; | 
 | 		} | 
 |  | 
 | 		error = -ERESTART_RESTARTBLOCK; | 
 | 		/* | 
 | 		 * Report back to the user the time still remaining. | 
 | 		 */ | 
 | 		restart = ¤t->restart_block; | 
 | 		restart->nanosleep.expires = expires; | 
 | 		if (restart->nanosleep.type != TT_NONE) | 
 | 			error = nanosleep_copyout(restart, &it.it_value); | 
 | 	} | 
 |  | 
 | 	return error; | 
 | } | 
 |  | 
 | static long posix_cpu_nsleep_restart(struct restart_block *restart_block); | 
 |  | 
 | static int posix_cpu_nsleep(const clockid_t which_clock, int flags, | 
 | 			    const struct timespec64 *rqtp) | 
 | { | 
 | 	struct restart_block *restart_block = ¤t->restart_block; | 
 | 	int error; | 
 |  | 
 | 	/* | 
 | 	 * Diagnose required errors first. | 
 | 	 */ | 
 | 	if (CPUCLOCK_PERTHREAD(which_clock) && | 
 | 	    (CPUCLOCK_PID(which_clock) == 0 || | 
 | 	     CPUCLOCK_PID(which_clock) == task_pid_vnr(current))) | 
 | 		return -EINVAL; | 
 |  | 
 | 	error = do_cpu_nanosleep(which_clock, flags, rqtp); | 
 |  | 
 | 	if (error == -ERESTART_RESTARTBLOCK) { | 
 |  | 
 | 		if (flags & TIMER_ABSTIME) | 
 | 			return -ERESTARTNOHAND; | 
 |  | 
 | 		restart_block->nanosleep.clockid = which_clock; | 
 | 		set_restart_fn(restart_block, posix_cpu_nsleep_restart); | 
 | 	} | 
 | 	return error; | 
 | } | 
 |  | 
 | static long posix_cpu_nsleep_restart(struct restart_block *restart_block) | 
 | { | 
 | 	clockid_t which_clock = restart_block->nanosleep.clockid; | 
 | 	struct timespec64 t; | 
 |  | 
 | 	t = ns_to_timespec64(restart_block->nanosleep.expires); | 
 |  | 
 | 	return do_cpu_nanosleep(which_clock, TIMER_ABSTIME, &t); | 
 | } | 
 |  | 
 | #define PROCESS_CLOCK	make_process_cpuclock(0, CPUCLOCK_SCHED) | 
 | #define THREAD_CLOCK	make_thread_cpuclock(0, CPUCLOCK_SCHED) | 
 |  | 
 | static int process_cpu_clock_getres(const clockid_t which_clock, | 
 | 				    struct timespec64 *tp) | 
 | { | 
 | 	return posix_cpu_clock_getres(PROCESS_CLOCK, tp); | 
 | } | 
 | static int process_cpu_clock_get(const clockid_t which_clock, | 
 | 				 struct timespec64 *tp) | 
 | { | 
 | 	return posix_cpu_clock_get(PROCESS_CLOCK, tp); | 
 | } | 
 | static int process_cpu_timer_create(struct k_itimer *timer) | 
 | { | 
 | 	timer->it_clock = PROCESS_CLOCK; | 
 | 	return posix_cpu_timer_create(timer); | 
 | } | 
 | static int process_cpu_nsleep(const clockid_t which_clock, int flags, | 
 | 			      const struct timespec64 *rqtp) | 
 | { | 
 | 	return posix_cpu_nsleep(PROCESS_CLOCK, flags, rqtp); | 
 | } | 
 | static int thread_cpu_clock_getres(const clockid_t which_clock, | 
 | 				   struct timespec64 *tp) | 
 | { | 
 | 	return posix_cpu_clock_getres(THREAD_CLOCK, tp); | 
 | } | 
 | static int thread_cpu_clock_get(const clockid_t which_clock, | 
 | 				struct timespec64 *tp) | 
 | { | 
 | 	return posix_cpu_clock_get(THREAD_CLOCK, tp); | 
 | } | 
 | static int thread_cpu_timer_create(struct k_itimer *timer) | 
 | { | 
 | 	timer->it_clock = THREAD_CLOCK; | 
 | 	return posix_cpu_timer_create(timer); | 
 | } | 
 |  | 
 | const struct k_clock clock_posix_cpu = { | 
 | 	.clock_getres	= posix_cpu_clock_getres, | 
 | 	.clock_set	= posix_cpu_clock_set, | 
 | 	.clock_get	= posix_cpu_clock_get, | 
 | 	.timer_create	= posix_cpu_timer_create, | 
 | 	.nsleep		= posix_cpu_nsleep, | 
 | 	.timer_set	= posix_cpu_timer_set, | 
 | 	.timer_del	= posix_cpu_timer_del, | 
 | 	.timer_get	= posix_cpu_timer_get, | 
 | 	.timer_rearm	= posix_cpu_timer_rearm, | 
 | }; | 
 |  | 
 | const struct k_clock clock_process = { | 
 | 	.clock_getres	= process_cpu_clock_getres, | 
 | 	.clock_get	= process_cpu_clock_get, | 
 | 	.timer_create	= process_cpu_timer_create, | 
 | 	.nsleep		= process_cpu_nsleep, | 
 | }; | 
 |  | 
 | const struct k_clock clock_thread = { | 
 | 	.clock_getres	= thread_cpu_clock_getres, | 
 | 	.clock_get	= thread_cpu_clock_get, | 
 | 	.timer_create	= thread_cpu_timer_create, | 
 | }; |