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>,
Rik van Riel <riel@surriel.com>,
Steven Rostedt <rostedt@goodmis.org>,
Sebastian Siewior <bigeasy@linutronix.de>,
Giovanni Gherdovich <ggherdovich@suse.cz>,
Lukasz Luba <lukasz.luba@arm.com>,
"Gautham R . Shenoy" <gautham.shenoy@amd.com>,
Srinivas Pandruvada <srinivas.pandruvada@intel.com>,
K Prateek Nayak <kprateek.nayak@amd.com>
Subject: Re: [PATCH v10 18/20] timers: Implement the hierarchical pull model
Date: Mon, 5 Feb 2024 21:28:38 +0100 [thread overview]
Message-ID: <ZcFE9vVTqyVZ_0SC@pavilion.home> (raw)
In-Reply-To: <871q9qucjy.fsf@somnus>
Le Mon, Feb 05, 2024 at 04:59:45PM +0100, Anna-Maria Behnsen a écrit :
> Frederic Weisbecker <frederic@kernel.org> writes:
>
> > Le Mon, Jan 15, 2024 at 03:37:41PM +0100, Anna-Maria Behnsen a écrit :
> >> +static bool tmigr_handle_remote_up(struct tmigr_group *group,
> >> + struct tmigr_group *child,
> >> + void *ptr)
> >> +{
> >> + struct tmigr_remote_data *data = ptr;
> >> + u64 now, next = KTIME_MAX;
> >> + struct tmigr_event *evt;
> >> + unsigned long jif;
> >> + u8 childmask;
> >> +
> >> + jif = data->basej;
> >> + now = data->now;
> >> +
> >> + childmask = data->childmask;
> >> +
> >> +again:
> >> + /*
> >> + * Handle the group only if @childmask is the migrator or if the
> >> + * group has no migrator. Otherwise the group is active and is
> >> + * handled by its own migrator.
> >> + */
> >> + if (!tmigr_check_migrator(group, childmask))
> >> + return true;
> >> +
> >> + raw_spin_lock_irq(&group->lock);
> >> +
> >> + evt = tmigr_next_expired_groupevt(group, now);
> >> +
> >> + if (evt) {
> >> + unsigned int remote_cpu = evt->cpu;
> >> +
> >> + raw_spin_unlock_irq(&group->lock);
> >> +
> >> + next = tmigr_handle_remote_cpu(remote_cpu, now, jif);
> >> +
> >> + /* check if there is another event, that needs to be handled */
> >> + goto again;
> >> + } else {
> >> + raw_spin_unlock_irq(&group->lock);
> >> + }
> >> +
> >> + /*
> >> + * Update of childmask for the next level and keep track of the expiry
> >> + * of the first event that needs to be handled
> >> + */
> >> + data->childmask = group->childmask;
> >> + data->firstexp = next;
> >
> > So assume we have:
> >
> > [GRP1:0]
> > migrator = [GRP0:0]
> > active = [GRP0:0]
> > nextevt = TIMER3
> > / \
> > [GRP0:0] [GRP0:1]
> > migrator = CPU0 migrator = NONE
> > active = CPU0 active = NONE
> > nextevt = KTIME_MAX nextevt = TIMER3
> > / \ / \
> > 0 1 2 3
> > idle idle idle idle (TIMER3)
> >
> > Then CPU 0 goes idle:
> >
> > [GRP1:0]
> > migrator = NONE
> > active = NONE
> > nextevt = TIMER3
> > / \
> > [GRP0:0] [GRP0:1]
> > migrator = NONE migrator = NONE
> > active = NONE active = NONE
> > nextevt = KTIME_MAX nextevt = TIMER3
> > / \ / \
> > 0 1 2 3
> > idle idle idle idle (TIMER3)
> >
> > CPU 0 is the idle migrator and its tmc->wakeup is TIMER3.
> > But CPU 0 has a local timer that expires before TIMER3.
> >
> > When that timer interrupt fires, it raises the softirq, which
> > executes on IRQ tail. So CPU0 eventually calls tmigr_handle_remote()
> > before TIMER3 has expired.
> >
> > This leads to tmigr_next_expired_groupevt() to return NULL and then
> > data->firstexp = KTIME_MAX and then tmc->wakeup = KTIME_MAX.
> >
> > Later on, tmigr_new_timer() is called with a KTIME_MAX global
> > event and so tmc->wakeup stays with KTIME_MAX, ignoring TIMER3.
> >
> > It looks like you need to handle the tmigr_next_expired_groupevt()
> > case returning NULL.
>
> Yes. You are right. group->next_expiry is updated via
> tmigr_next_expired_groupevt(). So I should take this value to rely on
> for the firstevt.
>
> But with this, we do not need the return value of
> tmigr_handle_remote_cpu(). When the upperst level is inactive and there
> is a timer (e.g. propagated there by tmigr_handle_remote_cpu()), the
> return value of tmigr_handle_remote_cpu() is the next_expiry of the top
> level group. But this value is also noticed by walking the hierarchy up
> to the top level with tmigr_handle_remote_up().
Indeed that's a nice simplification!
This also cure an issue with KTIME_MAX overwriting data->firstexp in
tmigr_handle_remote_up() while walking upper level after an expiration
on below level.
Thanks.
next prev parent reply other threads:[~2024-02-05 20:28 UTC|newest]
Thread overview: 89+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-01-15 14:37 [PATCH v10 00/20] timers: Move from a push remote at enqueue to a pull at expiry model Anna-Maria Behnsen
2024-01-15 14:37 ` [PATCH v10 01/20] timers: Restructure get_next_timer_interrupt() Anna-Maria Behnsen
2024-01-17 15:01 ` Frederic Weisbecker
2024-01-15 14:37 ` [PATCH v10 02/20] timers: Split out get next timer interrupt Anna-Maria Behnsen
2024-01-17 15:06 ` Frederic Weisbecker
2024-01-15 14:37 ` [PATCH v10 03/20] timers: Move marking timer bases idle into tick_nohz_stop_tick() Anna-Maria Behnsen
2024-01-17 16:02 ` Frederic Weisbecker
2024-01-22 11:45 ` Anna-Maria Behnsen
2024-01-22 21:49 ` Frederic Weisbecker
2024-02-19 8:52 ` [PATCH v10a] " Anna-Maria Behnsen
2024-02-19 22:37 ` Frederic Weisbecker
2024-02-20 10:48 ` Anna-Maria Behnsen
2024-02-20 11:41 ` Frederic Weisbecker
2024-02-20 12:02 ` Anna-Maria Behnsen
2024-02-20 12:34 ` Frederic Weisbecker
2024-02-20 14:00 ` Anna-Maria Behnsen
2024-02-20 15:10 ` Frederic Weisbecker
2024-02-20 15:23 ` Anna-Maria Behnsen
2024-02-20 15:25 ` Frederic Weisbecker
2024-01-15 14:37 ` [PATCH v10 04/20] timers: Optimization for timer_base_try_to_set_idle() Anna-Maria Behnsen
2024-01-17 16:45 ` Frederic Weisbecker
2024-01-22 11:48 ` Anna-Maria Behnsen
2024-01-22 22:22 ` Frederic Weisbecker
2024-01-15 14:37 ` [PATCH v10 05/20] timers: Introduce add_timer() variants which modify timer flags Anna-Maria Behnsen
2024-01-17 17:01 ` Frederic Weisbecker
2024-01-22 11:50 ` Anna-Maria Behnsen
2024-01-15 14:37 ` [PATCH v10 06/20] workqueue: Use global variant for add_timer() Anna-Maria Behnsen
2024-01-15 14:37 ` [PATCH v10 07/20] timers: add_timer_on(): Make sure TIMER_PINNED flag is set Anna-Maria Behnsen
2024-01-15 14:37 ` [PATCH v10 08/20] timers: Ease code in run_local_timers() Anna-Maria Behnsen
2024-01-15 14:37 ` [PATCH v10 09/20] timers: Split next timer interrupt logic Anna-Maria Behnsen
2024-01-23 14:28 ` Frederic Weisbecker
2024-01-15 14:37 ` [PATCH v10 10/20] timers: Keep the pinned timers separate from the others Anna-Maria Behnsen
2024-01-15 14:37 ` [PATCH v10 11/20] timers: Retrieve next expiry of pinned/non-pinned timers separately Anna-Maria Behnsen
2024-01-15 14:37 ` [PATCH v10 12/20] timers: Split out "get next timer interrupt" functionality Anna-Maria Behnsen
2024-01-15 14:37 ` [PATCH v10 13/20] timers: Add get next timer interrupt functionality for remote CPUs Anna-Maria Behnsen
2024-02-19 16:04 ` Frederic Weisbecker
2024-02-19 16:57 ` Anna-Maria Behnsen
2024-01-15 14:37 ` [PATCH v10 14/20] timers: Restructure internal locking Anna-Maria Behnsen
2024-01-24 13:56 ` Frederic Weisbecker
2024-01-15 14:37 ` [PATCH v10 15/20] timers: Check if timers base is handled already Anna-Maria Behnsen
2024-01-24 14:22 ` Frederic Weisbecker
2024-01-15 14:37 ` [PATCH v10 16/20] tick/sched: Split out jiffies update helper function Anna-Maria Behnsen
2024-01-24 14:42 ` Frederic Weisbecker
2024-01-15 14:37 ` [PATCH v10 17/20] timers: Introduce function to check timer base is_idle flag Anna-Maria Behnsen
2024-01-24 14:52 ` Frederic Weisbecker
2024-01-15 14:37 ` [PATCH v10 18/20] timers: Implement the hierarchical pull model Anna-Maria Behnsen
2024-01-25 14:30 ` Frederic Weisbecker
2024-01-28 15:58 ` Anna-Maria Behnsen
2024-01-30 15:29 ` Frederic Weisbecker
2024-01-30 16:45 ` Anna-Maria Behnsen
2024-01-26 12:53 ` Frederic Weisbecker
2024-01-27 22:54 ` Frederic Weisbecker
2024-01-29 10:50 ` Anna-Maria Behnsen
2024-01-29 22:21 ` Frederic Weisbecker
2024-01-30 13:32 ` Anna-Maria Behnsen
2024-01-29 13:50 ` Paul E. McKenney
2024-01-29 1:04 ` Frederic Weisbecker
2024-01-30 17:56 ` Anna-Maria Behnsen
2024-01-30 21:13 ` Frederic Weisbecker
2024-01-31 11:19 ` Anna-Maria Behnsen
2024-01-30 15:37 ` Frederic Weisbecker
2024-02-01 14:59 ` Anna-Maria Behnsen
2024-02-01 15:05 ` Frederic Weisbecker
2024-02-01 16:15 ` Anna-Maria Behnsen
2024-02-01 17:43 ` Frederic Weisbecker
2024-02-01 20:52 ` Anna-Maria Behnsen
2024-02-05 13:29 ` Anna-Maria Behnsen
2024-02-05 20:30 ` Frederic Weisbecker
2024-02-06 10:06 ` Anna-Maria Behnsen
2024-02-06 10:29 ` Frederic Weisbecker
2024-02-01 16:33 ` Frederic Weisbecker
2024-02-05 15:59 ` Anna-Maria Behnsen
2024-02-05 20:28 ` Frederic Weisbecker [this message]
2024-02-04 22:02 ` Frederic Weisbecker
2024-02-06 11:03 ` Anna-Maria Behnsen
2024-02-06 11:11 ` Frederic Weisbecker
2024-02-04 22:32 ` Frederic Weisbecker
2024-02-06 11:36 ` Anna-Maria Behnsen
2024-02-06 13:21 ` Frederic Weisbecker
2024-02-06 14:13 ` Anna-Maria Behnsen
2024-02-06 14:21 ` Frederic Weisbecker
2024-01-15 14:37 ` [PATCH v10 19/20] timer_migration: Add tracepoints Anna-Maria Behnsen
2024-02-01 16:47 ` Frederic Weisbecker
2024-01-15 14:37 ` [PATCH v10 20/20] timers: Always queue timers on the local CPU Anna-Maria Behnsen
2024-02-01 17:36 ` Frederic Weisbecker
2024-02-01 20:58 ` Anna-Maria Behnsen
2024-02-02 11:57 ` Frederic Weisbecker
2024-01-30 22:07 ` [PATCH v10 00/20] timers: Move from a push remote at enqueue to a pull at expiry model Christian Loehle
2024-02-01 15:03 ` 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=ZcFE9vVTqyVZ_0SC@pavilion.home \
--to=frederic@kernel.org \
--cc=anna-maria@linutronix.de \
--cc=arjan@infradead.org \
--cc=bigeasy@linutronix.de \
--cc=edumazet@google.com \
--cc=gautham.shenoy@amd.com \
--cc=ggherdovich@suse.cz \
--cc=jstultz@google.com \
--cc=kprateek.nayak@amd.com \
--cc=linux-kernel@vger.kernel.org \
--cc=lukasz.luba@arm.com \
--cc=paulmck@kernel.org \
--cc=peterz@infradead.org \
--cc=rafael.j.wysocki@intel.com \
--cc=riel@surriel.com \
--cc=rostedt@goodmis.org \
--cc=srinivas.pandruvada@intel.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.