[2/3] PM: domains: Consolidate genpd_restore_noirq() and genpd_resume_noirq()

Message ID 20221016095815.2550034-3-shawn.guo@linaro.org
State New
Headers
Series Manage domain power state for hibernate freeze |

Commit Message

Shawn Guo Oct. 16, 2022, 9:58 a.m. UTC
  Most of the logic between genpd_restore_noirq() and genpd_resume_noirq()
are same except GENPD_STATE_OFF status reset for hibernation restore.
The suspended_count decrement for restore should be the right thing to do
anyway, considering there is an increment in genpd_finish_suspend() for
hibernation.

Consolidate genpd_restore_noirq() and genpd_resume_noirq() into
genpd_finish_resume() and handle GENPD_STATE_OFF status reset for
restore case specially.

Signed-off-by: Shawn Guo <shawn.guo@linaro.org>
---
 drivers/base/power/domain.c | 70 ++++++++++++++++++-------------------
 1 file changed, 35 insertions(+), 35 deletions(-)
  

Comments

kernel test robot Oct. 17, 2022, 2:49 p.m. UTC | #1
Hi Shawn,

I love your patch! Perhaps something to improve:

[auto build test WARNING on rafael-pm/linux-next]
[also build test WARNING on linus/master v6.1-rc1 next-20221017]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch#_base_tree_information]

url:    https://github.com/intel-lab-lkp/linux/commits/Shawn-Guo/Manage-domain-power-state-for-hibernate-freeze/20221017-114450
base:   https://git.kernel.org/pub/scm/linux/kernel/git/rafael/linux-pm.git linux-next
patch link:    https://lore.kernel.org/r/20221016095815.2550034-3-shawn.guo%40linaro.org
patch subject: [PATCH 2/3] PM: domains: Consolidate genpd_restore_noirq() and genpd_resume_noirq()
config: xtensa-randconfig-r032-20221017
compiler: xtensa-linux-gcc (GCC) 12.1.0
reproduce (this is a W=1 build):
        wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross
        chmod +x ~/bin/make.cross
        # https://github.com/intel-lab-lkp/linux/commit/07af89f71f5cf3e02a29c7da292968404e8ae5be
        git remote add linux-review https://github.com/intel-lab-lkp/linux
        git fetch --no-tags linux-review Shawn-Guo/Manage-domain-power-state-for-hibernate-freeze/20221017-114450
        git checkout 07af89f71f5cf3e02a29c7da292968404e8ae5be
        # save the config file
        mkdir build_dir && cp config build_dir/.config
        COMPILER_INSTALL_PATH=$HOME/0day COMPILER=gcc-12.1.0 make.cross W=1 O=build_dir ARCH=xtensa SHELL=/bin/bash drivers/base/power/

If you fix the issue, kindly add following tag where applicable
| Reported-by: kernel test robot <lkp@intel.com>

All warnings (new ones prefixed by >>):

>> drivers/base/power/domain.c:1258: warning: expecting prototype for genpd_resume_noirq(). Prototype was for genpd_finish_resume() instead


vim +1258 drivers/base/power/domain.c

