Message ID | 20241125132029.7241-2-patryk.wlazlyn@linux.intel.com (mailing list archive) |
---|---|
State | Changes Requested, archived |
Headers | show |
Series | SRF: Fix offline CPU preventing pc6 entry | expand |
On Mon, Nov 25, 2024 at 2:20 PM Patryk Wlazlyn <patryk.wlazlyn@linux.intel.com> wrote: > > From: "Rafael J. Wysocki" <rafael.j.wysocki@intel.com> > > If the :enter_dead() idle state callback fails for a certain state, > there may be still a shallower state for which it will work. > > Because the only caller of cpuidle_play_dead(), native_play_dead(), > falls back to hlt_play_dead() if it returns an error, it should > better try all of the idle states for which :enter_dead() is present > before failing, so change it accordingly. > > Also notice that the :enter_dead() state callback is not expected > to return on success (the CPU should be "dead" then), so make > cpuidle_play_dead() ignore its return value. > > Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com> > Reviewed-by: Mario Limonciello <mario.limonciello@amd.com> > Tested-by: Mario Limonciello <mario.limonciello@amd.com> # 6.12-rc7 > Reviewed-by: Gautham R. Shenoy <gautham.shenoy@amd.com> This one and the [2/2] are in the mainline as of today, no need to resend them. > --- > drivers/cpuidle/cpuidle.c | 10 +++++++--- > 1 file changed, 7 insertions(+), 3 deletions(-) > > diff --git a/drivers/cpuidle/cpuidle.c b/drivers/cpuidle/cpuidle.c > index 06ace16f9e71..0835da449db8 100644 > --- a/drivers/cpuidle/cpuidle.c > +++ b/drivers/cpuidle/cpuidle.c > @@ -69,11 +69,15 @@ int cpuidle_play_dead(void) > if (!drv) > return -ENODEV; > > - /* Find lowest-power state that supports long-term idle */ > - for (i = drv->state_count - 1; i >= 0; i--) > + for (i = drv->state_count - 1; i >= 0; i--) { > if (drv->states[i].enter_dead) > - return drv->states[i].enter_dead(dev, i); > + drv->states[i].enter_dead(dev, i); > + } > > + /* > + * If :enter_dead() is successful, it will never return, so reaching > + * here means that all of them failed above or were not present. > + */ > return -ENODEV; > } > > -- > 2.47.0 > >
> This one and the [2/2] are in the mainline as of today, no need to resend theM
ACK. Purely RFC. I just want to make sure we are all on the same page.
I'll rebase when we all agree on how to solve the problem.
diff --git a/drivers/cpuidle/cpuidle.c b/drivers/cpuidle/cpuidle.c index 06ace16f9e71..0835da449db8 100644 --- a/drivers/cpuidle/cpuidle.c +++ b/drivers/cpuidle/cpuidle.c @@ -69,11 +69,15 @@ int cpuidle_play_dead(void) if (!drv) return -ENODEV; - /* Find lowest-power state that supports long-term idle */ - for (i = drv->state_count - 1; i >= 0; i--) + for (i = drv->state_count - 1; i >= 0; i--) { if (drv->states[i].enter_dead) - return drv->states[i].enter_dead(dev, i); + drv->states[i].enter_dead(dev, i); + } + /* + * If :enter_dead() is successful, it will never return, so reaching + * here means that all of them failed above or were not present. + */ return -ENODEV; }