On Thu, Oct 22, 2020 at 3:40 PM chenxiang (M) <chenxian...@hisilicon.com> wrote: > > Hi Rafael, > > 在 2020/10/22 3:14, Rafael J. Wysocki 写道: > > From: Rafael J. Wysocki <rafael.j.wyso...@intel.com> > > > > 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.wyso...@intel.com> > > Fixes: 9ed9895370ae ("driver core: Functional dependencies tracking > > support") > > Cc: All applicable <sta...@vger.kernel.org> # All applicable > > --- > > drivers/base/dd.c | 4 ++-- > > 1 file changed, 2 insertions(+), 2 deletions(-) > > > > Index: linux-pm/drivers/base/dd.c > > =================================================================== > > --- linux-pm.orig/drivers/base/dd.c > > +++ linux-pm/drivers/base/dd.c > > @@ -1117,6 +1117,8 @@ static void __device_release_driver(stru > > > > drv = dev->driver; > > if (drv) { > > + pm_runtime_get_sync(dev); > > + > > while (device_links_busy(dev)) { > > __device_driver_unlock(dev, parent); > > > > @@ -1132,8 +1134,6 @@ static void __device_release_driver(stru > > pm_runtime_put_sync() is required to be called if existed from here. > > > return;
Right, I overlooked this, thanks! > > } > > > > - pm_runtime_get_sync(dev); > > - > > driver_sysfs_remove(dev); > > > > if (dev->bus)