• Ulf Hansson's avatar
    cpuidle: psci: Fix suspicious RCU usage · 36050d89
    Ulf Hansson authored
    The commit eb1f0023 ("lockdep,trace: Expose tracepoints"), started to
    expose us for tracepoints. This lead to the following RCU splat on an ARM64
    Qcom board.
    
    [    5.529634] WARNING: suspicious RCU usage
    [    5.537307] sdhci-pltfm: SDHCI platform and OF driver helper
    [    5.541092] 5.9.0-rc3 #86 Not tainted
    [    5.541098] -----------------------------
    [    5.541105] ../include/trace/events/lock.h:37 suspicious rcu_dereference_check() usage!
    [    5.541110]
    [    5.541110] other info that might help us debug this:
    [    5.541110]
    [    5.541116]
    [    5.541116] rcu_scheduler_active = 2, debug_locks = 1
    [    5.541122] RCU used illegally from extended quiescent state!
    [    5.541129] no locks held by swapper/0/0.
    [    5.541134]
    [    5.541134] stack backtrace:
    [    5.541143] CPU: 0 PID: 0 Comm: swapper/0 Not tainted 5.9.0-rc3 #86
    [    5.541149] Hardware name: Qualcomm Technologies, Inc. APQ 8016 SBC (DT)
    [    5.541157] Call trace:
    [    5.568185] sdhci_msm 7864900.sdhci: Got CD GPIO
    [    5.574186]  dump_backtrace+0x0/0x1c8
    [    5.574206]  show_stack+0x14/0x20
    [    5.574229]  dump_stack+0xe8/0x154
    [    5.574250]  lockdep_rcu_suspicious+0xd4/0xf8
    [    5.574269]  lock_acquire+0x3f0/0x460
    [    5.574292]  _raw_spin_lock_irqsave+0x80/0xb0
    [    5.574314]  __pm_runtime_suspend+0x4c/0x188
    [    5.574341]  psci_enter_domain_idle_state+0x40/0xa0
    [    5.574362]  cpuidle_enter_state+0xc0/0x610
    [    5.646487]  cpuidle_enter+0x38/0x50
    [    5.650651]  call_cpuidle+0x18/0x40
    [    5.654467]  do_idle+0x228/0x278
    [    5.657678]  cpu_startup_entry+0x24/0x70
    [    5.661153]  rest_init+0x1a4/0x278
    [    5.665061]  arch_call_rest_init+0xc/0x14
    [    5.668272]  start_kernel+0x508/0x540
    
    Following the path in pm_runtime_put_sync_suspend() from
    psci_enter_domain_idle_state(), it seems like we end up using the RCU.
    Therefore, let's simply silence the splat by informing the RCU about it
    with RCU_NONIDLE.
    
    Note that, this is a temporary solution. Instead we should strive to avoid
    using RCU_NONIDLE (and similar), but rather push rcu_idle_enter|exit()
    further down, closer to the arch specific code. However, as the CPU PM
    notifiers are also using the RCU, additional rework is needed.
    Reported-by: default avatarNaresh Kamboju <naresh.kamboju@linaro.org>
    Signed-off-by: default avatarUlf Hansson <ulf.hansson@linaro.org>
    Acked-by: default avatarPaul E. McKenney <paulmck@kernel.org>
    Signed-off-by: default avatarRafael J. Wysocki <rafael.j.wysocki@intel.com>
    36050d89
cpuidle-psci.c 8.6 KB