[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <YMm7iafJ1mberGIg@hirez.programming.kicks-ass.net>
Date: Wed, 16 Jun 2021 10:51:21 +0200
From: Peter Zijlstra <peterz@...radead.org>
To: Frederic Weisbecker <frederic@...nel.org>
Cc: Thomas Gleixner <tglx@...utronix.de>,
LKML <linux-kernel@...r.kernel.org>,
"Eric W . Biederman" <ebiederm@...ssion.com>,
Oleg Nesterov <oleg@...hat.com>, Ingo Molnar <mingo@...nel.org>
Subject: Re: [PATCH 2/6] posix-cpu-timers: Don't start process wide cputime
counter if timer is disabled
On Fri, Jun 04, 2021 at 01:31:55PM +0200, Frederic Weisbecker wrote:
> If timer_settime() is called with a 0 expiration on a timer that is
> already disabled, the process wide cputime counter will be started
> and won't ever get a chance to be stopped by stop_process_timer() since
> no timer is actually armed to be processed.
>
> This process wide counter might bring some performance hit due to the
> concurrent atomic additions at the thread group scope.
>
> The following snippet is enough to trigger the issue.
>
> void trigger_process_counter(void)
> {
> timer_t id;
> struct itimerspec val = { };
>
> timer_create(CLOCK_PROCESS_CPUTIME_ID, NULL, &id);
> timer_settime(id, TIMER_ABSTIME, &val, NULL);
> timer_delete(id);
> }
>
> So make sure we don't needlessly start it.
>
> Signed-off-by: Frederic Weisbecker <frederic@...nel.org>
> Cc: Oleg Nesterov <oleg@...hat.com>
> Cc: Thomas Gleixner <tglx@...utronix.de>
> Cc: Peter Zijlstra (Intel) <peterz@...radead.org>
> Cc: Ingo Molnar <mingo@...nel.org>
> Cc: Eric W. Biederman <ebiederm@...ssion.com>
> ---
> kernel/time/posix-cpu-timers.c | 11 ++++++++---
> 1 file changed, 8 insertions(+), 3 deletions(-)
>
> diff --git a/kernel/time/posix-cpu-timers.c b/kernel/time/posix-cpu-timers.c
> index aa52fc85dbcb..132fd56fb1cd 100644
> --- a/kernel/time/posix-cpu-timers.c
> +++ b/kernel/time/posix-cpu-timers.c
> @@ -632,10 +632,15 @@ static int posix_cpu_timer_set(struct k_itimer *timer, int timer_flags,
> * times (in arm_timer). With an absolute time, we must
> * check if it's already passed. In short, we need a sample.
> */
> - if (CPUCLOCK_PERTHREAD(timer->it_clock))
> + if (CPUCLOCK_PERTHREAD(timer->it_clock)) {
> val = cpu_clock_sample(clkid, p);
> - else
> - val = cpu_clock_sample_group(clkid, p, true);
> + } else {
> + /*
> + * Sample group but only start the process wide cputime counter
> + * if the timer is to be enabled.
> + */
> + val = cpu_clock_sample_group(clkid, p, !!new_expires);
> + }
The cpu_timer_enqueue() is in arm_timer() and the condition for calling
that is:
'new_expires != 0 && val < new_expires'
Which is not the same as the one you add.
I'm thinking the fundamental problem here is the disconnect between
cpu_timer_enqueue() and pct->timers_active ?
Powered by blists - more mailing lists