PM: sleep: core: Drop racy and redundant checks from device_prepare()
authorRafael J. Wysocki <rafael.j.wysocki@intel.com>
Sun, 29 Mar 2020 14:11:18 +0000 (16:11 +0200)
committerRafael J. Wysocki <rafael.j.wysocki@intel.com>
Wed, 1 Apr 2020 09:38:49 +0000 (11:38 +0200)
Alan Stern points out that the WARN_ON() check in device_prepare()
is racy (because the PM-runtime API can be disabled briefly for any
device at any time and system suspend can start at any time too) and
the pm_runtime_suspended() check in the computation of the
direct_complete flag value is redundant (because it will be
repeated later anyway).

Drop both these checks accordingly.

Reported-by: Alan Stern <stern@rowland.harvard.edu>
Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
drivers/base/power/main.c

index 6d1dee7051eb12eb5e1226c16e2658eceb008e99..fdd508a78ffd66044a4ffd89f5e44fd16f74e05f 100644 (file)
@@ -1922,10 +1922,6 @@ static int device_prepare(struct device *dev, pm_message_t state)
        if (dev->power.syscore)
                return 0;
 
-       WARN_ON(!pm_runtime_enabled(dev) &&
-               dev_pm_test_driver_flags(dev, DPM_FLAG_SMART_SUSPEND |
-                                             DPM_FLAG_LEAVE_SUSPENDED));
-
        /*
         * If a device's parent goes into runtime suspend at the wrong time,
         * it won't be possible to resume the device.  To prevent this we
@@ -1973,8 +1969,7 @@ unlock:
         */
        spin_lock_irq(&dev->power.lock);
        dev->power.direct_complete = state.event == PM_EVENT_SUSPEND &&
-               ((pm_runtime_suspended(dev) && ret > 0) ||
-                dev->power.no_pm_callbacks) &&
+               (ret > 0 || dev->power.no_pm_callbacks) &&
                !dev_pm_test_driver_flags(dev, DPM_FLAG_NEVER_SKIP);
        spin_unlock_irq(&dev->power.lock);
        return 0;