• Peter Zijlstra's avatar
    sched/core: Fix illegal RCU from offline CPUs · bf2c59fc
    Peter Zijlstra authored
    In the CPU-offline process, it calls mmdrop() after idle entry and the
    subsequent call to cpuhp_report_idle_dead(). Once execution passes the
    call to rcu_report_dead(), RCU is ignoring the CPU, which results in
    lockdep complaining when mmdrop() uses RCU from either memcg or
    debugobjects below.
    
    Fix it by cleaning up the active_mm state from BP instead. Every arch
    which has CONFIG_HOTPLUG_CPU should have already called idle_task_exit()
    from AP. The only exception is parisc because it switches them to
    &init_mm unconditionally (see smp_boot_one_cpu() and smp_cpu_init()),
    but the patch will still work there because it calls mmgrab(&init_mm) in
    smp_cpu_init() and then should call mmdrop(&init_mm) in finish_cpu().
    
      WARNING: suspicious RCU usage
      -----------------------------
      kernel/workqueue.c:710 RCU or wq_pool_mutex should be held!
    
      other info that might help us debug this:
    
      RCU used illegally from offline CPU!
      Call Trace:
       dump_stack+0xf4/0x164 (unreliable)
       lockdep_rcu_suspicious+0x140/0x164
       get_work_pool+0x110/0x150
       __queue_work+0x1bc/0xca0
       queue_work_on+0x114/0x120
       css_release+0x9c/0xc0
       percpu_ref_put_many+0x204/0x230
       free_pcp_prepare+0x264/0x570
       free_unref_page+0x38/0xf0
       __mmdrop+0x21c/0x2c0
       idle_task_exit+0x170/0x1b0
       pnv_smp_cpu_kill_self+0x38/0x2e0
       cpu_die+0x48/0x64
       arch_cpu_idle_dead+0x30/0x50
       do_idle+0x2f4/0x470
       cpu_startup_entry+0x38/0x40
       start_secondary+0x7a8/0xa80
       start_secondary_resume+0x10/0x14
    Signed-off-by: default avatarPeter Zijlstra (Intel) <peterz@infradead.org>
    Signed-off-by: default avatarQian Cai <cai@lca.pw>
    Signed-off-by: default avatarPeter Zijlstra (Intel) <peterz@infradead.org>
    Acked-by: Michael Ellerman <mpe@ellerman.id.au> (powerpc)
    Link: https://lkml.kernel.org/r/20200401214033.8448-1-cai@lca.pw
    bf2c59fc
cpu.c 60.8 KB