• R
    driver core: Fix PM-runtime for links added during consumer probe · 36003d4c
    Rafael J. Wysocki 提交于
    Commit 4c06c4e6 ("driver core: Fix possible supplier PM-usage
    counter imbalance") introduced a regression that causes suppliers
    to be suspended prematurely for device links added during consumer
    driver probe if the initial PM-runtime status of the consumer is
    "suspended" and the consumer is resumed after adding the link and
    before pm_runtime_put_suppliers() is called.  In that case,
    pm_runtime_put_suppliers() will drop the rpm_active refcount for
    the link by one and (since rpm_active is equal to two after the
    preceding consumer resume) the supplier's PM-runtime usage counter
    will be decremented, which may cause the supplier to suspend even
    though the consumer's PM-runtime status is "active".
    
    For this reason, partially revert commit 4c06c4e6 as the problem
    it tried to fix needs to be addressed somewhat differently, and
    change pm_runtime_get_suppliers() and pm_runtime_put_suppliers() so
    that the latter only drops rpm_active references acquired by the
    former.  [This requires adding a new field to struct device_link,
    but I coulnd't find a cleaner way to address the issue that would
    work in all cases.]
    
    This causes pm_runtime_put_suppliers() to effectively ignore device
    links added during consumer probe, so device_link_add() doesn't need
    to worry about ensuring that suppliers will remain active after
    pm_runtime_put_suppliers() for links created with DL_FLAG_RPM_ACTIVE
    set and it only needs to bump up rpm_active by one for those links,
    so pm_runtime_active_link() is not necessary any more.
    
    Fixes: 4c06c4e6 ("driver core: Fix possible supplier PM-usage counter imbalance")
    Reported-by: NJon Hunter <jonathanh@nvidia.com>
    Tested-by: NJon Hunter <jonathanh@nvidia.com>
    Tested-by: NUlf Hansson <ulf.hansson@linaro.org>
    Reviewed-by: NUlf Hansson <ulf.hansson@linaro.org>
    Signed-off-by: NRafael J. Wysocki <rafael.j.wysocki@intel.com>
    Tested-by: NThierry Reding <treding@nvidia.com>
    Signed-off-by: NGreg Kroah-Hartman <gregkh@linuxfoundation.org>
    36003d4c
core.c 87.1 KB