Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 3b495b22 authored by Thomas Gleixner's avatar Thomas Gleixner
Browse files

posix-cpu-timers: Simplify timer queueing



Now that the expiry cache can be accessed as an array, the per clock
checking can be reduced to just comparing the corresponding array elements.

Signed-off-by: default avatarThomas Gleixner <tglx@linutronix.de>
Reviewed-by: default avatarFrederic Weisbecker <frederic@kernel.org>
Link: https://lkml.kernel.org/r/20190821192921.212129449@linutronix.de
parent 11b8462f
Loading
Loading
Loading
Loading
+21 −34
Original line number Diff line number Diff line
@@ -456,20 +456,20 @@ static inline int expires_gt(u64 expires, u64 new_exp)
 */
static void arm_timer(struct k_itimer *timer)
{
	struct cpu_timer_list *const nt = &timer->it.cpu;
	int clkidx = CPUCLOCK_WHICH(timer->it_clock);
	u64 *cpuexp, newexp = timer->it.cpu.expires;
	struct task_struct *p = timer->it.cpu.task;
	struct list_head *head, *listpos;
	struct task_cputime *cputime_expires;
	struct cpu_timer_list *const nt = &timer->it.cpu;
	struct cpu_timer_list *next;

	if (CPUCLOCK_PERTHREAD(timer->it_clock)) {
		head = p->posix_cputimers.cpu_timers;
		cputime_expires = &p->posix_cputimers.cputime_expires;
		head = p->posix_cputimers.cpu_timers + clkidx;
		cpuexp = p->posix_cputimers.expiries + clkidx;
	} else {
		head = p->signal->posix_cputimers.cpu_timers;
		cputime_expires = &p->signal->posix_cputimers.cputime_expires;
		head = p->signal->posix_cputimers.cpu_timers + clkidx;
		cpuexp = p->signal->posix_cputimers.expiries + clkidx;
	}
	head += CPUCLOCK_WHICH(timer->it_clock);

	listpos = head;
	list_for_each_entry(next, head, entry) {
@@ -479,8 +479,8 @@ static void arm_timer(struct k_itimer *timer)
	}
	list_add(&nt->entry, listpos);

	if (listpos == head) {
		u64 exp = nt->expires;
	if (listpos != head)
		return;

	/*
	 * We are the new earliest-expiring POSIX 1.b timer, hence
@@ -488,27 +488,14 @@ static void arm_timer(struct k_itimer *timer)
	 * for process timers we share expiration cache with itimers
	 * and RLIMIT_CPU and for thread timers with RLIMIT_RTTIME.
	 */
	if (expires_gt(*cpuexp, newexp))
		*cpuexp = newexp;

		switch (CPUCLOCK_WHICH(timer->it_clock)) {
		case CPUCLOCK_PROF:
			if (expires_gt(cputime_expires->prof_exp, exp))
				cputime_expires->prof_exp = exp;
			break;
		case CPUCLOCK_VIRT:
			if (expires_gt(cputime_expires->virt_exp, exp))
				cputime_expires->virt_exp = exp;
			break;
		case CPUCLOCK_SCHED:
			if (expires_gt(cputime_expires->sched_exp, exp))
				cputime_expires->sched_exp = exp;
			break;
		}
	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.