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

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
......@@ -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,26 +488,13 @@ 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);
}
}
/*
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment