• Rafael J. Wysocki's avatar
    PM-runtime: Fix __pm_runtime_set_status() race with runtime resume · c1567f81
    Rafael J. Wysocki authored
    Commit 4080ab08 ("PM-runtime: Take suppliers into account in
    __pm_runtime_set_status()") introduced a race condition that may
    trigger if __pm_runtime_set_status() is used incorrectly (that is,
    if it is called when PM-runtime is enabled for the target device
    and working).
    
    In that case, if the original PM-runtime status of the device is
    RPM_SUSPENDED, a runtime resume of the device may occur after
    __pm_runtime_set_status() has dropped its power.lock spinlock
    and before deactivating its suppliers, so the suppliers may be
    deactivated while the device is PM-runtime-active which may lead
    to functional issues.
    
    To avoid that, modify __pm_runtime_set_status() to check whether
    or not PM-runtime is enabled for the device before activating its
    suppliers (if the new status is RPM_ACTIVE) and either return an
    error if that's the case or increment the device's disable_depth
    counter to prevent PM-runtime from being enabled for it while
    the remaining part of the function is running (disable_depth is
    then decremented on the way out).
    
    Fixes: 4080ab08 ("PM-runtime: Take suppliers into account in __pm_runtime_set_status()")
    Signed-off-by: default avatarRafael J. Wysocki <rafael.j.wysocki@intel.com>
    Reviewed-by: default avatarUlf Hansson <ulf.hansson@linaro.org>
    Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
    c1567f81
runtime.c 48.4 KB