Skip to content

Commit 9226c50

Browse files
committed
PM: runtime: Resume the device earlier in __device_release_driver()
Since the device is resumed from runtime-suspend in __device_release_driver() anyway, it is better to do that before looking for busy managed device links from it to consumers, because if there are any, device_links_unbind_consumers() will be called and it will cause the consumer devices' drivers to unbind, so the consumer devices will be runtime-resumed. In turn, resuming each consumer device will cause the supplier to be resumed and when the runtime PM references from the given consumer to it are dropped, it may be suspended. Then, the runtime-resume of the next consumer will cause the supplier to resume again and so on. Update the code accordingly. Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com> Fixes: 9ed9895 ("driver core: Functional dependencies tracking support") Cc: All applicable <stable@vger.kernel.org> # All applicable Tested-by: Xiang Chen <chenxiang66@hisilicon.com> Reviewed-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
1 parent d6e3666 commit 9226c50

1 file changed

Lines changed: 5 additions & 3 deletions

File tree

drivers/base/dd.c

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1117,6 +1117,8 @@ static void __device_release_driver(struct device *dev, struct device *parent)
11171117

11181118
drv = dev->driver;
11191119
if (drv) {
1120+
pm_runtime_get_sync(dev);
1121+
11201122
while (device_links_busy(dev)) {
11211123
__device_driver_unlock(dev, parent);
11221124

@@ -1128,12 +1130,12 @@ static void __device_release_driver(struct device *dev, struct device *parent)
11281130
* have released the driver successfully while this one
11291131
* was waiting, so check for that.
11301132
*/
1131-
if (dev->driver != drv)
1133+
if (dev->driver != drv) {
1134+
pm_runtime_put(dev);
11321135
return;
1136+
}
11331137
}
11341138

1135-
pm_runtime_get_sync(dev);
1136-
11371139
driver_sysfs_remove(dev);
11381140

11391141
if (dev->bus)

0 commit comments

Comments
 (0)