Message ID | 1490005163-28633-4-git-send-email-ulf.hansson@linaro.org (mailing list archive) |
---|---|
State | Mainlined |
Delegated to: | Rafael Wysocki |
Headers | show |
On 20-03-17, 11:19, Ulf Hansson wrote: > The current code in genpd_sync_power_off(), doesn't care about potential > errors being returned from genpd's ->power_off() callback. > > Obviously this behaviour could lead to problems, such as incorrectly > setting the genpd's status to GPD_STATE_POWER_OFF, but also to incorrectly > decrease the subdomain count for the masters, which potentially allows them > to be powered off in the next recursive call to genpd_sync_power_off(). > > Let's fix this behaviour by bailing out when the ->power_off() callback > returns an error code. > > Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org> > --- > drivers/base/power/domain.c | 3 ++- > 1 file changed, 2 insertions(+), 1 deletion(-) > > diff --git a/drivers/base/power/domain.c b/drivers/base/power/domain.c > index e63712d..8a2bfc8 100644 > --- a/drivers/base/power/domain.c > +++ b/drivers/base/power/domain.c > @@ -767,7 +767,8 @@ static void genpd_sync_power_off(struct generic_pm_domain *genpd, bool use_lock, > > /* Choose the deepest state when suspending */ > genpd->state_idx = genpd->state_count - 1; > - _genpd_power_off(genpd, false); > + if (_genpd_power_off(genpd, false)) > + return; > > genpd->status = GPD_STATE_POWER_OFF; Reviewed-by: Viresh Kumar <viresh.kumar@linaro.org>
On Mon, Mar 20, 2017 at 11:19 AM, Ulf Hansson <ulf.hansson@linaro.org> wrote: > The current code in genpd_sync_power_off(), doesn't care about potential > errors being returned from genpd's ->power_off() callback. > > Obviously this behaviour could lead to problems, such as incorrectly > setting the genpd's status to GPD_STATE_POWER_OFF, but also to incorrectly > decrease the subdomain count for the masters, which potentially allows them > to be powered off in the next recursive call to genpd_sync_power_off(). > > Let's fix this behaviour by bailing out when the ->power_off() callback > returns an error code. > > Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org> Reviewed-by: Geert Uytterhoeven <geert+renesas@glider.be> Gr{oetje,eeting}s, Geert -- Geert Uytterhoeven -- There's lots of Linux beyond ia32 -- geert@linux-m68k.org In personal conversations with technical people, I call myself a hacker. But when I'm talking to journalists I just say "programmer" or something like that. -- Linus Torvalds
On Monday, March 20, 2017 11:19:22 AM Ulf Hansson wrote: > The current code in genpd_sync_power_off(), doesn't care about potential > errors being returned from genpd's ->power_off() callback. > > Obviously this behaviour could lead to problems, such as incorrectly > setting the genpd's status to GPD_STATE_POWER_OFF, but also to incorrectly > decrease the subdomain count for the masters, which potentially allows them > to be powered off in the next recursive call to genpd_sync_power_off(). > > Let's fix this behaviour by bailing out when the ->power_off() callback > returns an error code. > > Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org> Reviewed-by: Bartlomiej Zolnierkiewicz <b.zolnierkie@samsung.com> Best regards, -- Bartlomiej Zolnierkiewicz Samsung R&D Institute Poland Samsung Electronics
diff --git a/drivers/base/power/domain.c b/drivers/base/power/domain.c index e63712d..8a2bfc8 100644 --- a/drivers/base/power/domain.c +++ b/drivers/base/power/domain.c @@ -767,7 +767,8 @@ static void genpd_sync_power_off(struct generic_pm_domain *genpd, bool use_lock, /* Choose the deepest state when suspending */ genpd->state_idx = genpd->state_count - 1; - _genpd_power_off(genpd, false); + if (_genpd_power_off(genpd, false)) + return; genpd->status = GPD_STATE_POWER_OFF;
The current code in genpd_sync_power_off(), doesn't care about potential errors being returned from genpd's ->power_off() callback. Obviously this behaviour could lead to problems, such as incorrectly setting the genpd's status to GPD_STATE_POWER_OFF, but also to incorrectly decrease the subdomain count for the masters, which potentially allows them to be powered off in the next recursive call to genpd_sync_power_off(). Let's fix this behaviour by bailing out when the ->power_off() callback returns an error code. Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org> --- drivers/base/power/domain.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)