• Tony Lindgren's avatar
    PM: runtime: Fix unpaired parent child_count for force_resume · c745253e
    Tony Lindgren authored
    As pm_runtime_need_not_resume() relies also on usage_count, it can return
    a different value in pm_runtime_force_suspend() compared to when called in
    pm_runtime_force_resume(). Different return values can happen if anything
    calls PM runtime functions in between, and causes the parent child_count
    to increase on every resume.
    
    So far I've seen the issue only for omapdrm that does complicated things
    with PM runtime calls during system suspend for legacy reasons:
    
    omap_atomic_commit_tail() for omapdrm.0
     dispc_runtime_get()
      wakes up 58000000.dss as it's the dispc parent
       dispc_runtime_resume()
        rpm_resume() increases parent child_count
     dispc_runtime_put() won't idle, PM runtime suspend blocked
    pm_runtime_force_suspend() for 58000000.dss, !pm_runtime_need_not_resume()
     __update_runtime_status()
    system suspended
    pm_runtime_force_resume() for 58000000.dss, pm_runtime_need_not_resume()
     pm_runtime_enable() only called because of pm_runtime_need_not_resume()
    omap_atomic_commit_tail() for omapdrm.0
     dispc_runtime_get()
      wakes up 58000000.dss as it's the dispc parent
       dispc_runtime_resume()
        rpm_resume() increases parent child_count
     dispc_runtime_put() won't idle, PM runtime suspend blocked
    ...
    rpm_suspend for 58000000.dss but parent child_count is now unbalanced
    
    Let's fix the issue by adding a flag for needs_force_resume and use it in
    pm_runtime_force_resume() instead of pm_runtime_need_not_resume().
    
    Additionally omapdrm system suspend could be simplified later on to avoid
    lots of unnecessary PM runtime calls and the complexity it adds. The
    driver can just use internal functions that are shared between the PM
    runtime and system suspend related functions.
    
    Fixes: 4918e1f8 ("PM / runtime: Rework pm_runtime_force_suspend/resume()")
    Signed-off-by: default avatarTony Lindgren <tony@atomide.com>
    Reviewed-by: default avatarUlf Hansson <ulf.hansson@linaro.org>
    Tested-by: default avatarTomi Valkeinen <tomi.valkeinen@ideasonboard.com>
    Cc: 4.16+ <stable@vger.kernel.org> # 4.16+
    Signed-off-by: default avatarRafael J. Wysocki <rafael.j.wysocki@intel.com>
    c745253e
runtime.c 51 KB