• Viresh Kumar's avatar
    cpufreq: send new set of notification for transition failures · ab1b1c4e
    Viresh Kumar authored
    In the current code, if we fail during a frequency transition, we
    simply send the POSTCHANGE notification with the old frequency. This
    isn't enough.
    
    One of the core users of these notifications is the code responsible
    for keeping loops_per_jiffy aligned with frequency changes. And mostly
    it is written as:
    
    	if ((val == CPUFREQ_PRECHANGE  && freq->old < freq->new) ||
    	    (val == CPUFREQ_POSTCHANGE && freq->old > freq->new)) {
    		update-loops-per-jiffy...
    	}
    
    So, suppose we are changing to a higher frequency and failed during
    transition, then following will happen:
    - CPUFREQ_PRECHANGE notification with freq-new > freq-old
    - CPUFREQ_POSTCHANGE notification with freq-new == freq-old
    
    The first one will update loops_per_jiffy and second one will do
    nothing. Even if we send the 2nd notification by exchanging values of
    freq-new and old, some users of these notifications might get
    unstable.
    
    This can be fixed by simply calling cpufreq_notify_post_transition()
    with error code and this routine will take care of sending
    notifications in the correct order.
    Signed-off-by: default avatarViresh Kumar <viresh.kumar@linaro.org>
    [rjw: Folded 3 patches into one, rebased unicore2 changes]
    Signed-off-by: default avatarRafael J. Wysocki <rafael.j.wysocki@intel.com>
    ab1b1c4e
cpufreq.c 55.9 KB