Skip to contentSkip to conversation

PM / Domains: Try power off masters in error path of __pm_genpd_poweron()

PATCH New Ulf Hansson 3 participants 5 messages Jun 11, 2015 – Jul 16, 2015

Subsystems (4)
lore
Share & tools
lore
#0 lore raw

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
index 2327613..32dcb80 100644
@@ -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
#1 lore raw

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.

---
 drivers/base/power/domain.c | 30 +++++++++++++++++-------------
 1 file changed, 17 insertions(+), 13 deletions(-)
drivers/base/power/domain.c +12 -0
index 2327613..32dcb80 100644
@@ -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.
  *
#2 lore raw

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.

---
 drivers/base/power/domain.c | 30 +++++++++++++++++-------------
 1 file changed, 17 insertions(+), 13 deletions(-)
drivers/base/power/domain.c +12 -0
index 2327613..32dcb80 100644
@@ -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 -1
  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.

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

#3 lore raw

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.

---
 drivers/base/power/domain.c | 30 +++++++++++++++++-------------
 1 file changed, 17 insertions(+), 13 deletions(-)
drivers/base/power/domain.c +12 -0
index 2327613..32dcb80 100644
@@ -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 -1
  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.

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

#4 lore raw

PATCH 1/1 PM / Domains: Try power off masters in error path of __pm_genpd_poweron()

In reply to Ulf Hansson
Quoted 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.

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
index 2327613..32dcb80 100644
@@ -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