10da65423fdbee Mikko Perttunen   2017-06-22  1248  
596ba34bcd2978 Rafael J. Wysocki 2011-07-01  1249  /**
07af89f71f5cf3 Shawn Guo         2022-10-16  1250   * genpd_resume_noirq - Completion of resume of device in an I/O PM domain.
596ba34bcd2978 Rafael J. Wysocki 2011-07-01  1251   * @dev: Device to resume.
07af89f71f5cf3 Shawn Guo         2022-10-16  1252   * @resume_noirq: Generic resume_noirq callback.
596ba34bcd2978 Rafael J. Wysocki 2011-07-01  1253   *
0496c8ae366724 Rafael J. Wysocki 2012-01-29  1254   * Restore power to the device's PM domain, if necessary, and start the device.
596ba34bcd2978 Rafael J. Wysocki 2011-07-01  1255   */
07af89f71f5cf3 Shawn Guo         2022-10-16  1256  static int genpd_finish_resume(struct device *dev,
07af89f71f5cf3 Shawn Guo         2022-10-16  1257  			       int (*resume_noirq)(struct device *dev))
596ba34bcd2978 Rafael J. Wysocki 2011-07-01 @1258  {
596ba34bcd2978 Rafael J. Wysocki 2011-07-01  1259  	struct generic_pm_domain *genpd;
a935424bb658f9 Ulf Hansson       2018-01-10  1260  	int ret;
596ba34bcd2978 Rafael J. Wysocki 2011-07-01  1261  
596ba34bcd2978 Rafael J. Wysocki 2011-07-01  1262  	dev_dbg(dev, "%s()\n", __func__);
596ba34bcd2978 Rafael J. Wysocki 2011-07-01  1263  
596ba34bcd2978 Rafael J. Wysocki 2011-07-01  1264  	genpd = dev_to_genpd(dev);
596ba34bcd2978 Rafael J. Wysocki 2011-07-01  1265  	if (IS_ERR(genpd))
596ba34bcd2978 Rafael J. Wysocki 2011-07-01  1266  		return -EINVAL;
596ba34bcd2978 Rafael J. Wysocki 2011-07-01  1267  
4e1d9a737d00f2 Patrice Chotard   2020-11-19  1268  	if (device_wakeup_path(dev) && genpd_is_active_wakeup(genpd))
07af89f71f5cf3 Shawn Guo         2022-10-16  1269  		return resume_noirq(dev);
596ba34bcd2978 Rafael J. Wysocki 2011-07-01  1270  
0883ac038be12c Ulf Hansson       2017-02-08  1271  	genpd_lock(genpd);
07af89f71f5cf3 Shawn Guo         2022-10-16  1272  
07af89f71f5cf3 Shawn Guo         2022-10-16  1273  	/*
07af89f71f5cf3 Shawn Guo         2022-10-16  1274  	 * Special handling for hibernation restore:
07af89f71f5cf3 Shawn Guo         2022-10-16  1275  	 * At this point suspended_count == 0 means we are being run for the
07af89f71f5cf3 Shawn Guo         2022-10-16  1276  	 * first time for the given domain in the present cycle.
07af89f71f5cf3 Shawn Guo         2022-10-16  1277  	 */
07af89f71f5cf3 Shawn Guo         2022-10-16  1278  	if (resume_noirq == pm_generic_restore_noirq &&
07af89f71f5cf3 Shawn Guo         2022-10-16  1279  	    genpd->suspended_count++ == 0) {
07af89f71f5cf3 Shawn Guo         2022-10-16  1280  		/*
07af89f71f5cf3 Shawn Guo         2022-10-16  1281  		 * The boot kernel might put the domain into arbitrary state,
07af89f71f5cf3 Shawn Guo         2022-10-16  1282  		 * so make it appear as powered off to genpd_sync_power_on(),
07af89f71f5cf3 Shawn Guo         2022-10-16  1283  		 * so that it tries to power it on in case it was really off.
07af89f71f5cf3 Shawn Guo         2022-10-16  1284  		 */
07af89f71f5cf3 Shawn Guo         2022-10-16  1285  		genpd->status = GENPD_STATE_OFF;
07af89f71f5cf3 Shawn Guo         2022-10-16  1286  	}
07af89f71f5cf3 Shawn Guo         2022-10-16  1287  
0883ac038be12c Ulf Hansson       2017-02-08  1288  	genpd_sync_power_on(genpd, true, 0);
596ba34bcd2978 Rafael J. Wysocki 2011-07-01  1289  	genpd->suspended_count--;
0883ac038be12c Ulf Hansson       2017-02-08  1290  	genpd_unlock(genpd);
f721889ff65afa Rafael J. Wysocki 2011-07-01  1291  
17218e0092f8c7 Rafael J. Wysocki 2018-01-12  1292  	if (genpd->dev_ops.stop && genpd->dev_ops.start &&
17218e0092f8c7 Rafael J. Wysocki 2018-01-12  1293  	    !pm_runtime_status_suspended(dev)) {
17218e0092f8c7 Rafael J. Wysocki 2018-01-12  1294  		ret = genpd_start_dev(genpd, dev);
10da65423fdbee Mikko Perttunen   2017-06-22  1295  		if (ret)
10da65423fdbee Mikko Perttunen   2017-06-22  1296  			return ret;
a935424bb658f9 Ulf Hansson       2018-01-10  1297  	}
10da65423fdbee Mikko Perttunen   2017-06-22  1298  
a935424bb658f9 Ulf Hansson       2018-01-10  1299  	return pm_generic_resume_noirq(dev);
596ba34bcd2978 Rafael J. Wysocki 2011-07-01  1300  }
596ba34bcd2978 Rafael J. Wysocki 2011-07-01  1301
  
