From: Frederic Weisbecker <frederic@kernel.org>
To: Anna-Maria Behnsen <anna-maria@linutronix.de>
Cc: linux-kernel@vger.kernel.org,
Peter Zijlstra <peterz@infradead.org>,
John Stultz <jstultz@google.com>,
Thomas Gleixner <tglx@linutronix.de>,
Eric Dumazet <edumazet@google.com>,
"Rafael J . Wysocki" <rafael.j.wysocki@intel.com>,
Arjan van de Ven <arjan@infradead.org>,
"Paul E . McKenney" <paulmck@kernel.org>,
Frederic Weisbecker <fweisbec@gmail.com>,
Rik van Riel <riel@surriel.com>
Subject: Re: [PATCH v5 16/18] timer: Implement the hierarchical pull model
Date: Tue, 14 Mar 2023 17:01:19 +0100 [thread overview]
Message-ID: <ZBCaT/0i7aCZffT3@localhost.localdomain> (raw)
In-Reply-To: <d9b95aba-c37d-961c-3ec4-68f222b6df89@linutronix.de>
Le Tue, Mar 14, 2023 at 03:49:38PM +0100, Anna-Maria Behnsen a écrit :
> On Tue, 14 Mar 2023, Frederic Weisbecker wrote:
>
> > Le Wed, Mar 01, 2023 at 03:17:42PM +0100, Anna-Maria Behnsen a écrit :
> > > diff --git a/kernel/time/timer_migration.c b/kernel/time/timer_migration.c
> > > new file mode 100644
> > > index 000000000000..5a600de3623b
> > > --- /dev/null
> > > +++ b/kernel/time/timer_migration.c
> > > +static bool tmigr_active_up(struct tmigr_group *group,
> > > + struct tmigr_group *child,
> > > + void *ptr)
> > > +{
> > > + union tmigr_state curstate, newstate;
> > > + struct tmigr_walk *data = ptr;
> > > + bool walk_done;
> > > + u32 childmask;
> > > +
> > > + childmask = data->childmask;
> > > + newstate = curstate = data->groupstate;
> > > +
> > > +retry:
> > > + walk_done = true;
> > > +
> > > + if (newstate.migrator == TMIGR_NONE) {
> > > + newstate.migrator = (u8)childmask;
> > > +
> > > + /* Changes need to be propagated */
> > > + walk_done = false;
> > > + }
> > > +
> > > + newstate.active |= (u8)childmask;
> > > +
> > > + newstate.seq++;
> >
> > Are you sure you need this seq counter? What bad scenario can happen without it?
> >
>
> Without the seq counter we might get an inconsistent overall state of the
> groups when the order of propagating two changes of the child to the parent
> changes. To clarify what I mean, let me give you an example what happens
> without seqcount (maybe this should be described more detailed in the union
> tmigr_state description...).
>
> Let's take three groups and four CPUs (CPU2 and CPU3 as well as Group C
> will not change during the scenario):
>
> Group A
> migrator = Group B
> active = Group B, Group C
> / \
> Group B Group C
> migrator = CPU0 migrator = CPU2
> active = CPU0 active = CPU2
> / \ / \
> CPU0 CPU1 CPU2 CPU3
> active idle active idle
>
>
> 1. CPU0 goes idle (changes are updated in Group B; afterwards current
> states of Group B and Group A are stored in the data for walking the
> hierarchy):
>
> Group A
> migrator = Group B
> active = Group B, Group C
> / \
> Group B Group C
> -> migrator = TMIGR_NONE migrator = CPU2
> -> active = active = CPU2
> / \ / \
> CPU0 CPU1 CPU2 CPU3
> -> idle idle active idle
>
>
> 2. CPU1 comes out of idle (changes are update in Group B; afterwards
> current states of Group B and Group A are stored in the data for walking
> the hierarchy):
>
> Group A
> migrator = Group B
> active = Group B, Group C
> / \
> Group B Group C
> -> migrator = CPU1 migrator = CPU2
> -> active = CPU1 active = CPU2
> / \ / \
> CPU0 CPU1 CPU2 CPU3
> idle -> active active idle
>
>
> 3. Here comes the change of the order: Propagating the changes of
> 2. through the hierarchy to group A - nothing to be done, because Group
> B is already up to date.
>
> 4. Propagating the changes of 1. through the hierarchy to group A:
>
> Group A
> -> migrator = Group C
> -> active = Group C
> / \
> Group B Group C
> migrator = CPU1 migrator = CPU2
> active = CPU1 active = CPU2
> / \ / \
> CPU0 CPU1 CPU2 CPU3
> idle active active idle
>
> And now we have this inconsistent overall state..
Ooh I see now. Also that can't ever wrap up since you can only ever have no more than 8 racers
competing on a given node.
Tricky ;)
next prev parent reply other threads:[~2023-03-14 16:01 UTC|newest]
Thread overview: 50+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-03-01 14:17 [PATCH v5 00/18] timer: Move from a push remote at enqueue to a pull at expiry model Anna-Maria Behnsen
2023-03-01 14:17 ` [PATCH v5 01/18] tick-sched: Warn when next tick seems to be in the past Anna-Maria Behnsen
2023-03-01 14:17 ` [PATCH v5 02/18] timer: Add comment to get_next_timer_interrupt() description Anna-Maria Behnsen
2023-04-11 9:36 ` Frederic Weisbecker
2023-04-11 16:10 ` Anna-Maria Behnsen
2023-04-12 11:29 ` Frederic Weisbecker
2023-03-01 14:17 ` [PATCH v5 03/18] timer: Move store of next event into __next_timer_interrupt() Anna-Maria Behnsen
2023-03-21 12:48 ` Peter Zijlstra
2023-04-12 11:32 ` Frederic Weisbecker
2023-03-01 14:17 ` [PATCH v5 04/18] timer: Split next timer interrupt logic Anna-Maria Behnsen
2023-03-01 14:17 ` [PATCH v5 05/18] timer: Rework idle logic Anna-Maria Behnsen
2023-03-01 14:17 ` [PATCH v5 06/18] add_timer_on(): Make sure callers have TIMER_PINNED flag Anna-Maria Behnsen
2023-03-01 14:17 ` [PATCH v5 07/18] timers: Ease code in run_local_timers() Anna-Maria Behnsen
2023-04-12 14:32 ` Frederic Weisbecker
2023-03-01 14:17 ` [PATCH v5 08/18] timers: Create helper function to forward timer base clk Anna-Maria Behnsen
2023-04-12 14:40 ` Frederic Weisbecker
2023-03-01 14:17 ` [PATCH v5 09/18] timer: Keep the pinned timers separate from the others Anna-Maria Behnsen
2023-03-01 14:17 ` [PATCH v5 10/18] timer: Retrieve next expiry of pinned/non-pinned timers seperately Anna-Maria Behnsen
2023-03-01 14:17 ` [PATCH v5 11/18] timer: Split out "get next timer interrupt" functionality Anna-Maria Behnsen
2023-03-09 16:30 ` Frederic Weisbecker
2023-03-09 17:45 ` Frederic Weisbecker
2023-03-21 14:30 ` Peter Zijlstra
2023-04-12 20:34 ` Frederic Weisbecker
2023-03-01 14:17 ` [PATCH v5 12/18] timer: Add get next timer interrupt functionality for remote CPUs Anna-Maria Behnsen
2023-03-01 14:17 ` [PATCH v5 13/18] timer: Restructure internal locking Anna-Maria Behnsen
2023-03-01 14:17 ` [PATCH v5 14/18] timer: Check if timers base is handled already Anna-Maria Behnsen
2023-03-21 14:43 ` Peter Zijlstra
2023-03-01 14:17 ` [PATCH v5 15/18] tick/sched: Split out jiffies update helper function Anna-Maria Behnsen
2023-03-01 14:17 ` [PATCH v5 16/18] timer: Implement the hierarchical pull model Anna-Maria Behnsen
2023-03-14 13:24 ` Frederic Weisbecker
2023-03-14 14:49 ` Anna-Maria Behnsen
2023-03-14 16:01 ` Frederic Weisbecker [this message]
2023-03-21 11:17 ` Frederic Weisbecker
2023-04-04 14:05 ` Anna-Maria Behnsen
2023-04-04 14:32 ` Frederic Weisbecker
2023-03-21 13:25 ` Frederic Weisbecker
2023-04-06 9:12 ` Anna-Maria Behnsen
2023-03-21 15:29 ` Peter Zijlstra
2023-03-21 15:34 ` Peter Zijlstra
2023-03-21 15:40 ` Peter Zijlstra
2023-03-23 9:22 ` Peter Zijlstra
2023-03-23 9:34 ` Peter Zijlstra
2023-03-23 9:47 ` Peter Zijlstra
2023-03-23 12:47 ` Peter Zijlstra
2023-03-23 14:24 ` Peter Zijlstra
2023-04-04 14:56 ` Anna-Maria Behnsen
2023-03-01 14:17 ` [PATCH v5 17/18] timer_migration: Add tracepoints Anna-Maria Behnsen
2023-03-01 14:17 ` [PATCH v5 18/18] timer: Always queue timers on the local CPU Anna-Maria Behnsen
2023-03-21 12:46 ` [PATCH v5 00/18] timer: Move from a push remote at enqueue to a pull at expiry model Peter Zijlstra
2023-04-04 13:35 ` Anna-Maria Behnsen
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=ZBCaT/0i7aCZffT3@localhost.localdomain \
--to=frederic@kernel.org \
--cc=anna-maria@linutronix.de \
--cc=arjan@infradead.org \
--cc=edumazet@google.com \
--cc=fweisbec@gmail.com \
--cc=jstultz@google.com \
--cc=linux-kernel@vger.kernel.org \
--cc=paulmck@kernel.org \
--cc=peterz@infradead.org \
--cc=rafael.j.wysocki@intel.com \
--cc=riel@surriel.com \
--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.