PM / Domains: Try power off masters in error path of __pm_genpd_poweron()
Subsystems (4)
PATCH 1/1 PM / Domains: Try power off masters in error path of __pm_genpd_poweron()
While powering up a genpd, its domain masters are first being powered up. In the error path of __pm_genpd_poweron(), we didn't care to try power off these domain masters. Let's deal with that to avoid leaving unused PM domains powered.
--- drivers/base/power/domain.c | 30 +++++++++++++++++------------- 1 file changed, 17 insertions(+), 13 deletions(-)
drivers/base/power/domain.c +17 -13
@@ -235,6 +235,18 @@ static int genpd_power_off(struct generic_pm_domain *genpd) }/** +* genpd_queue_power_off_work - Queue up the execution of pm_genpd_poweroff(). +* @genpd: PM domait to power off. +* +* Queue up the execution of pm_genpd_poweroff() unless it's already been done +* before. +*/ +static void genpd_queue_power_off_work (struct generic_pm_domain *genpd) +{ +queue_work (pm_wq, &genpd->power_off_work); +} + +/** * __pm_genpd_poweron - Restore power to a given PM domain and its masters. * @genpd: PM domain to power up. *
@@ -315,8 +327,12 @@ static int __pm_genpd_poweron(struct generic_pm_domain *genpd)return 0 ; err: -list_for_each_entry_continue_reverse (link, &genpd->slave_links, slave_node) +list_for_each_entry_continue_reverse (link, + &genpd->slave_links, + slave_node) {genpd_sd_counter_dec (link->master); +genpd_queue_power_off_work (link->master); + }return ret; }
@@ -490,18 +506,6 @@ static bool genpd_abort_poweroff(struct generic_pm_domain *genpd) }/** -* genpd_queue_power_off_work - Queue up the execution of pm_genpd_poweroff(). -* @genpd: PM domait to power off. -* -* Queue up the execution of pm_genpd_poweroff() unless it's already been done -* before. -*/ -static void genpd_queue_power_off_work (struct generic_pm_domain *genpd) -{ -queue_work (pm_wq, &genpd->power_off_work); -} - -/** * pm_genpd_poweroff - Remove power from a given PM domain. * @genpd: PM domain to power down. *
Signature · 1 line
1.9.1
PATCH 1/1 PM / Domains: Try power off masters in error path of __pm_genpd_poweron()
W dniu 11.06.2015 o 20:51, Ulf Hansson pisze:
Quoted 34 lines
While powering up a genpd, its domain masters are first being powered up. In the error path of
__pm_genpd_poweron(), we didn't care to try power off these domain masters. Let's deal with that to avoid leaving unused PM domains powered.Signed-off-by Ulf Hansson <[email protected]>--- drivers/base/power/domain.c | 30 +++++++++++++++++------------- 1 file changed, 17 insertions(+), 13 deletions(-)drivers/base/power/domain.c +12
-0@@ -235,6 +235,18 @@ static int genpd_power_off(struct generic_pm_domain *genpd) }/** +* genpd_queue_power_off_work - Queue up the execution of pm_genpd_poweroff(). +* @genpd: PM domait to power off. +* +* Queue up the execution of pm_genpd_poweroff() unless it's already been done +* before. +*/ +static void genpd_queue_power_off_work (struct generic_pm_domain *genpd) +{ +queue_work (pm_wq, &genpd->power_off_work); +} + +/** * __pm_genpd_poweron - Restore power to a given PM domain and its masters. * @genpd: PM domain to power up. *
drivers/base/power/domain.c static int __pm_genpd_poweron(struct generic_pm_domain *genpd) · line 334
Quoted 9 lines
drivers/base/power/domain.c +4
-1@@ -315,8 +327,12 @@ static int __pm_genpd_poweron(struct generic_pm_domain *genpd)return 0 ; err: -list_for_each_entry_continue_reverse (link, &genpd->slave_links, slave_node) +list_for_each_entry_continue_reverse (link, + &genpd->slave_links, + slave_node) {genpd_sd_counter_dec (link->master); +genpd_queue_power_off_work (link->master);
It looks sensible to revert work already done however I wonder if this is necessary for each slave. The first successful call to pm_genpd_poweroff() will also walk through slave_links and queue the work.
Best regards,
Krzysztof
Quoted 24 lines
drivers/base/power/domain.c +1
-12+ }return ret; }@@ -490,18 +506,6 @@ static bool genpd_abort_poweroff(struct generic_pm_domain *genpd) }/** -* genpd_queue_power_off_work - Queue up the execution of pm_genpd_poweroff(). -* @genpd: PM domait to power off. -* -* Queue up the execution of pm_genpd_poweroff() unless it's already been done -* before. -*/ -static void genpd_queue_power_off_work (struct generic_pm_domain *genpd) -{ -queue_work (pm_wq, &genpd->power_off_work); -} - -/** * pm_genpd_poweroff - Remove power from a given PM domain. * @genpd: PM domain to power down. *
PATCH 1/1 PM / Domains: Try power off masters in error path of __pm_genpd_poweron()
Quoted 37 lines · Krzysztof Kozlowski
W dniu 11.06.2015 o 20:51, Ulf Hansson pisze:
Quoted 36 lines
While powering up a genpd, its domain masters are first being powered up. In the error path of
__pm_genpd_poweron(), we didn't care to try power off these domain masters. Let's deal with that to avoid leaving unused PM domains powered.Signed-off-by Ulf Hansson <[email protected]>--- drivers/base/power/domain.c | 30 +++++++++++++++++------------- 1 file changed, 17 insertions(+), 13 deletions(-)drivers/base/power/domain.c +12
-0@@ -235,6 +235,18 @@ static int genpd_power_off(struct generic_pm_domain *genpd) }/** +* genpd_queue_power_off_work - Queue up the execution of pm_genpd_poweroff(). +* @genpd: PM domait to power off. +* +* Queue up the execution of pm_genpd_poweroff() unless it's already been done +* before. +*/ +static void genpd_queue_power_off_work (struct generic_pm_domain *genpd) +{ +queue_work (pm_wq, &genpd->power_off_work); +} + +/** * __pm_genpd_poweron - Restore power to a given PM domain and its masters. * @genpd: PM domain to power up. * @@ -315,8 +327,12 @@ static int __pm_genpd_poweron(struct generic_pm_domain *genpd)return 0 ;
Quoted 12 lines
drivers/base/power/domain.c static int __pm_genpd_poweron(struct generic_pm_domain *genpd) · line 334
Quoted 7 lines
drivers/base/power/domain.c +4
-1err: -list_for_each_entry_continue_reverse (link, &genpd->slave_links, slave_node) +list_for_each_entry_continue_reverse (link, + &genpd->slave_links, + slave_node) {genpd_sd_counter_dec (link->master); +genpd_queue_power_off_work (link->master);It looks sensible to revert work already done however I wonder if this is necessary for each slave. The first successful call to
pm_genpd_poweroff()will also walk throughslave_linksand queue the work.
For the current genpd, each slave link represents that the current genpd is a subdomain to another genpd. The corresponding master for each link is the "link->master". As genpds are allowed to have several masters, we can't just try to power off one of them.
Sorry for a delayed response and thanks for your review!
Kind regards
Uffe
PATCH 1/1 PM / Domains: Try power off masters in error path of __pm_genpd_poweron()
2015-06-25 20:17 GMT+09:00 Ulf Hansson <[email protected]>:
Quoted 51 lines · Krzysztof Kozlowski
Quoted 37 lines
W dniu 11.06.2015 o 20:51, Ulf Hansson pisze:
Quoted 36 lines
While powering up a genpd, its domain masters are first being powered up. In the error path of
__pm_genpd_poweron(), we didn't care to try power off these domain masters. Let's deal with that to avoid leaving unused PM domains powered.Signed-off-by Ulf Hansson <[email protected]>--- drivers/base/power/domain.c | 30 +++++++++++++++++------------- 1 file changed, 17 insertions(+), 13 deletions(-)drivers/base/power/domain.c +12
-0@@ -235,6 +235,18 @@ static int genpd_power_off(struct generic_pm_domain *genpd) }/** +* genpd_queue_power_off_work - Queue up the execution of pm_genpd_poweroff(). +* @genpd: PM domait to power off. +* +* Queue up the execution of pm_genpd_poweroff() unless it's already been done +* before. +*/ +static void genpd_queue_power_off_work (struct generic_pm_domain *genpd) +{ +queue_work (pm_wq, &genpd->power_off_work); +} + +/** * __pm_genpd_poweron - Restore power to a given PM domain and its masters. * @genpd: PM domain to power up. * @@ -315,8 +327,12 @@ static int __pm_genpd_poweron(struct generic_pm_domain *genpd)return 0 ;Quoted 12 lines
drivers/base/power/domain.c static int __pm_genpd_poweron(struct generic_pm_domain *genpd) · line 334
Quoted 7 lines
drivers/base/power/domain.c +4
-1err: -list_for_each_entry_continue_reverse (link, &genpd->slave_links, slave_node) +list_for_each_entry_continue_reverse (link, + &genpd->slave_links, + slave_node) {genpd_sd_counter_dec (link->master); +genpd_queue_power_off_work (link->master);It looks sensible to revert work already done however I wonder if this is necessary for each slave. The first successful call to
pm_genpd_poweroff()will also walk throughslave_linksand queue the work.
Quoted 4 lines
For the current genpd, each slave link represents that the current genpd is a subdomain to another genpd. The corresponding master for each link is the "
link->master". As genpds are allowed to have several masters, we can't just try to power off one of them.
Right, makes sense.
Best regards,
Krzysztof
PATCH 1/1 PM / Domains: Try power off masters in error path of __pm_genpd_poweron()
In reply to Ulf HanssonQuoted 6 lines · Ulf Hansson
While powering up a genpd, its domain masters are first being powered up. In the error path of
__pm_genpd_poweron(), we didn't care to try power off these domain masters. Let's deal with that to avoid leaving unused PM domains powered.Signed-off-by Ulf Hansson <[email protected]>
Rafael, just to let you know, this one still applies nicely for me on top of the latest genpd changes.
Kind regards
Uffe
Quoted 63 lines
--- drivers/base/power/domain.c | 30 +++++++++++++++++------------- 1 file changed, 17 insertions(+), 13 deletions(-)drivers/base/power/domain.c +17
-14@@ -235,6 +235,18 @@ static int genpd_power_off(struct generic_pm_domain *genpd) }/** +* genpd_queue_power_off_work - Queue up the execution of pm_genpd_poweroff(). +* @genpd: PM domait to power off. +* +* Queue up the execution of pm_genpd_poweroff() unless it's already been done +* before. +*/ +static void genpd_queue_power_off_work (struct generic_pm_domain *genpd) +{ +queue_work (pm_wq, &genpd->power_off_work); +} + +/** * __pm_genpd_poweron - Restore power to a given PM domain and its masters. * @genpd: PM domain to power up. * @@ -315,8 +327,12 @@ static int __pm_genpd_poweron(struct generic_pm_domain *genpd)return 0 ; err: -list_for_each_entry_continue_reverse (link, &genpd->slave_links, slave_node) +list_for_each_entry_continue_reverse (link, + &genpd->slave_links, + slave_node) {genpd_sd_counter_dec (link->master); +genpd_queue_power_off_work (link->master); + }return ret; }@@ -490,18 +506,6 @@ static bool genpd_abort_poweroff(struct generic_pm_domain *genpd) }/** -* genpd_queue_power_off_work - Queue up the execution of pm_genpd_poweroff(). -* @genpd: PM domait to power off. -* -* Queue up the execution of pm_genpd_poweroff() unless it's already been done -* before. -*/ -static void genpd_queue_power_off_work (struct generic_pm_domain *genpd) -{ -queue_work (pm_wq, &genpd->power_off_work); -} - -/** * pm_genpd_poweroff - Remove power from a given PM domain. * @genpd: PM domain to power down. * -- 1.9.1