• Rafael J. Wysocki's avatar
    cpufreq: governor: Fix race in dbs_update_util_handler() · 27de3482
    Rafael J. Wysocki authored
    There is a scenario that may lead to undesired results in
    dbs_update_util_handler().  Namely, if two CPUs sharing a policy
    enter the funtion at the same time, pass the sample delay check
    and then one of them is stalled until dbs_work_handler() (queued
    up by the other CPU) clears the work counter, it may update the
    work counter and queue up another work item prematurely.
    
    To prevent that from happening, use the observation that the CPU
    queuing up a work item in dbs_update_util_handler() updates the
    last sample time.  This means that if another CPU was stalling after
    passing the sample delay check and now successfully updated the work
    counter as a result of the race described above, it will see the new
    value of the last sample time which is different from what it used in
    the sample delay check before.  If that happens, the sample delay
    check passed previously is not valid any more, so the CPU should not
    continue.
    
    Fixes: f17cbb53783c (cpufreq: governor: Avoid atomic operations in hot paths)
    Signed-off-by: default avatarRafael J. Wysocki <rafael.j.wysocki@intel.com>
    Acked-by: default avatarViresh Kumar <viresh.kumar@linaro.org>
    27de3482
cpufreq_governor.c 17.9 KB