Re: [REGRESSION] sched/idle: Sysbench threads regression after f4c31b07b136

"Rafael J. Wysocki (Intel)" <[email protected]> Wed, 29 Jul 2026 20:03:39 +0200
Newsgroups dev.linux.lists.regressions,org.kernel.vger.linux-kernel,org.kernel.vger.linux-pm
Message-ID <CAJZ5v0gnCh_jTnXsgA4pOmrCbPz3k0g1rz+oH6J+QoX2sucMMA@mail.gmail.com>
On Wed, Jul 29, 2026 at 4:36=E2=80=AFAM Zhan Xusheng <zhanxusheng1024@gmail=
.com> wrote:
>
> From: Zhan Xusheng <[email protected]>
>
> On Tue, Jul 28, 2026 at 09:30:39 +0100, Christian Loehle wrote:
> > Interesting, so your guests (no cpuidle) need the tick stopped at every
> > idle entry to not regress, i.e. the below?
> > Is there anything obvious that shows why that would be? Maybe in the
> > hypervisor behaviour?
>
> I think it lines up with the got_tick heuristic rather than anything
> hypervisor-specific in the guest kernel path.
>
> do_idle() resets got_tick to false at the top of every idle episode and
> passes it as stop_tick, so the first idle iteration always calls
> idle_call_stop_or_retain_tick(false); tick_nohz_idle_enter() hasn't stopp=
ed
> the tick at that point, so that takes the retain branch. Only after the
> tick fires once (got_tick becomes true) does a later iteration stop it.
> So with f4c31b the no-driver path leaves the periodic tick armed at the
> start of every idle episode, whereas the old code stopped it
> unconditionally.

Sure.

That's an intentional modification on the premise that stopping the
tick at the beginning of every idle episode would be more overhead
that letting it run until it actually fires.

> That also explains the test results: forcing (false) keeps the retain and
> still regresses, while (true) / the direct tick_nohz_idle_stop_tick()
> restores the old always-stop and recovers.

No, by itself, it doesn't explain anything.  In particular, it doesn't
explain why stopping the tick upfront in every idle episode leads to
better performance.

> The hypervisor is then where the consequence shows up: a guest that leave=
s
> its tick running keeps a ~1/HZ timer pending, so the host sees an imminen=
t
> timer and keeps waking/scheduling the vCPU instead of letting it idle.

Right, but then why is performance better when the vCPU is put to
sleep at the beginning of every idle episode?

> That is at least consistent with the shapes - the x86 shape at HZ=3D1000 =
regressed
> more (-29%) than the arm shape at HZ=3D250 (-10%), i.e. more retained tic=
ks,
> more interference.

What interference do you mean in particular?

It looks like putting an idle vCPU to sleep upfront allows the other
vCPUs to do more work: Is this what you mean?

> For the no-driver bare halt there is no governor/state selection that a r=
etained tick could help, so stopping
> unconditionally is strictly better.

Well, I'm not sure I can agree with this statement just yet.