Skip to content

Commit

Permalink
posix-cpu-timers: Simplify timer queueing
Browse files Browse the repository at this point in the history
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
  • Loading branch information
Thomas Gleixner committed Aug 28, 2019
1 parent 11b8462 commit 3b495b2
Showing 1 changed file with 21 additions and 34 deletions.
55 changes: 21 additions & 34 deletions kernel/time/posix-cpu-timers.c
Original file line number Diff line number Diff line change
Expand Up @@ -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) {
Expand All @@ -479,35 +479,22 @@ 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
* 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.
*/
/*
* 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 (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);
}
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);
}

/*
Expand Down

0 comments on commit 3b495b2

Please sign in to comment.