]> git.ipfire.org Git - thirdparty/kernel/stable-queue.git/commitdiff
4.0-stable patches
authorGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Sun, 10 May 2015 12:46:17 +0000 (14:46 +0200)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Sun, 10 May 2015 12:46:17 +0000 (14:46 +0200)
added patches:
clockevents-fix-cpu_down-race-for-hrtimer-based-broadcasting.patch
drivers-hv-vmbus-don-t-wait-after-requesting-offers.patch

queue-4.0/clockevents-fix-cpu_down-race-for-hrtimer-based-broadcasting.patch [new file with mode: 0644]
queue-4.0/drivers-hv-vmbus-don-t-wait-after-requesting-offers.patch [new file with mode: 0644]
queue-4.0/series

diff --git a/queue-4.0/clockevents-fix-cpu_down-race-for-hrtimer-based-broadcasting.patch b/queue-4.0/clockevents-fix-cpu_down-race-for-hrtimer-based-broadcasting.patch
new file mode 100644 (file)
index 0000000..4aa49b4
--- /dev/null
@@ -0,0 +1,150 @@
+From 345527b1edce8df719e0884500c76832a18211c3 Mon Sep 17 00:00:00 2001
+From: Preeti U Murthy <preeti@linux.vnet.ibm.com>
+Date: Mon, 30 Mar 2015 14:59:19 +0530
+Subject: clockevents: Fix cpu_down() race for hrtimer based broadcasting
+
+From: Preeti U Murthy <preeti@linux.vnet.ibm.com>
+
+commit 345527b1edce8df719e0884500c76832a18211c3 upstream.
+
+It was found when doing a hotplug stress test on POWER, that the
+machine either hit softlockups or rcu_sched stall warnings.  The
+issue was traced to commit:
+
+  7cba160ad789 ("powernv/cpuidle: Redesign idle states management")
+
+which exposed the cpu_down() race with hrtimer based broadcast mode:
+
+  5d1638acb9f6 ("tick: Introduce hrtimer based broadcast")
+
+The race is the following:
+
+Assume CPU1 is the CPU which holds the hrtimer broadcasting duty
+before it is taken down.
+
+       CPU0                                    CPU1
+
+       cpu_down()                              take_cpu_down()
+                                               disable_interrupts()
+
+       cpu_die()
+
+       while (CPU1 != CPU_DEAD) {
+               msleep(100);
+               switch_to_idle();
+               stop_cpu_timer();
+               schedule_broadcast();
+       }
+
+       tick_cleanup_cpu_dead()
+               take_over_broadcast()
+
+So after CPU1 disabled interrupts it cannot handle the broadcast
+hrtimer anymore, so CPU0 will be stuck forever.
+
+Fix this by explicitly taking over broadcast duty before cpu_die().
+
+This is a temporary workaround. What we really want is a callback
+in the clockevent device which allows us to do that from the dying
+CPU by pushing the hrtimer onto a different cpu. That might involve
+an IPI and is definitely more complex than this immediate fix.
+
+Changelog was picked up from:
+
+    https://lkml.org/lkml/2015/2/16/213
+
+Suggested-by: Thomas Gleixner <tglx@linutronix.de>
+Tested-by: Nicolas Pitre <nico@linaro.org>
+Signed-off-by: Preeti U. Murthy <preeti@linux.vnet.ibm.com>
+Cc: linuxppc-dev@lists.ozlabs.org
+Cc: mpe@ellerman.id.au
+Cc: nicolas.pitre@linaro.org
+Cc: peterz@infradead.org
+Cc: rjw@rjwysocki.net
+Fixes: http://linuxppc.10917.n7.nabble.com/offlining-cpus-breakage-td88619.html
+Link: http://lkml.kernel.org/r/20150330092410.24979.59887.stgit@preeti.in.ibm.com
+[ Merged it to the latest timer tree, renamed the callback, tidied up the changelog. ]
+Signed-off-by: Ingo Molnar <mingo@kernel.org>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+---
+
+Added a hunk that got missed in the previous post.
+Please add this to stable 3.19 and 4.0. The patch applies on both.
+
+ include/linux/tick.h         |    7 ++++++-
+ kernel/cpu.c                 |    2 ++
+ kernel/time/tick-broadcast.c |   19 +++++++++++--------
+ 3 files changed, 19 insertions(+), 9 deletions(-)
+
+--- a/include/linux/tick.h
++++ b/include/linux/tick.h
+@@ -100,8 +100,13 @@ extern struct cpumask *tick_get_broadcas
+ #  ifdef CONFIG_TICK_ONESHOT
+ extern struct cpumask *tick_get_broadcast_oneshot_mask(void);
+-#  endif
++extern void hotplug_cpu__broadcast_tick_pull(int dead_cpu);
++# else
++static inline void hotplug_cpu__broadcast_tick_pull(int dead_cpu) { }
++#  endif /* TICK_ONESHOT */
++# else
++static inline void hotplug_cpu__broadcast_tick_pull(int dead_cpu) { }
+ # endif /* BROADCAST */
+ # ifdef CONFIG_TICK_ONESHOT
+--- a/kernel/cpu.c
++++ b/kernel/cpu.c
+@@ -20,6 +20,7 @@
+ #include <linux/gfp.h>
+ #include <linux/suspend.h>
+ #include <linux/lockdep.h>
++#include <linux/tick.h>
+ #include <trace/events/power.h>
+ #include "smpboot.h"
+@@ -411,6 +412,7 @@ static int __ref _cpu_down(unsigned int
+       while (!idle_cpu(cpu))
+               cpu_relax();
++      hotplug_cpu__broadcast_tick_pull(cpu);
+       /* This actually kills the CPU. */
+       __cpu_die(cpu);
+--- a/kernel/time/tick-broadcast.c
++++ b/kernel/time/tick-broadcast.c
+@@ -669,14 +669,19 @@ static void broadcast_shutdown_local(str
+       clockevents_set_mode(dev, CLOCK_EVT_MODE_SHUTDOWN);
+ }
+-static void broadcast_move_bc(int deadcpu)
++void hotplug_cpu__broadcast_tick_pull(int deadcpu)
+ {
+-      struct clock_event_device *bc = tick_broadcast_device.evtdev;
++      struct clock_event_device *bc;
++      unsigned long flags;
++
++      raw_spin_lock_irqsave(&tick_broadcast_lock, flags);
++      bc = tick_broadcast_device.evtdev;
+-      if (!bc || !broadcast_needs_cpu(bc, deadcpu))
+-              return;
+-      /* This moves the broadcast assignment to this cpu */
+-      clockevents_program_event(bc, bc->next_event, 1);
++      if (bc && broadcast_needs_cpu(bc, deadcpu)) {
++              /* This moves the broadcast assignment to this CPU: */
++              clockevents_program_event(bc, bc->next_event, 1);
++      }
++      raw_spin_unlock_irqrestore(&tick_broadcast_lock, flags);
+ }
+ /*
+@@ -913,8 +918,6 @@ void tick_shutdown_broadcast_oneshot(uns
+       cpumask_clear_cpu(cpu, tick_broadcast_pending_mask);
+       cpumask_clear_cpu(cpu, tick_broadcast_force_mask);
+-      broadcast_move_bc(cpu);
+-
+       raw_spin_unlock_irqrestore(&tick_broadcast_lock, flags);
+ }
diff --git a/queue-4.0/drivers-hv-vmbus-don-t-wait-after-requesting-offers.patch b/queue-4.0/drivers-hv-vmbus-don-t-wait-after-requesting-offers.patch
new file mode 100644 (file)
index 0000000..e89e3e0
--- /dev/null
@@ -0,0 +1,55 @@
+From 73cffdb65e679b98893f484063462c045adcf212 Mon Sep 17 00:00:00 2001
+From: "K. Y. Srinivasan" <kys@microsoft.com>
+Date: Thu, 19 Mar 2015 08:11:34 -0700
+Subject: Drivers: hv: vmbus: Don't wait after requesting offers
+
+From: "K. Y. Srinivasan" <kys@microsoft.com>
+
+commit 73cffdb65e679b98893f484063462c045adcf212 upstream.
+
+Don't wait after sending request for offers to the host. This wait is
+unnecessary and simply adds 5 seconds to the boot time.
+
+Signed-off-by: K. Y. Srinivasan <kys@microsoft.com>
+Cc: <stable@vger.kernel.org>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+
+---
+ drivers/hv/channel_mgmt.c |   12 +-----------
+ 1 file changed, 1 insertion(+), 11 deletions(-)
+
+--- a/drivers/hv/channel_mgmt.c
++++ b/drivers/hv/channel_mgmt.c
+@@ -787,7 +787,7 @@ int vmbus_request_offers(void)
+ {
+       struct vmbus_channel_message_header *msg;
+       struct vmbus_channel_msginfo *msginfo;
+-      int ret, t;
++      int ret;
+       msginfo = kmalloc(sizeof(*msginfo) +
+                         sizeof(struct vmbus_channel_message_header),
+@@ -795,8 +795,6 @@ int vmbus_request_offers(void)
+       if (!msginfo)
+               return -ENOMEM;
+-      init_completion(&msginfo->waitevent);
+-
+       msg = (struct vmbus_channel_message_header *)msginfo->msg;
+       msg->msgtype = CHANNELMSG_REQUESTOFFERS;
+@@ -810,14 +808,6 @@ int vmbus_request_offers(void)
+               goto cleanup;
+       }
+-      t = wait_for_completion_timeout(&msginfo->waitevent, 5*HZ);
+-      if (t == 0) {
+-              ret = -ETIMEDOUT;
+-              goto cleanup;
+-      }
+-
+-
+-
+ cleanup:
+       kfree(msginfo);
index 9cc86af71740fd005ab8c4de6805fb4643cebfa8..3e369342f1abdb7d03b302fb49661baee2aad570 100644 (file)
@@ -69,3 +69,5 @@ drm-radeon-fix-lockup-when-bos-aren-t-part-of-the-vm-on-release.patch
 drm-radeon-reset-bos-address-after-clearing-it.patch
 drm-radeon-check-new-address-before-removing-old-one.patch
 hfsplus-don-t-store-special-osx-xattr-prefix-on-disk.patch
+drivers-hv-vmbus-don-t-wait-after-requesting-offers.patch
+clockevents-fix-cpu_down-race-for-hrtimer-based-broadcasting.patch