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) 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 task_struct *p = timer->it.cpu.task;
struct list_head *head, *listpos; struct list_head *head, *listpos;
struct task_cputime *cputime_expires;
struct cpu_timer_list *const nt = &timer->it.cpu;
struct cpu_timer_list *next; struct cpu_timer_list *next;
if (CPUCLOCK_PERTHREAD(timer->it_clock)) { if (CPUCLOCK_PERTHREAD(timer->it_clock)) {
head = p->posix_cputimers.cpu_timers; head = p->posix_cputimers.cpu_timers + clkidx;
cputime_expires = &p->posix_cputimers.cputime_expires; cpuexp = p->posix_cputimers.expiries + clkidx;
} else { } else {
head = p->signal->posix_cputimers.cpu_timers; head = p->signal->posix_cputimers.cpu_timers + clkidx;
cputime_expires = &p->signal->posix_cputimers.cputime_expires; cpuexp = p->signal->posix_cputimers.expiries + clkidx;
} }
head += CPUCLOCK_WHICH(timer->it_clock);
listpos = head; listpos = head;
list_for_each_entry(next, head, entry) { list_for_each_entry(next, head, entry) {
@ -479,35 +479,22 @@ static void arm_timer(struct k_itimer *timer)
} }
list_add(&nt->entry, listpos); list_add(&nt->entry, listpos);
if (listpos == head) { if (listpos != head)
u64 exp = nt->expires; return;
/* /*
* We are the new earliest-expiring POSIX 1.b timer, hence * We are the new earliest-expiring POSIX 1.b timer, hence
* need to update expiration cache. Take into account that * need to update expiration cache. Take into account that
* for process timers we share expiration cache with itimers * for process timers we share expiration cache with itimers
* and RLIMIT_CPU and for thread timers with RLIMIT_RTTIME. * and RLIMIT_CPU and for thread timers with RLIMIT_RTTIME.
*/ */
if (expires_gt(*cpuexp, newexp))
*cpuexp = newexp;
switch (CPUCLOCK_WHICH(timer->it_clock)) { if (CPUCLOCK_PERTHREAD(timer->it_clock))
case CPUCLOCK_PROF: tick_dep_set_task(p, TICK_DEP_BIT_POSIX_TIMER);
if (expires_gt(cputime_expires->prof_exp, exp)) else
cputime_expires->prof_exp = exp; tick_dep_set_signal(p->signal, TICK_DEP_BIT_POSIX_TIMER);
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);
}
} }
/* /*