Skip to content

Commit

Permalink
PM: Allow pm_runtime_suspend() to succeed during system suspend
Browse files Browse the repository at this point in the history
The dpm_prepare() function increments the runtime PM reference
counters of all devices to prevent pm_runtime_suspend() from
executing subsystem-level callbacks.  However, this was supposed to
guard against a specific race condition that cannot happen, because
the power management workqueue is freezable, so pm_runtime_suspend()
can only be called synchronously during system suspend and we can
rely on subsystems and device drivers to avoid doing that
unnecessarily.

Make dpm_prepare() drop the runtime PM reference to each device
after making sure that runtime resume is not pending for it.

Signed-off-by: Rafael J. Wysocki <[email protected]>
Acked-by: Kevin Hilman <[email protected]>
  • Loading branch information
rjwysocki committed Mar 14, 2011
1 parent 88a6f33 commit e866500
Showing 1 changed file with 3 additions and 7 deletions.
10 changes: 3 additions & 7 deletions drivers/base/power/main.c
Original file line number Diff line number Diff line change
Expand Up @@ -669,7 +669,6 @@ static void dpm_complete(pm_message_t state)
mutex_unlock(&dpm_list_mtx);

device_complete(dev, state);
pm_runtime_put_sync(dev);

mutex_lock(&dpm_list_mtx);
put_device(dev);
Expand Down Expand Up @@ -1005,12 +1004,9 @@ static int dpm_prepare(pm_message_t state)
if (pm_runtime_barrier(dev) && device_may_wakeup(dev))
pm_wakeup_event(dev, 0);

if (pm_wakeup_pending()) {
pm_runtime_put_sync(dev);
error = -EBUSY;
} else {
error = device_prepare(dev, state);
}
pm_runtime_put_sync(dev);
error = pm_wakeup_pending() ?
-EBUSY : device_prepare(dev, state);

mutex_lock(&dpm_list_mtx);
if (error) {
Expand Down

0 comments on commit e866500

Please sign in to comment.