Message ID | 2203732.Icojqenx9y@kreacher |
---|---|
State | New |
Headers | show |
Series | None | expand |
On Mon, Jan 29, 2024 at 05:29:41PM +0100, Rafael J. Wysocki wrote: > From: Rafael J. Wysocki <rafael.j.wysocki@intel.com> > > Simplify the system-wide suspend of devices by invoking dpm_async_fn() > directly from the main loop in each suspend phase instead of using an > additional wrapper function for running it. > > No intentional functional impact. > > Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com> Reviewed-by: Stanislaw Gruszka <stanislaw.gruszka@linux.intel.com> > --- > > v1 -> v2: No changes. > > --- > drivers/base/power/main.c | 61 ++++++++++++++++++---------------------------- > 1 file changed, 25 insertions(+), 36 deletions(-) > > Index: linux-pm/drivers/base/power/main.c > =================================================================== > --- linux-pm.orig/drivers/base/power/main.c > +++ linux-pm/drivers/base/power/main.c > @@ -1192,7 +1192,7 @@ static void dpm_superior_set_must_resume > } > > /** > - * __device_suspend_noirq - Execute a "noirq suspend" callback for given device. > + * device_suspend_noirq - Execute a "noirq suspend" callback for given device. > * @dev: Device to handle. > * @state: PM transition of the system being carried out. > * @async: If true, the device is being suspended asynchronously. > @@ -1200,7 +1200,7 @@ static void dpm_superior_set_must_resume > * The driver of @dev will not receive interrupts while this function is being > * executed. > */ > -static int __device_suspend_noirq(struct device *dev, pm_message_t state, bool async) > +static int device_suspend_noirq(struct device *dev, pm_message_t state, bool async) > { > pm_callback_t callback = NULL; > const char *info = NULL; > @@ -1277,18 +1277,10 @@ static void async_suspend_noirq(void *da > { > struct device *dev = data; > > - __device_suspend_noirq(dev, pm_transition, true); > + device_suspend_noirq(dev, pm_transition, true); > put_device(dev); > } > > -static int device_suspend_noirq(struct device *dev) > -{ > - if (dpm_async_fn(dev, async_suspend_noirq)) > - return 0; > - > - return __device_suspend_noirq(dev, pm_transition, false); > -} > - > static int dpm_noirq_suspend_devices(pm_message_t state) > { > ktime_t starttime = ktime_get(); > @@ -1305,10 +1297,15 @@ static int dpm_noirq_suspend_devices(pm_ > struct device *dev = to_device(dpm_late_early_list.prev); > > list_move(&dev->power.entry, &dpm_noirq_list); > + > + if (dpm_async_fn(dev, async_suspend_noirq)) > + continue; > + > get_device(dev); > + > mutex_unlock(&dpm_list_mtx); > > - error = device_suspend_noirq(dev); > + error = device_suspend_noirq(dev, state, false); > > put_device(dev); > > @@ -1369,14 +1366,14 @@ static void dpm_propagate_wakeup_to_pare > } > > /** > - * __device_suspend_late - Execute a "late suspend" callback for given device. > + * device_suspend_late - Execute a "late suspend" callback for given device. > * @dev: Device to handle. > * @state: PM transition of the system being carried out. > * @async: If true, the device is being suspended asynchronously. > * > * Runtime PM is disabled for @dev while this function is being executed. > */ > -static int __device_suspend_late(struct device *dev, pm_message_t state, bool async) > +static int device_suspend_late(struct device *dev, pm_message_t state, bool async) > { > pm_callback_t callback = NULL; > const char *info = NULL; > @@ -1447,18 +1444,10 @@ static void async_suspend_late(void *dat > { > struct device *dev = data; > > - __device_suspend_late(dev, pm_transition, true); > + device_suspend_late(dev, pm_transition, true); > put_device(dev); > } > > -static int device_suspend_late(struct device *dev) > -{ > - if (dpm_async_fn(dev, async_suspend_late)) > - return 0; > - > - return __device_suspend_late(dev, pm_transition, false); > -} > - > /** > * dpm_suspend_late - Execute "late suspend" callbacks for all devices. > * @state: PM transition of the system being carried out. > @@ -1481,11 +1470,15 @@ int dpm_suspend_late(pm_message_t state) > struct device *dev = to_device(dpm_suspended_list.prev); > > list_move(&dev->power.entry, &dpm_late_early_list); > + > + if (dpm_async_fn(dev, async_suspend_late)) > + continue; > + > get_device(dev); > > mutex_unlock(&dpm_list_mtx); > > - error = device_suspend_late(dev); > + error = device_suspend_late(dev, state, false); > > put_device(dev); > > @@ -1582,12 +1575,12 @@ static void dpm_clear_superiors_direct_c > } > > /** > - * __device_suspend - Execute "suspend" callbacks for given device. > + * device_suspend - Execute "suspend" callbacks for given device. > * @dev: Device to handle. > * @state: PM transition of the system being carried out. > * @async: If true, the device is being suspended asynchronously. > */ > -static int __device_suspend(struct device *dev, pm_message_t state, bool async) > +static int device_suspend(struct device *dev, pm_message_t state, bool async) > { > pm_callback_t callback = NULL; > const char *info = NULL; > @@ -1716,18 +1709,10 @@ static void async_suspend(void *data, as > { > struct device *dev = data; > > - __device_suspend(dev, pm_transition, true); > + device_suspend(dev, pm_transition, true); > put_device(dev); > } > > -static int device_suspend(struct device *dev) > -{ > - if (dpm_async_fn(dev, async_suspend)) > - return 0; > - > - return __device_suspend(dev, pm_transition, false); > -} > - > /** > * dpm_suspend - Execute "suspend" callbacks for all non-sysdev devices. > * @state: PM transition of the system being carried out. > @@ -1752,11 +1737,15 @@ int dpm_suspend(pm_message_t state) > struct device *dev = to_device(dpm_prepared_list.prev); > > list_move(&dev->power.entry, &dpm_suspended_list); > + > + if (dpm_async_fn(dev, async_suspend)) > + continue; > + > get_device(dev); > > mutex_unlock(&dpm_list_mtx); > > - error = device_suspend(dev); > + error = device_suspend(dev, state, false); > > put_device(dev); > > > >
Index: linux-pm/drivers/base/power/main.c =================================================================== --- linux-pm.orig/drivers/base/power/main.c +++ linux-pm/drivers/base/power/main.c @@ -1192,7 +1192,7 @@ static void dpm_superior_set_must_resume } /** - * __device_suspend_noirq - Execute a "noirq suspend" callback for given device. + * device_suspend_noirq - Execute a "noirq suspend" callback for given device. * @dev: Device to handle. * @state: PM transition of the system being carried out. * @async: If true, the device is being suspended asynchronously. @@ -1200,7 +1200,7 @@ static void dpm_superior_set_must_resume * The driver of @dev will not receive interrupts while this function is being * executed. */ -static int __device_suspend_noirq(struct device *dev, pm_message_t state, bool async) +static int device_suspend_noirq(struct device *dev, pm_message_t state, bool async) { pm_callback_t callback = NULL; const char *info = NULL; @@ -1277,18 +1277,10 @@ static void async_suspend_noirq(void *da { struct device *dev = data; - __device_suspend_noirq(dev, pm_transition, true); + device_suspend_noirq(dev, pm_transition, true); put_device(dev); } -static int device_suspend_noirq(struct device *dev) -{ - if (dpm_async_fn(dev, async_suspend_noirq)) - return 0; - - return __device_suspend_noirq(dev, pm_transition, false); -} - static int dpm_noirq_suspend_devices(pm_message_t state) { ktime_t starttime = ktime_get(); @@ -1305,10 +1297,15 @@ static int dpm_noirq_suspend_devices(pm_ struct device *dev = to_device(dpm_late_early_list.prev); list_move(&dev->power.entry, &dpm_noirq_list); + + if (dpm_async_fn(dev, async_suspend_noirq)) + continue; + get_device(dev); + mutex_unlock(&dpm_list_mtx); - error = device_suspend_noirq(dev); + error = device_suspend_noirq(dev, state, false); put_device(dev); @@ -1369,14 +1366,14 @@ static void dpm_propagate_wakeup_to_pare } /** - * __device_suspend_late - Execute a "late suspend" callback for given device. + * device_suspend_late - Execute a "late suspend" callback for given device. * @dev: Device to handle. * @state: PM transition of the system being carried out. * @async: If true, the device is being suspended asynchronously. * * Runtime PM is disabled for @dev while this function is being executed. */ -static int __device_suspend_late(struct device *dev, pm_message_t state, bool async) +static int device_suspend_late(struct device *dev, pm_message_t state, bool async) { pm_callback_t callback = NULL; const char *info = NULL; @@ -1447,18 +1444,10 @@ static void async_suspend_late(void *dat { struct device *dev = data; - __device_suspend_late(dev, pm_transition, true); + device_suspend_late(dev, pm_transition, true); put_device(dev); } -static int device_suspend_late(struct device *dev) -{ - if (dpm_async_fn(dev, async_suspend_late)) - return 0; - - return __device_suspend_late(dev, pm_transition, false); -} - /** * dpm_suspend_late - Execute "late suspend" callbacks for all devices. * @state: PM transition of the system being carried out. @@ -1481,11 +1470,15 @@ int dpm_suspend_late(pm_message_t state) struct device *dev = to_device(dpm_suspended_list.prev); list_move(&dev->power.entry, &dpm_late_early_list); + + if (dpm_async_fn(dev, async_suspend_late)) + continue; + get_device(dev); mutex_unlock(&dpm_list_mtx); - error = device_suspend_late(dev); + error = device_suspend_late(dev, state, false); put_device(dev); @@ -1582,12 +1575,12 @@ static void dpm_clear_superiors_direct_c } /** - * __device_suspend - Execute "suspend" callbacks for given device. + * device_suspend - Execute "suspend" callbacks for given device. * @dev: Device to handle. * @state: PM transition of the system being carried out. * @async: If true, the device is being suspended asynchronously. */ -static int __device_suspend(struct device *dev, pm_message_t state, bool async) +static int device_suspend(struct device *dev, pm_message_t state, bool async) { pm_callback_t callback = NULL; const char *info = NULL; @@ -1716,18 +1709,10 @@ static void async_suspend(void *data, as { struct device *dev = data; - __device_suspend(dev, pm_transition, true); + device_suspend(dev, pm_transition, true); put_device(dev); } -static int device_suspend(struct device *dev) -{ - if (dpm_async_fn(dev, async_suspend)) - return 0; - - return __device_suspend(dev, pm_transition, false); -} - /** * dpm_suspend - Execute "suspend" callbacks for all non-sysdev devices. * @state: PM transition of the system being carried out. @@ -1752,11 +1737,15 @@ int dpm_suspend(pm_message_t state) struct device *dev = to_device(dpm_prepared_list.prev); list_move(&dev->power.entry, &dpm_suspended_list); + + if (dpm_async_fn(dev, async_suspend)) + continue; + get_device(dev); mutex_unlock(&dpm_list_mtx); - error = device_suspend(dev); + error = device_suspend(dev, state, false); put_device(dev);