• S
    cpufreq: Fix crash in cpufreq-stats during suspend/resume · 0d66b91e
    Srivatsa S. Bhat 提交于
    Stephen Warren reported that the cpufreq-stats code hits a NULL pointer
    dereference during the second attempt to suspend a system. He also
    pin-pointed the problem to commit 5302c3fb "cpufreq: Perform light-weight
    init/teardown during suspend/resume".
    
    That commit actually ensured that the cpufreq-stats table and the
    cpufreq-stats sysfs entries are *not* torn down (ie., not freed) during
    suspend/resume, which makes it all the more surprising. However, it turns
    out that the root-cause is not that we access an already freed memory, but
    that the reference to the allocated memory gets moved around and we lose
    track of that during resume, leading to the reported crash in a subsequent
    suspend attempt.
    
    In the suspend path, during CPU offline, the value of policy->cpu is updated
    by choosing one of the surviving CPUs in that policy, as long as there is
    atleast one CPU in that policy. And cpufreq_stats_update_policy_cpu() is
    invoked to update the reference to the stats structure by assigning it to
    the new CPU. However, in the resume path, during CPU online, we end up
    assigning a fresh CPU as the policy->cpu, without letting cpufreq-stats
    know about this. Thus the reference to the stats structure remains
    (incorrectly) associated with the old CPU. So, in a subsequent suspend attempt,
    during CPU offline, we end up accessing an incorrect location to get the
    stats structure, which eventually leads to the NULL pointer dereference.
    
    Fix this by letting cpufreq-stats know about the update of the policy->cpu
    during CPU online in the resume path. (Also, move the update_policy_cpu()
    function higher up in the file, so that __cpufreq_add_dev() can invoke
    it).
    Reported-and-tested-by: NStephen Warren <swarren@nvidia.com>
    Signed-off-by: NSrivatsa S. Bhat <srivatsa.bhat@linux.vnet.ibm.com>
    Signed-off-by: NRafael J. Wysocki <rafael.j.wysocki@intel.com>
    0d66b91e
cpufreq.c 54.8 KB