From: Frederic Weisbecker <frederic@kernel.org>
To: Nicolas Saenz Julienne <nsaenzju@redhat.com>
Cc: He Zhe <zhe.he@windriver.com>,
anna-maria@linutronix.de, linux-kernel@vger.kernel.org,
tglx@linutronix.de
Subject: Re: [PATCH] timers: Fix get_next_timer_interrupt() with no timers pending
Date: Sat, 10 Jul 2021 11:05:35 +0200 [thread overview]
Message-ID: <20210710090535.GA28305@lothringen> (raw)
In-Reply-To: <4409fa71931446d9cabd849431ee0098c9b31292.camel@redhat.com>
On Fri, Jul 09, 2021 at 04:13:25PM +0200, Nicolas Saenz Julienne wrote:
> 31cd0e119d50 ("timers: Recalculate next timer interrupt only when
> necessary") subtly altered get_next_timer_interrupt()'s behaviour. The
> function no longer consistently returns KTIME_MAX with no timers
> pending.
>
> In order to decide if there are any timers pending we check whether the
> next expiry will happen NEXT_TIMER_MAX_DELTA jiffies from now.
> Unfortunately, the next expiry time and the timer base clock are no
> longer updated in unison. The former changes upon certain timer
> operations (enqueue, expire, detach), whereas the latter keeps track of
> jiffies as they move forward. Ultimately breaking the logic above.
>
> A simplified example:
>
> - Upon entering get_next_timer_interrupt() with:
>
> jiffies = 1
> base->clk = 0;
> base->next_expiry = NEXT_TIMER_MAX_DELTA;
>
> 'base->next_expiry == base->clk + NEXT_TIMER_MAX_DELTA', the function
> returns KTIME_MAX.
>
> - 'base->clk' is updated to the jiffies value.
>
> - The next time we enter get_next_timer_interrupt(), taking into account
> no timer operations happened:
>
> base->clk = 1;
> base->next_expiry = NEXT_TIMER_MAX_DELTA;
>
> 'base->next_expiry != base->clk + NEXT_TIMER_MAX_DELTA', the function
> returns a valid expire time, which is incorrect.
>
> This ultimately might unnecessarily rearm sched's timer on nohz_full
> setups, and add latency to the system[1].
>
> So, introduce 'base->timers_pending'[2], update it every time
> 'base->next_expiry' changes, and use it in get_next_timer_interrupt().
>
> [1] See tick_nohz_stop_tick().
> [2] A quick pahole check on x86_64 and arm64 shows it doesn't make
> 'struct timer_base' any bigger.
>
> Fixes: 31cd0e119d50 ("timers: Recalculate next timer interrupt only when necessary")
> Signed-off-by: Nicolas Saenz Julienne <nsaenzju@redhat.com>
He Zhe, does it fix your issue?
Thanks.
next prev parent reply other threads:[~2021-07-10 9:05 UTC|newest]
Thread overview: 16+ messages / expand[flat|nested] mbox.gz Atom feed top
2020-07-23 15:16 [PATCH v2] timers: Recalculate next timer interrupt only when necessary Frederic Weisbecker
2020-07-24 10:59 ` [tip: timers/core] " tip-bot2 for Frederic Weisbecker
2021-07-08 6:43 ` [PATCH v2] " He Zhe
2021-07-08 11:35 ` Frederic Weisbecker
2021-07-08 15:36 ` Frederic Weisbecker
2021-07-09 5:37 ` He Zhe
2021-07-09 8:43 ` Frederic Weisbecker
2021-07-09 9:25 ` He Zhe
2021-07-09 14:06 ` Nicolas Saenz Julienne
2021-07-09 14:13 ` [PATCH] timers: Fix get_next_timer_interrupt() with no timers pending Nicolas Saenz Julienne
2021-07-10 0:52 ` Frederic Weisbecker
2021-07-12 10:19 ` Nicolas Saenz Julienne
2021-07-16 16:38 ` Nicolas Saenz Julienne
2021-07-19 13:54 ` Frederic Weisbecker
2021-07-10 9:05 ` Frederic Weisbecker [this message]
2021-07-12 6:04 ` He Zhe
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20210710090535.GA28305@lothringen \
--to=frederic@kernel.org \
--cc=anna-maria@linutronix.de \
--cc=linux-kernel@vger.kernel.org \
--cc=nsaenzju@redhat.com \
--cc=tglx@linutronix.de \
--cc=zhe.he@windriver.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.