Message ID | E1YWSN0-0006G1-I1@rmk-PC.arm.linux.org.uk (mailing list archive) |
---|---|
State | Superseded, archived |
Headers | show |
Russell King <rmk+kernel@arm.linux.org.uk> writes: > pm_genpd_remove_device() tries hard to validate the generic PM domain > passed to it, but the validation is not complete. > > dev->pm_domain contains a struct dev_pm_domain, which is the "base > class" of generic PM domains. Other users of dev_pm_domains include > stuff like vga_switheroo. Hence, a device could have a generic PM > domain or a vga_switcheroo PM domain in dev->pm_domain. > > We need ot be certain that the PM domain is actually valid before we > try to remove it. nit: We need to be certain that the PM domain is a valid genpd before we try to remove the device. > We can do this easily as we have a way to get the > current validated generic PM domain for a struct device. This must > match the generic PM domain being requested for removal. > > Convert the code to use this alternative validation method instead. > > Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk> Otherwise, Acked-by: Kevin Hilman <khilman@linaro.org> -- To unsubscribe from this list: send the line "unsubscribe linux-pm" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
diff --git a/drivers/base/power/domain.c b/drivers/base/power/domain.c index b9000b245e62..69fa87aa3b52 100644 --- a/drivers/base/power/domain.c +++ b/drivers/base/power/domain.c @@ -1534,9 +1534,7 @@ int pm_genpd_remove_device(struct generic_pm_domain *genpd, dev_dbg(dev, "%s()\n", __func__); - if (IS_ERR_OR_NULL(genpd) || IS_ERR_OR_NULL(dev) - || IS_ERR_OR_NULL(dev->pm_domain) - || pd_to_genpd(dev->pm_domain) != genpd) + if (!genpd || genpd != pm_genpd_lookup_dev(dev)) return -EINVAL; genpd_acquire_lock(genpd);
pm_genpd_remove_device() tries hard to validate the generic PM domain passed to it, but the validation is not complete. dev->pm_domain contains a struct dev_pm_domain, which is the "base class" of generic PM domains. Other users of dev_pm_domains include stuff like vga_switheroo. Hence, a device could have a generic PM domain or a vga_switcheroo PM domain in dev->pm_domain. We need ot be certain that the PM domain is actually valid before we try to remove it. We can do this easily as we have a way to get the current validated generic PM domain for a struct device. This must match the generic PM domain being requested for removal. Convert the code to use this alternative validation method instead. Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk> --- drivers/base/power/domain.c | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-)