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: Thomas Gleixner <tglx@linutronix.de>
Reviewed-by: Frederic Weisbecker <frederic@kernel.org>
Link: https://lkml.kernel.org/r/20190821192921.212129449@linutronix.de
This commit is contained in:
Thomas Gleixner 2019-08-21 21:09:08 +02:00
parent 11b8462f7e
commit 3b495b22d0
1 changed files with 21 additions and 34 deletions

View File

@ -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.