mirror of
https://github.com/AuxXxilium/linux_dsm_epyc7002.git
synced 2024-11-24 14:41:02 +07:00
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: Stanislaw 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: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
This commit is contained in:
parent
829b6c1ef4
commit
15365c108e
@ -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)
|
|||||||
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,
|
|||||||
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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user