Commit 51888393 authored by Rafael J. Wysocki's avatar Rafael J. Wysocki
Browse files

PM: runtime: Take active children into account in pm_runtime_get_if_in_use()



For all practical purposes, there is no difference between the situation
in which a given device is not ignoring children and its active child
count is nonzero and the situation in which its runtime PM usage counter
is nonzero.  However, pm_runtime_get_if_in_use() will only increment the
device's usage counter and return 1 in the latter case.

For consistency, make it do so in the former case either by adjusting
pm_runtime_get_conditional() and update the related kerneldoc comments
accordingly.

Fixes: c111566b ("PM: runtime: Add pm_runtime_get_if_active()")
Signed-off-by: default avatarRafael J. Wysocki <rafael.j.wysocki@intel.com>
Reviewed-by: default avatarUlf Hansson <ulf.hansson@linaro.org>
Reviewed-by: default avatarSakari Ailus <sakari.ailus@linux.intel.com>
Cc: 5.10+ <stable@vger.kernel.org> # 5.10+: c0ef3df8: PM: runtime: Simplify pm_runtime_get_if_active() usage
Cc: 5.10+ <stable@vger.kernel.org> # 5.10+
Link: https://patch.msgid.link/12700973.O9o76ZdvQC@rjwysocki.net
parent cd4da713
Loading
Loading
Loading
Loading
+18 −9
Original line number Diff line number Diff line
@@ -1191,10 +1191,12 @@ EXPORT_SYMBOL_GPL(__pm_runtime_resume);
 *
 * Return -EINVAL if runtime PM is disabled for @dev.
 *
 * Otherwise, if the runtime PM status of @dev is %RPM_ACTIVE and either
 * @ign_usage_count is %true or the runtime PM usage counter of @dev is not
 * zero, increment the usage counter of @dev and return 1. Otherwise, return 0
 * without changing the usage counter.
 * Otherwise, if its runtime PM status is %RPM_ACTIVE and (1) @ign_usage_count
 * is set, or (2) @dev is not ignoring children and its active child count is
 * nonero, or (3) the runtime PM usage counter of @dev is not zero, increment
 * the usage counter of @dev and return 1.
 *
 * Otherwise, return 0 without changing the usage counter.
 *
 * If @ign_usage_count is %true, this function can be used to prevent suspending
 * the device when its runtime PM status is %RPM_ACTIVE.
@@ -1216,7 +1218,8 @@ static int pm_runtime_get_conditional(struct device *dev, bool ign_usage_count)
		retval = -EINVAL;
	} else if (dev->power.runtime_status != RPM_ACTIVE) {
		retval = 0;
	} else if (ign_usage_count) {
	} else if (ign_usage_count || (!dev->power.ignore_children &&
		   atomic_read(&dev->power.child_count) > 0)) {
		retval = 1;
		atomic_inc(&dev->power.usage_count);
	} else {
@@ -1249,10 +1252,16 @@ EXPORT_SYMBOL_GPL(pm_runtime_get_if_active);
 * @dev: Target device.
 *
 * Increment the runtime PM usage counter of @dev if its runtime PM status is
 * %RPM_ACTIVE and its runtime PM usage counter is greater than 0, in which case
 * it returns 1. If the device is in a different state or its usage_count is 0,
 * 0 is returned. -EINVAL is returned if runtime PM is disabled for the device,
 * in which case also the usage_count will remain unmodified.
 * %RPM_ACTIVE and its runtime PM usage counter is greater than 0 or it is not
 * ignoring children and its active child count is nonzero.  1 is returned in
 * this case.
 *
 * If @dev is in a different state or it is not in use (that is, its usage
 * counter is 0, or it is ignoring children, or its active child count is 0),
 * 0 is returned.
 *
 * -EINVAL is returned if runtime PM is disabled for the device, in which case
 * also the usage counter of @dev is not updated.
 */
int pm_runtime_get_if_in_use(struct device *dev)
{