Commit 2ee53e46 authored by Zhang Qilong's avatar Zhang Qilong Committed by Zhang Xiaoxu
Browse files

PM: runtime: Add pm_runtime_resume_and_get to deal with usage counter

mainline inclusion
from mainline-v5.10-rc5
commit dd8088d5
category: bugfix
bugzilla: https://gitee.com/src-openeuler/kernel/issues/I94JCT
CVE: CVE-2020-36782

---------------------------

In many case, we need to check return value of pm_runtime_get_sync, but
it brings a trouble to the usage counter processing. Many callers forget
to decrease the usage counter when it failed, which could resulted in
reference leak. It has been discussed a lot[0][1]. So we add a function
to deal with the usage counter for better coding.

[0]https://lkml.org/lkml/2020/6/14/88
[1]https://patchwork.ozlabs.org/project/linux-tegra/list/?series=178139


Signed-off-by: default avatarZhang Qilong <zhangqilong3@huawei.com>
Acked-by: default avatarRafael J. Wysocki <rafael.j.wysocki@intel.com>
Signed-off-by: default avatarJakub Kicinski <kuba@kernel.org>

Conflicts:
	include/linux/pm_runtime.h

Signed-off-by: default avatarZhang Xiaoxu <zhangxiaoxu5@huawei.com>
parent e5b3fc12
Loading
Loading
Loading
Loading
+21 −0
Original line number Diff line number Diff line
@@ -225,6 +225,27 @@ static inline int pm_runtime_get_sync(struct device *dev)
	return __pm_runtime_resume(dev, RPM_GET_PUT);
}

/**
 * pm_runtime_resume_and_get - Bump up usage counter of a device and resume it.
 * @dev: Target device.
 *
 * Resume @dev synchronously and if that is successful, increment its runtime
 * PM usage counter. Return 0 if the runtime PM usage counter of @dev has been
 * incremented or a negative error code otherwise.
 */
static inline int pm_runtime_resume_and_get(struct device *dev)
{
	int ret;

	ret = __pm_runtime_resume(dev, RPM_GET_PUT);
	if (ret < 0) {
		pm_runtime_put_noidle(dev);
		return ret;
	}

	return 0;
}

static inline int pm_runtime_put(struct device *dev)
{
	return __pm_runtime_idle(dev, RPM_GET_PUT | RPM_ASYNC);