Shawn Guo Oct. 18, 2022, 2:11 a.m. UTC | #2
On Mon, Oct 17, 2022 at 10:50 PM kernel test robot <lkp@intel.com> wrote:
>
> Hi Shawn,
>
> I love your patch! Perhaps something to improve:
>
> [auto build test WARNING on rafael-pm/linux-next]
> [also build test WARNING on linus/master v6.1-rc1 next-20221017]
> [If your patch is applied to the wrong git tree, kindly drop us a note.
> And when submitting patch, we suggest to use '--base' as documented in
> https://git-scm.com/docs/git-format-patch#_base_tree_information]
>
> url:    https://github.com/intel-lab-lkp/linux/commits/Shawn-Guo/Manage-domain-power-state-for-hibernate-freeze/20221017-114450
> base:   https://git.kernel.org/pub/scm/linux/kernel/git/rafael/linux-pm.git linux-next
> patch link:    https://lore.kernel.org/r/20221016095815.2550034-3-shawn.guo%40linaro.org
> patch subject: [PATCH 2/3] PM: domains: Consolidate genpd_restore_noirq() and genpd_resume_noirq()
> config: xtensa-randconfig-r032-20221017
> compiler: xtensa-linux-gcc (GCC) 12.1.0
> reproduce (this is a W=1 build):
>         wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross
>         chmod +x ~/bin/make.cross
>         # https://github.com/intel-lab-lkp/linux/commit/07af89f71f5cf3e02a29c7da292968404e8ae5be
>         git remote add linux-review https://github.com/intel-lab-lkp/linux
>         git fetch --no-tags linux-review Shawn-Guo/Manage-domain-power-state-for-hibernate-freeze/20221017-114450
>         git checkout 07af89f71f5cf3e02a29c7da292968404e8ae5be
>         # save the config file
>         mkdir build_dir && cp config build_dir/.config
>         COMPILER_INSTALL_PATH=$HOME/0day COMPILER=gcc-12.1.0 make.cross W=1 O=build_dir ARCH=xtensa SHELL=/bin/bash drivers/base/power/
>
> If you fix the issue, kindly add following tag where applicable
> | Reported-by: kernel test robot <lkp@intel.com>
>
> All warnings (new ones prefixed by >>):
>
> >> drivers/base/power/domain.c:1258: warning: expecting prototype for genpd_resume_noirq(). Prototype was for genpd_finish_resume() instead

It will be fixed in the next version.

Shawn
  

Patch

diff --git a/drivers/base/power/domain.c b/drivers/base/power/domain.c
index 01f5644938e0..fc0ac9e6050e 100644
--- a/drivers/base/power/domain.c
+++ b/drivers/base/power/domain.c
@@ -1247,12 +1247,14 @@  static int genpd_suspend_noirq(struct device *dev)
 }
 
 /**
- * genpd_resume_noirq - Start of resume of device in an I/O PM domain.
+ * genpd_resume_noirq - Completion of resume of device in an I/O PM domain.
  * @dev: Device to resume.
+ * @resume_noirq: Generic resume_noirq callback.
  *
  * Restore power to the device's PM domain, if necessary, and start the device.
  */
-static int genpd_resume_noirq(struct device *dev)
+static int genpd_finish_resume(struct device *dev,
+			       int (*resume_noirq)(struct device *dev))
 {
 	struct generic_pm_domain *genpd;
 	int ret;
@@ -1264,9 +1266,25 @@  static int genpd_resume_noirq(struct device *dev)
 		return -EINVAL;
 
 	if (device_wakeup_path(dev) && genpd_is_active_wakeup(genpd))
-		return pm_generic_resume_noirq(dev);
+		return resume_noirq(dev);
 
 	genpd_lock(genpd);
+
+	/*
+	 * Special handling for hibernation restore:
+	 * At this point suspended_count == 0 means we are being run for the
+	 * first time for the given domain in the present cycle.
+	 */
+	if (resume_noirq == pm_generic_restore_noirq &&
+	    genpd->suspended_count++ == 0) {
+		/*
+		 * The boot kernel might put the domain into arbitrary state,
+		 * so make it appear as powered off to genpd_sync_power_on(),
+		 * so that it tries to power it on in case it was really off.
+		 */
+		genpd->status = GENPD_STATE_OFF;
+	}
+
 	genpd_sync_power_on(genpd, true, 0);
 	genpd->suspended_count--;
 	genpd_unlock(genpd);
@@ -1281,6 +1299,19 @@  static int genpd_resume_noirq(struct device *dev)
 	return pm_generic_resume_noirq(dev);
 }
 
+/**
+ * genpd_resume_noirq - Start of resume of device in an I/O PM domain.
+ * @dev: Device to resume.
+ *
+ * Restore power to the device's PM domain, if necessary, and start the device.
+ */
+static int genpd_resume_noirq(struct device *dev)
+{
+	dev_dbg(dev, "%s()\n", __func__);
+
+	return genpd_finish_resume(dev, pm_generic_resume_noirq);
+}
+
 /**
  * genpd_freeze_noirq - Completion of freezing a device in an I/O PM domain.
  * @dev: Device to freeze.
@@ -1366,40 +1397,9 @@  static int genpd_poweroff_noirq(struct device *dev)
  */
 static int genpd_restore_noirq(struct device *dev)
 {
-	struct generic_pm_domain *genpd;
-	int ret = 0;
-
 	dev_dbg(dev, "%s()\n", __func__);
 
-	genpd = dev_to_genpd(dev);
-	if (IS_ERR(genpd))
-		return -EINVAL;
-
-	/*
-	 * At this point suspended_count == 0 means we are being run for the
-	 * first time for the given domain in the present cycle.
-	 */
-	genpd_lock(genpd);
-	if (genpd->suspended_count++ == 0) {
-		/*
-		 * The boot kernel might put the domain into arbitrary state,
-		 * so make it appear as powered off to genpd_sync_power_on(),
-		 * so that it tries to power it on in case it was really off.
-		 */
-		genpd->status = GENPD_STATE_OFF;
-	}
-
-	genpd_sync_power_on(genpd, true, 0);
-	genpd_unlock(genpd);
-
-	if (genpd->dev_ops.stop && genpd->dev_ops.start &&
-	    !pm_runtime_status_suspended(dev)) {
-		ret = genpd_start_dev(genpd, dev);
-		if (ret)
-			return ret;
-	}
-
-	return pm_generic_restore_noirq(dev);
+	return genpd_finish_resume(dev, pm_generic_restore_noirq);
 }
 
 /**