]> git.ipfire.org Git - thirdparty/kernel/stable-queue.git/commitdiff
3.10-stable patches
authorGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Fri, 23 Oct 2015 14:28:22 +0000 (07:28 -0700)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Fri, 23 Oct 2015 14:28:22 +0000 (07:28 -0700)
added patches:
i2c-rcar-enable-runtimepm-before-registering-to-the-core.patch
workqueue-make-sure-delayed-work-run-in-local-cpu.patch

queue-3.10/i2c-rcar-enable-runtimepm-before-registering-to-the-core.patch [new file with mode: 0644]
queue-3.10/series
queue-3.10/workqueue-make-sure-delayed-work-run-in-local-cpu.patch [new file with mode: 0644]

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 (file)
index 0000000..038b8e9
--- /dev/null
@@ -0,0 +1,44 @@
+From 4f7effddf4549d57114289f273710f077c4c330a Mon Sep 17 00:00:00 2001
+From: Wolfram Sang <wsa+renesas@sang-engineering.com>
+Date: Fri, 9 Oct 2015 10:39:25 +0100
+Subject: i2c: rcar: enable RuntimePM before registering to the core
+
+From: Wolfram Sang <wsa+renesas@sang-engineering.com>
+
+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 <geert+renesas@glider.be>
+Signed-off-by: Wolfram Sang <wsa+renesas@sang-engineering.com>
+Signed-off-by: Wolfram Sang <wsa@the-dreams.de>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+
+---
+ 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;
index 7ecfe7ecb51ed6859583a1e61d7f81b39cfd16f5..e783f46529a7d1c8c877771a8630ae27ba3a513c 100644 (file)
@@ -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 (file)
index 0000000..4cfee24
--- /dev/null
@@ -0,0 +1,78 @@
+From 874bbfe600a660cba9c776b3957b1ce393151b76 Mon Sep 17 00:00:00 2001
+From: Shaohua Li <shli@fb.com>
+Date: Wed, 30 Sep 2015 09:05:30 -0700
+Subject: workqueue: make sure delayed work run in local cpu
+
+From: Shaohua Li <shli@fb.com>
+
+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: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+
+---
+ 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);
+ }
+ /**