From: Greg Kroah-Hartman Date: Sun, 10 May 2015 12:46:17 +0000 (+0200) Subject: 4.0-stable patches X-Git-Tag: v3.19.8~4 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=32a091a0992e31c9875604c161a20ce1d8d02ede;p=thirdparty%2Fkernel%2Fstable-queue.git 4.0-stable patches added patches: clockevents-fix-cpu_down-race-for-hrtimer-based-broadcasting.patch drivers-hv-vmbus-don-t-wait-after-requesting-offers.patch --- 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 index 00000000000..4aa49b44ea7 --- /dev/null +++ b/queue-4.0/clockevents-fix-cpu_down-race-for-hrtimer-based-broadcasting.patch @@ -0,0 +1,150 @@ +From 345527b1edce8df719e0884500c76832a18211c3 Mon Sep 17 00:00:00 2001 +From: Preeti U Murthy +Date: Mon, 30 Mar 2015 14:59:19 +0530 +Subject: clockevents: Fix cpu_down() race for hrtimer based broadcasting + +From: Preeti U Murthy + +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 +Tested-by: Nicolas Pitre +Signed-off-by: Preeti U. Murthy +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 +Signed-off-by: Greg Kroah-Hartman +--- + +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 + #include + #include ++#include + #include + + #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 index 00000000000..e89e3e042d0 --- /dev/null +++ b/queue-4.0/drivers-hv-vmbus-don-t-wait-after-requesting-offers.patch @@ -0,0 +1,55 @@ +From 73cffdb65e679b98893f484063462c045adcf212 Mon Sep 17 00:00:00 2001 +From: "K. Y. Srinivasan" +Date: Thu, 19 Mar 2015 08:11:34 -0700 +Subject: Drivers: hv: vmbus: Don't wait after requesting offers + +From: "K. Y. Srinivasan" + +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 +Cc: +Signed-off-by: Greg Kroah-Hartman + +--- + 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); + diff --git a/queue-4.0/series b/queue-4.0/series index 9cc86af7174..3e369342f1a 100644 --- a/queue-4.0/series +++ b/queue-4.0/series @@ -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