lkml.org 
[lkml]   [2015]   [Oct]   [28]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 3.12 099/123] workqueue: make sure delayed work run in local cpu
    Date
    From: Shaohua Li <shli@fb.com>

    3.12-stable review patch. If anyone has any objections, please let me know.

    ===============

    commit 874bbfe600a660cba9c776b3957b1ce393151b76 upstream.

    My system keeps crashing with below message. vmstat_update() schedules a delayed
    work in current cpu and expects the work runs in the cpu.
    schedule_delayed_work() is expected to make delayed work run in local cpu. The
    problem is timer can be migrated with NO_HZ. __queue_work() queues work in
    timer handler, which could run in a different cpu other than where the delayed
    work is scheduled. The end result is the delayed work runs in different cpu.
    The patch makes __queue_delayed_work records local cpu earlier. Where the timer
    runs doesn't change where the work runs with the change.

    [ 28.010131] ------------[ cut here ]------------
    [ 28.010609] kernel BUG at ../mm/vmstat.c:1392!
    [ 28.011099] invalid opcode: 0000 [#1] PREEMPT SMP DEBUG_PAGEALLOC KASAN
    [ 28.011860] Modules linked in:
    [ 28.012245] CPU: 0 PID: 289 Comm: kworker/0:3 Tainted: G W4.3.0-rc3+ #634
    [ 28.013065] Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS 1.7.5-20140709_153802- 04/01/2014
    [ 28.014160] Workqueue: events vmstat_update
    [ 28.014571] task: ffff880117682580 ti: ffff8800ba428000 task.ti: ffff8800ba428000
    [ 28.015445] RIP: 0010:[<ffffffff8115f921>] [<ffffffff8115f921>]vmstat_update+0x31/0x80
    [ 28.016282] RSP: 0018:ffff8800ba42fd80 EFLAGS: 00010297
    [ 28.016812] RAX: 0000000000000000 RBX: ffff88011a858dc0 RCX:0000000000000000
    [ 28.017585] RDX: ffff880117682580 RSI: ffffffff81f14d8c RDI:ffffffff81f4df8d
    [ 28.018366] RBP: ffff8800ba42fd90 R08: 0000000000000001 R09:0000000000000000
    [ 28.019169] R10: 0000000000000000 R11: 0000000000000121 R12:ffff8800baa9f640
    [ 28.019947] R13: ffff88011a81e340 R14: ffff88011a823700 R15:0000000000000000
    [ 28.020071] FS: 0000000000000000(0000) GS:ffff88011a800000(0000)knlGS:0000000000000000
    [ 28.020071] CS: 0010 DS: 0000 ES: 0000 CR0: 000000008005003b
    [ 28.020071] CR2: 00007ff6144b01d0 CR3: 00000000b8e93000 CR4:00000000000006f0
    [ 28.020071] Stack:
    [ 28.020071] ffff88011a858dc0 ffff8800baa9f640 ffff8800ba42fe00ffffffff8106bd88
    [ 28.020071] ffffffff8106bd0b 0000000000000096 0000000000000000ffffffff82f9b1e8
    [ 28.020071] ffffffff829f0b10 0000000000000000 ffffffff81f18460ffff88011a81e340
    [ 28.020071] Call Trace:
    [ 28.020071] [<ffffffff8106bd88>] process_one_work+0x1c8/0x540
    [ 28.020071] [<ffffffff8106bd0b>] ? process_one_work+0x14b/0x540
    [ 28.020071] [<ffffffff8106c214>] worker_thread+0x114/0x460
    [ 28.020071] [<ffffffff8106c100>] ? process_one_work+0x540/0x540
    [ 28.020071] [<ffffffff81071bf8>] kthread+0xf8/0x110
    [ 28.020071] [<ffffffff81071b00>] ?kthread_create_on_node+0x200/0x200
    [ 28.020071] [<ffffffff81a6522f>] ret_from_fork+0x3f/0x70
    [ 28.020071] [<ffffffff81071b00>] ?kthread_create_on_node+0x200/0x200

    Signed-off-by: Shaohua Li <shli@fb.com>
    Signed-off-by: Tejun Heo <tj@kernel.org>
    Signed-off-by: Jiri Slaby <jslaby@suse.cz>
    ---
    kernel/workqueue.c | 8 ++++----
    1 file changed, 4 insertions(+), 4 deletions(-)

    diff --git a/kernel/workqueue.c b/kernel/workqueue.c
    index bb5f920268d7..bba4e426ccbc 100644
    --- a/kernel/workqueue.c
    +++ b/kernel/workqueue.c
    @@ -1468,13 +1468,13 @@ static void __queue_delayed_work(int cpu, struct workqueue_struct *wq,
    timer_stats_timer_set_start_info(&dwork->timer);

    dwork->wq = wq;
    + /* timer isn't guaranteed to run in this cpu, record earlier */
    + if (cpu == WORK_CPU_UNBOUND)
    + cpu = raw_smp_processor_id();
    dwork->cpu = cpu;
    timer->expires = jiffies + delay;

    - if (unlikely(cpu != WORK_CPU_UNBOUND))
    - add_timer_on(timer, cpu);
    - else
    - add_timer(timer);
    + add_timer_on(timer, cpu);
    }

    /**
    --
    2.6.2


    \
     
     \ /
      Last update: 2015-10-28 15:41    [W:4.026 / U:0.028 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site