lkml.org 
[lkml]   [2022]   [Oct]   [24]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 4.14 164/210] thermal: intel_powerclamp: Use get_cpu() instead of smp_processor_id() to avoid crash
    Date
    From: Srinivas Pandruvada <srinivas.pandruvada@linux.intel.com>

    [ Upstream commit 68b99e94a4a2db6ba9b31fe0485e057b9354a640 ]

    When CPU 0 is offline and intel_powerclamp is used to inject
    idle, it generates kernel BUG:

    BUG: using smp_processor_id() in preemptible [00000000] code: bash/15687
    caller is debug_smp_processor_id+0x17/0x20
    CPU: 4 PID: 15687 Comm: bash Not tainted 5.19.0-rc7+ #57
    Call Trace:
    <TASK>
    dump_stack_lvl+0x49/0x63
    dump_stack+0x10/0x16
    check_preemption_disabled+0xdd/0xe0
    debug_smp_processor_id+0x17/0x20
    powerclamp_set_cur_state+0x7f/0xf9 [intel_powerclamp]
    ...
    ...

    Here CPU 0 is the control CPU by default and changed to the current CPU,
    if CPU 0 offlined. This check has to be performed under cpus_read_lock(),
    hence the above warning.

    Use get_cpu() instead of smp_processor_id() to avoid this BUG.

    Suggested-by: Chen Yu <yu.c.chen@intel.com>
    Signed-off-by: Srinivas Pandruvada <srinivas.pandruvada@linux.intel.com>
    [ rjw: Subject edits ]
    Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    ---
    drivers/thermal/intel_powerclamp.c | 6 ++++--
    1 file changed, 4 insertions(+), 2 deletions(-)

    diff --git a/drivers/thermal/intel_powerclamp.c b/drivers/thermal/intel_powerclamp.c
    index c3293fa2bb1b..7ff59f86a543 100644
    --- a/drivers/thermal/intel_powerclamp.c
    +++ b/drivers/thermal/intel_powerclamp.c
    @@ -550,8 +550,10 @@ static int start_power_clamp(void)

    /* prefer BSP */
    control_cpu = 0;
    - if (!cpu_online(control_cpu))
    - control_cpu = smp_processor_id();
    + if (!cpu_online(control_cpu)) {
    + control_cpu = get_cpu();
    + put_cpu();
    + }

    clamping = true;
    schedule_delayed_work(&poll_pkg_cstate_work, 0);
    --
    2.35.1


    \
     
     \ /
      Last update: 2022-10-24 21:26    [W:2.086 / U:0.312 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site