Commit 15365c10 authored by Stanislaw Gruszka's avatar Stanislaw Gruszka Committed by Thomas Gleixner

posix-cpu-timers: Reset expire cache when no timer is running

When a process deletes cpu timer or a timer expires we do not clear
the expiration cache sig->cputimer_expires.

As a result the fastpath_timer_check() which prevents us to loop over
all threads in case no timer is active is not working and we run the
slow path needlessly on every tick.

Zero sig->cputimer_expires in stop_process_timers().
Signed-off-by: default avatarStanislaw Gruszka <sgruszka@redhat.com>
Cc: Ingo Molnar <mingo@elte.hu>
Cc: Oleg Nesterov <oleg@redhat.com>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Hidetoshi Seto <seto.hidetoshi@jp.fujitsu.com>
Cc: Spencer Candland <spencer@bluehost.com>
Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
Signed-off-by: default avatarThomas Gleixner <tglx@linutronix.de>
parent 829b6c1e
...@@ -1060,9 +1060,9 @@ static void check_thread_timers(struct task_struct *tsk, ...@@ -1060,9 +1060,9 @@ static void check_thread_timers(struct task_struct *tsk,
} }
} }
static void stop_process_timers(struct task_struct *tsk) static void stop_process_timers(struct signal_struct *sig)
{ {
struct thread_group_cputimer *cputimer = &tsk->signal->cputimer; struct thread_group_cputimer *cputimer = &sig->cputimer;
unsigned long flags; unsigned long flags;
if (!cputimer->running) if (!cputimer->running)
...@@ -1071,6 +1071,10 @@ static void stop_process_timers(struct task_struct *tsk) ...@@ -1071,6 +1071,10 @@ static void stop_process_timers(struct task_struct *tsk)
spin_lock_irqsave(&cputimer->lock, flags); spin_lock_irqsave(&cputimer->lock, flags);
cputimer->running = 0; cputimer->running = 0;
spin_unlock_irqrestore(&cputimer->lock, flags); spin_unlock_irqrestore(&cputimer->lock, flags);
sig->cputime_expires.prof_exp = cputime_zero;
sig->cputime_expires.virt_exp = cputime_zero;
sig->cputime_expires.sched_exp = 0;
} }
static u32 onecputick; static u32 onecputick;
...@@ -1131,7 +1135,7 @@ static void check_process_timers(struct task_struct *tsk, ...@@ -1131,7 +1135,7 @@ static void check_process_timers(struct task_struct *tsk,
list_empty(&timers[CPUCLOCK_VIRT]) && list_empty(&timers[CPUCLOCK_VIRT]) &&
cputime_eq(sig->it[CPUCLOCK_VIRT].expires, cputime_zero) && cputime_eq(sig->it[CPUCLOCK_VIRT].expires, cputime_zero) &&
list_empty(&timers[CPUCLOCK_SCHED])) { list_empty(&timers[CPUCLOCK_SCHED])) {
stop_process_timers(tsk); stop_process_timers(sig);
return; return;
} }
......
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