From: Frederic Weisbecker <frederic@kernel.org>
To: Thomas Gleixner <tglx@linutronix.de>
Cc: LKML <linux-kernel@vger.kernel.org>,
Anna-Maria Gleixner <anna-maria@linutronix.de>,
Peter Zijlstra <peterz@infradead.org>,
Juri Lelli <juri.lelli@redhat.com>
Subject: Re: [RFC PATCH 03/10] timer: Simplify LVL_START() and calc_index()
Date: Thu, 2 Jul 2020 14:27:01 +0200 [thread overview]
Message-ID: <20200702122659.GB17670@lenoir> (raw)
In-Reply-To: <87pn9e9lgq.fsf@nanos.tec.linutronix.de>
On Thu, Jul 02, 2020 at 01:59:17PM +0200, Thomas Gleixner wrote:
> Frederic Weisbecker <frederic@kernel.org> writes:
> > LVL_START() makes the first index of a level to start with what would be
> > the value of all bits set of the previous level.
> >
> > For example level 1 starts at 63 instead of 64.
> >
> > To cope with that, calc_index() always adds one offset for the level
> > granularity to the expiry passed in parameter.
> >
> > Yet there is no apparent reason for such fixups so simplify the whole
> > thing.
>
> You sure?
No :o)
>
> > @@ -158,7 +158,7 @@ EXPORT_SYMBOL(jiffies_64);
> > * The time start value for each level to select the bucket at enqueue
> > * time.
> > */
> > -#define LVL_START(n) ((LVL_SIZE - 1) << (((n) - 1) * LVL_CLK_SHIFT))
> > +#define LVL_START(n) (LVL_SIZE << (((n) - 1) * LVL_CLK_SHIFT))
>
> > /* Size of each clock level */
> > #define LVL_BITS 6
> > @@ -489,7 +489,7 @@ static inline void timer_set_idx(struct timer_list *timer, unsigned int idx)
> > */
> > static inline unsigned calc_index(unsigned expires, unsigned lvl)
> > {
> > - expires = (expires + LVL_GRAN(lvl)) >> LVL_SHIFT(lvl);
> > + expires >>= LVL_SHIFT(lvl);
> > return LVL_OFFS(lvl) + (expires & LVL_MASK);
> > }
>
> So with that you move the expiry of each timer one jiffie ahead vs. the
> original code, which violates the guarantee that a timer sleeps at least
> for one jiffie for real and not measured in jiffies.
>
> base->clk = 1
> jiffies = 0
> local_irq_disable()
> -> timer interrupt is raised in HW
> timer->expires = 1
> add_timer(timer)
> ---> index == 1
> local_irq_enable()
> timer interrupt
> jiffies++;
> softirq()
> expire(timer);
>
> So the off by one has a reason.
Fair enough. I didn't know about the one jiffy sleep guarantee.
I'll convert this patch to a comment explaining that off by one,
using your above example.
Thanks!
next prev parent reply other threads:[~2020-07-02 12:27 UTC|newest]
Thread overview: 25+ messages / expand[flat|nested] mbox.gz Atom feed top
2020-07-01 1:10 [RFC PATCH 00/10] timer: Reduce timers softirq (and other optimizations) Frederic Weisbecker
2020-07-01 1:10 ` [RFC PATCH 01/10] timer: Prevent base->clk from moving backward Frederic Weisbecker
2020-07-01 16:35 ` Juri Lelli
2020-07-01 23:20 ` Frederic Weisbecker
2020-07-02 9:59 ` Juri Lelli
2020-07-02 14:04 ` Frederic Weisbecker
2020-07-02 14:32 ` Frederic Weisbecker
2020-07-02 15:57 ` Juri Lelli
2020-07-02 9:48 ` Thomas Gleixner
2020-07-01 1:10 ` [RFC PATCH 02/10] timer: Move trigger_dyntick_cpu() to enqueue_timer() Frederic Weisbecker
2020-07-01 1:10 ` [RFC PATCH 03/10] timer: Simplify LVL_START() and calc_index() Frederic Weisbecker
2020-07-02 11:59 ` Thomas Gleixner
2020-07-02 12:27 ` Frederic Weisbecker [this message]
2020-07-01 1:10 ` [RFC PATCH 04/10] timer: Optimize _next_timer_interrupt() level iteration Frederic Weisbecker
2020-07-01 1:10 ` [RFC PATCH 05/10] timers: Always keep track of next expiry Frederic Weisbecker
2020-07-01 1:10 ` [RFC PATCH 06/10] timer: Reuse next expiry cache after nohz exit Frederic Weisbecker
2020-07-01 1:10 ` [RFC PATCH 07/10] timer: Expand clk forward logic beyond nohz Frederic Weisbecker
2020-07-01 1:10 ` [RFC PATCH 08/10] timer: Spare timer softirq until next expiry Frederic Weisbecker
2020-07-01 1:10 ` [RFC PATCH 09/10] timer: Remove must_forward_clk Frederic Weisbecker
2020-07-01 1:10 ` [RFC PATCH 10/10] timer: Lower base clock forwarding threshold Frederic Weisbecker
2020-07-02 13:21 ` Thomas Gleixner
2020-07-02 13:32 ` Frederic Weisbecker
2020-07-02 15:14 ` Thomas Gleixner
2020-07-03 0:12 ` Frederic Weisbecker
2020-07-03 9:13 ` Thomas Gleixner
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=20200702122659.GB17670@lenoir \
--to=frederic@kernel.org \
--cc=anna-maria@linutronix.de \
--cc=juri.lelli@redhat.com \
--cc=linux-kernel@vger.kernel.org \
--cc=peterz@infradead.org \
--cc=tglx@linutronix.de \
/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.