linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Anna-Maria Behnsen <anna-maria@linutronix.de>
To: Frederic Weisbecker <frederic@kernel.org>
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 15:49:38 +0100 (CET)	[thread overview]
Message-ID: <d9b95aba-c37d-961c-3ec4-68f222b6df89@linutronix.de> (raw)
In-Reply-To: <ZBB1frBCnpG741ma@localhost.localdomain>

[-- Attachment #1: Type: text/plain, Size: 3271 bytes --]

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...

Thanks,

	Anna-Maria

  reply	other threads:[~2023-03-14 14:49 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 [this message]
2023-03-14 16:01       ` Frederic Weisbecker
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=d9b95aba-c37d-961c-3ec4-68f222b6df89@linutronix.de \
    --to=anna-maria@linutronix.de \
    --cc=arjan@infradead.org \
    --cc=edumazet@google.com \
    --cc=frederic@kernel.org \
    --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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).