lkml.org 
[lkml]   [2018]   [Mar]   [19]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 4.9 171/241] sched: Stop resched_cpu() from sending IPIs to offline CPUs
    Date
    4.9-stable review patch.  If anyone has any objections, please let me know.

    ------------------

    From: "Paul E. McKenney" <paulmck@linux.vnet.ibm.com>


    [ Upstream commit a0982dfa03efca6c239c52cabebcea4afb93ea6b ]

    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: Paul E. McKenney <paulmck@linux.vnet.ibm.com>
    Cc: Ingo Molnar <mingo@redhat.com>
    Cc: Peter Zijlstra <peterz@infradead.org>

    Signed-off-by: Sasha Levin <alexander.levin@microsoft.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    ---
    kernel/sched/core.c | 3 ++-
    1 file changed, 2 insertions(+), 1 deletion(-)

    --- a/kernel/sched/core.c
    +++ b/kernel/sched/core.c
    @@ -508,7 +508,8 @@ void resched_cpu(int cpu)
    unsigned long flags;

    raw_spin_lock_irqsave(&rq->lock, flags);
    - resched_curr(rq);
    + if (cpu_online(cpu) || cpu == smp_processor_id())
    + resched_curr(rq);
    raw_spin_unlock_irqrestore(&rq->lock, flags);
    }


    \
     
     \ /
      Last update: 2018-03-19 19:26    [W:4.342 / U:0.388 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site