• Srinivas Pandruvada's avatar
    cpufreq: intel_pstate: Fix unsafe HWP MSR access · f9f4872d
    Srinivas Pandruvada authored
    This is a requirement that MSR MSR_PM_ENABLE must be set to 0x01 before
    reading MSR_HWP_CAPABILITIES on a given CPU. If cpufreq init() is
    scheduled on a CPU which is not same as policy->cpu or migrates to a
    different CPU before calling msr read for MSR_HWP_CAPABILITIES, it
    is possible that MSR_PM_ENABLE was not to set to 0x01 on that CPU.
    This will cause GP fault. So like other places in this path
    rdmsrl_on_cpu should be used instead of rdmsrl.
    
    Moreover the scope of MSR_HWP_CAPABILITIES is on per thread basis, so it
    should be read from the same CPU, for which MSR MSR_HWP_REQUEST is
    getting set.
    
    dmesg dump or warning:
    
    [   22.014488] WARNING: CPU: 139 PID: 1 at arch/x86/mm/extable.c:50 ex_handler_rdmsr_unsafe+0x68/0x70
    [   22.014492] unchecked MSR access error: RDMSR from 0x771
    [   22.014493] Modules linked in:
    [   22.014507] CPU: 139 PID: 1 Comm: swapper/0 Not tainted 4.7.5+ #1
    ...
    ...
    [   22.014516] Call Trace:
    [   22.014542]  [<ffffffff813d7dd1>] dump_stack+0x63/0x82
    [   22.014558]  [<ffffffff8107bc8b>] __warn+0xcb/0xf0
    [   22.014561]  [<ffffffff8107bcff>] warn_slowpath_fmt+0x4f/0x60
    [   22.014563]  [<ffffffff810676f8>] ex_handler_rdmsr_unsafe+0x68/0x70
    [   22.014564]  [<ffffffff810677d9>] fixup_exception+0x39/0x50
    [   22.014604]  [<ffffffff8102e400>] do_general_protection+0x80/0x150
    [   22.014610]  [<ffffffff817f9ec8>] general_protection+0x28/0x30
    [   22.014635]  [<ffffffff81687940>] ? get_target_pstate_use_performance+0xb0/0xb0
    [   22.014642]  [<ffffffff810600c7>] ? native_read_msr+0x7/0x40
    [   22.014657]  [<ffffffff81688123>] intel_pstate_hwp_set+0x23/0x130
    [   22.014660]  [<ffffffff81688406>] intel_pstate_set_policy+0x1b6/0x340
    [   22.014662]  [<ffffffff816829bb>] cpufreq_set_policy+0xeb/0x2c0
    [   22.014664]  [<ffffffff81682f39>] cpufreq_init_policy+0x79/0xe0
    [   22.014666]  [<ffffffff81682cb0>] ? cpufreq_update_policy+0x120/0x120
    [   22.014669]  [<ffffffff816833a6>] cpufreq_online+0x406/0x820
    [   22.014671]  [<ffffffff8168381f>] cpufreq_add_dev+0x5f/0x90
    [   22.014717]  [<ffffffff81530ac8>] subsys_interface_register+0xb8/0x100
    [   22.014719]  [<ffffffff816821bc>] cpufreq_register_driver+0x14c/0x210
    [   22.014749]  [<ffffffff81fe1d90>] intel_pstate_init+0x39d/0x4d5
    [   22.014751]  [<ffffffff81fe13f2>] ? cpufreq_gov_dbs_init+0x12/0x12
    
    Cc: 4.3+ <stable@vger.kernel.org> # 4.3+
    Signed-off-by: default avatarSrinivas Pandruvada <srinivas.pandruvada@linux.intel.com>
    Signed-off-by: default avatarRafael J. Wysocki <rafael.j.wysocki@intel.com>
    f9f4872d
intel_pstate.c 46.9 KB