From: Greg Kroah-Hartman Date: Fri, 23 Oct 2015 14:28:22 +0000 (-0700) Subject: 3.10-stable patches X-Git-Tag: v3.14.56~14 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=2db3965adad00e065ce6f5011de3853e56330a1c;p=thirdparty%2Fkernel%2Fstable-queue.git 3.10-stable patches added patches: i2c-rcar-enable-runtimepm-before-registering-to-the-core.patch workqueue-make-sure-delayed-work-run-in-local-cpu.patch --- diff --git a/queue-3.10/i2c-rcar-enable-runtimepm-before-registering-to-the-core.patch b/queue-3.10/i2c-rcar-enable-runtimepm-before-registering-to-the-core.patch new file mode 100644 index 00000000000..038b8e9f8be --- /dev/null +++ b/queue-3.10/i2c-rcar-enable-runtimepm-before-registering-to-the-core.patch @@ -0,0 +1,44 @@ +From 4f7effddf4549d57114289f273710f077c4c330a Mon Sep 17 00:00:00 2001 +From: Wolfram Sang +Date: Fri, 9 Oct 2015 10:39:25 +0100 +Subject: i2c: rcar: enable RuntimePM before registering to the core + +From: Wolfram Sang + +commit 4f7effddf4549d57114289f273710f077c4c330a upstream. + +The core may register clients attached to this master which may use +funtionality from the master. So, RuntimePM must be enabled before, otherwise +this will fail. While here, move drvdata, too. + +Reported-by: Geert Uytterhoeven +Signed-off-by: Wolfram Sang +Signed-off-by: Wolfram Sang +Signed-off-by: Greg Kroah-Hartman + +--- + drivers/i2c/busses/i2c-rcar.c | 7 ++++--- + 1 file changed, 4 insertions(+), 3 deletions(-) + +--- a/drivers/i2c/busses/i2c-rcar.c ++++ b/drivers/i2c/busses/i2c-rcar.c +@@ -673,15 +673,16 @@ static int rcar_i2c_probe(struct platfor + return ret; + } + ++ pm_runtime_enable(dev); ++ platform_set_drvdata(pdev, priv); ++ + ret = i2c_add_numbered_adapter(adap); + if (ret < 0) { + dev_err(dev, "reg adap failed: %d\n", ret); ++ pm_runtime_disable(dev); + return ret; + } + +- pm_runtime_enable(dev); +- platform_set_drvdata(pdev, priv); +- + dev_info(dev, "probed\n"); + + return 0; diff --git a/queue-3.10/series b/queue-3.10/series index 7ecfe7ecb51..e783f46529a 100644 --- a/queue-3.10/series +++ b/queue-3.10/series @@ -11,3 +11,5 @@ asix-do-full-reset-during-ax88772_bind.patch m68k-uaccess-fix-asm-constraints-for-userspace-access.patch crypto-sparc-initialize-blkcipher.ivsize.patch crypto-ahash-ensure-statesize-is-non-zero.patch +i2c-rcar-enable-runtimepm-before-registering-to-the-core.patch +workqueue-make-sure-delayed-work-run-in-local-cpu.patch diff --git a/queue-3.10/workqueue-make-sure-delayed-work-run-in-local-cpu.patch b/queue-3.10/workqueue-make-sure-delayed-work-run-in-local-cpu.patch new file mode 100644 index 00000000000..4cfee24caaf --- /dev/null +++ b/queue-3.10/workqueue-make-sure-delayed-work-run-in-local-cpu.patch @@ -0,0 +1,78 @@ +From 874bbfe600a660cba9c776b3957b1ce393151b76 Mon Sep 17 00:00:00 2001 +From: Shaohua Li +Date: Wed, 30 Sep 2015 09:05:30 -0700 +Subject: workqueue: make sure delayed work run in local cpu + +From: Shaohua Li + +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:[] []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] [] process_one_work+0x1c8/0x540 +[ 28.020071] [] ? process_one_work+0x14b/0x540 +[ 28.020071] [] worker_thread+0x114/0x460 +[ 28.020071] [] ? process_one_work+0x540/0x540 +[ 28.020071] [] kthread+0xf8/0x110 +[ 28.020071] [] ?kthread_create_on_node+0x200/0x200 +[ 28.020071] [] ret_from_fork+0x3f/0x70 +[ 28.020071] [] ?kthread_create_on_node+0x200/0x200 + +Signed-off-by: Shaohua Li +Signed-off-by: Tejun Heo +Signed-off-by: Greg Kroah-Hartman + +--- + kernel/workqueue.c | 8 ++++---- + 1 file changed, 4 insertions(+), 4 deletions(-) + +--- a/kernel/workqueue.c ++++ b/kernel/workqueue.c +@@ -1450,13 +1450,13 @@ static void __queue_delayed_work(int cpu + 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); + } + + /**