• Paul E. McKenney's avatar
    sched: Stop resched_cpu() from sending IPIs to offline CPUs · a0982dfa
    Paul E. McKenney authored
    The rcutorture test suite occasionally provokes a splat due to invoking
    resched_cpu() on an offline CPU:
    
    WARNING: CPU: 2 PID: 8 at /home/paulmck/public_git/linux-rcu/arch/x86/kernel/smp.c:128 native_smp_send_reschedule+0x37/0x40
    Modules linked in:
    CPU: 2 PID: 8 Comm: rcu_preempt Not tainted 4.14.0-rc4+ #1
    Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS Ubuntu-1.8.2-1ubuntu1 04/01/2014
    task: ffff902ede9daf00 task.stack: ffff96c50010c000
    RIP: 0010:native_smp_send_reschedule+0x37/0x40
    RSP: 0018:ffff96c50010fdb8 EFLAGS: 00010096
    RAX: 000000000000002e RBX: ffff902edaab4680 RCX: 0000000000000003
    RDX: 0000000080000003 RSI: 0000000000000000 RDI: 00000000ffffffff
    RBP: ffff96c50010fdb8 R08: 0000000000000000 R09: 0000000000000001
    R10: 0000000000000000 R11: 00000000299f36ae R12: 0000000000000001
    R13: ffffffff9de64240 R14: 0000000000000001 R15: ffffffff9de64240
    FS:  0000000000000000(0000) GS:ffff902edfc80000(0000) knlGS:0000000000000000
    CS:  0010 DS: 0000 ES: 0000 CR0: 0000000080050033
    CR2: 00000000f7d4c642 CR3: 000000001e0e2000 CR4: 00000000000006e0
    Call Trace:
     resched_curr+0x8f/0x1c0
     resched_cpu+0x2c/0x40
     rcu_implicit_dynticks_qs+0x152/0x220
     force_qs_rnp+0x147/0x1d0
     ? sync_rcu_exp_select_cpus+0x450/0x450
     rcu_gp_kthread+0x5a9/0x950
     kthread+0x142/0x180
     ? force_qs_rnp+0x1d0/0x1d0
     ? kthread_create_on_node+0x40/0x40
     ret_from_fork+0x27/0x40
    Code: 14 01 0f 92 c0 84 c0 74 14 48 8b 05 14 4f f4 00 be fd 00 00 00 ff 90 a0 00 00 00 5d c3 89 fe 48 c7 c7 38 89 ca 9d e8 e5 56 08 00 <0f> ff 5d c3 0f 1f 44 00 00 8b 05 52 9e 37 02 85 c0 75 38 55 48
    ---[ end trace 26df9e5df4bba4ac ]---
    
    This splat cannot be generated by expedited grace periods because they
    always invoke resched_cpu() on the current CPU, which is good because
    expedited grace periods require that resched_cpu() unconditionally
    succeed.  However, other parts of RCU can tolerate resched_cpu() acting
    as a no-op, at least as long as it doesn't happen too often.
    
    This commit therefore makes resched_cpu() invoke resched_curr() only if
    the CPU is either online or is the current CPU.
    Signed-off-by: default avatarPaul E. McKenney <paulmck@linux.vnet.ibm.com>
    Cc: Ingo Molnar <mingo@redhat.com>
    Cc: Peter Zijlstra <peterz@infradead.org>
    a0982dfa
core.c 171 KB