• Vincent Guittot's avatar
    PM-runtime: Fix deadlock with ktime_get() · 15efb47d
    Vincent Guittot authored
    A deadlock has been seen when swicthing clocksources which use
    PM-runtime.  The call path is:
    
    change_clocksource
        ...
        write_seqcount_begin
        ...
        timekeeping_update
            ...
            sh_cmt_clocksource_enable
                ...
                rpm_resume
                    pm_runtime_mark_last_busy
                        ktime_get
                            do
                                read_seqcount_begin
                            while read_seqcount_retry
        ....
        write_seqcount_end
    
    Although we should be safe because we haven't yet changed the
    clocksource at that time, we can't do that because of seqcount
    protection.
    
    Use ktime_get_mono_fast_ns() instead which is lock safe for such
    cases.
    
    With ktime_get_mono_fast_ns, the timestamp is not guaranteed to be
    monotonic across an update and as a result can goes backward.
    According to update_fast_timekeeper() description: "In the worst
    case, this can result is a slightly wrong timestamp (a few
    nanoseconds)". For PM-runtime autosuspend, this means only that
    the suspend decision may be slightly suboptimal.
    
    Fixes: 8234f673 ("PM-runtime: Switch autosuspend over to using hrtimers")
    Reported-by: default avatarBiju Das <biju.das@bp.renesas.com>
    Signed-off-by: default avatarVincent Guittot <vincent.guittot@linaro.org>
    Reviewed-by: default avatarUlf Hansson <ulf.hansson@linaro.org>
    Signed-off-by: default avatarRafael J. Wysocki <rafael.j.wysocki@intel.com>
    15efb47d
runtime.c 47.2 KB