From: "K. Y. Srinivasan" <kys@microsoft.com>
To: gregkh@linuxfoundation.org, linux-kernel@vger.kernel.org,
devel@linuxdriverproject.org, olaf@aepfle.de, apw@canonical.com,
vkuznets@redhat.com
Cc: "K. Y. Srinivasan" <kys@microsoft.com>
Subject: [PATCH 01/16] Drivers: hv: vmbus: prevent cpu offlining on newer hypervisors
Date: Tue, 3 Feb 2015 18:26:29 -0800 [thread overview]
Message-ID: <1423016804-22014-1-git-send-email-kys@microsoft.com> (raw)
In-Reply-To: <1423016775-21973-1-git-send-email-kys@microsoft.com>
From: Vitaly Kuznetsov <vkuznets@redhat.com>
When an SMP Hyper-V guest is running on top of 2012R2 Server and secondary
cpus are sent offline (with echo 0 > /sys/devices/system/cpu/cpu$cpu/online)
the system freeze is observed. This happens due to the fact that on newer
hypervisors (Win8, WS2012R2, ...) vmbus channel handlers are distributed
across all cpus (see init_vp_index() function in drivers/hv/channel_mgmt.c)
and on cpu offlining nobody reassigns them to CPU0. Prevent cpu offlining
when vmbus is loaded until the issue is fixed host-side.
This patch also disables hibernation but it is OK as it is also broken (MCE
error is hit on resume). Suspend still works.
Tested with WS2008R2 and WS2012R2.
Signed-off-by: Vitaly Kuznetsov <vkuznets@redhat.com>
Signed-off-by: K. Y. Srinivasan <kys@microsoft.com>
---
drivers/hv/vmbus_drv.c | 36 ++++++++++++++++++++++++++++++++++++
1 files changed, 36 insertions(+), 0 deletions(-)
diff --git a/drivers/hv/vmbus_drv.c b/drivers/hv/vmbus_drv.c
index 35e3f42..90c3400 100644
--- a/drivers/hv/vmbus_drv.c
+++ b/drivers/hv/vmbus_drv.c
@@ -33,6 +33,7 @@
#include <linux/hyperv.h>
#include <linux/kernel_stat.h>
#include <linux/clockchips.h>
+#include <linux/cpu.h>
#include <asm/hyperv.h>
#include <asm/hypervisor.h>
#include <asm/mshyperv.h>
@@ -704,6 +705,39 @@ static void vmbus_isr(void)
}
}
+#ifdef CONFIG_HOTPLUG_CPU
+static int hyperv_cpu_disable(void)
+{
+ return -ENOSYS;
+}
+
+static void hv_cpu_hotplug_quirk(bool vmbus_loaded)
+{
+ static void *previous_cpu_disable;
+
+ /*
+ * Offlining a CPU when running on newer hypervisors (WS2012R2, Win8,
+ * ...) is not supported at this moment as channel interrupts are
+ * distributed across all of them.
+ */
+
+ if ((vmbus_proto_version == VERSION_WS2008) ||
+ (vmbus_proto_version == VERSION_WIN7))
+ return;
+
+ if (vmbus_loaded) {
+ previous_cpu_disable = smp_ops.cpu_disable;
+ smp_ops.cpu_disable = hyperv_cpu_disable;
+ pr_notice("CPU offlining is not supported by hypervisor\n");
+ } else if (previous_cpu_disable)
+ smp_ops.cpu_disable = previous_cpu_disable;
+}
+#else
+static void hv_cpu_hotplug_quirk(bool vmbus_loaded)
+{
+}
+#endif
+
/*
* vmbus_bus_init -Main vmbus driver initialization routine.
*
@@ -744,6 +778,7 @@ static int vmbus_bus_init(int irq)
if (ret)
goto err_alloc;
+ hv_cpu_hotplug_quirk(true);
vmbus_request_offers();
return 0;
@@ -997,6 +1032,7 @@ static void __exit vmbus_exit(void)
bus_unregister(&hv_bus);
hv_cleanup();
acpi_bus_unregister_driver(&vmbus_acpi_driver);
+ hv_cpu_hotplug_quirk(false);
}
--
1.7.4.1
next prev parent reply other threads:[~2015-02-04 1:13 UTC|newest]
Thread overview: 17+ messages / expand[flat|nested] mbox.gz Atom feed top
2015-02-04 2:26 [PATCH 00/16] Drivers: hv: vmbus: Miscellaneous fixes/enhancements K. Y. Srinivasan
2015-02-04 2:26 ` K. Y. Srinivasan [this message]
2015-02-04 2:26 ` [PATCH 02/16] Drivers: hv: vmbus: rename channel work queues K. Y. Srinivasan
2015-02-04 2:26 ` [PATCH 03/16] drivers:hv:vmbus drivers:hv:vmbus Allow for more than one MMIO range for children K. Y. Srinivasan
2015-02-04 2:26 ` [PATCH 04/16] Drivers: hv: vmbus: avoid double kfree for device_obj K. Y. Srinivasan
2015-02-04 2:26 ` [PATCH 05/16] Drivers: hv: vmbus: teardown hv_vmbus_con workqueue and vmbus_connection pages on shutdown K. Y. Srinivasan
2015-02-04 2:26 ` [PATCH 06/16] drivers: hv: vmbus: Teardown synthetic interrupt controllers on module unload K. Y. Srinivasan
2015-02-04 2:26 ` [PATCH 07/16] clockevents: export clockevents_unbind_device instead of clockevents_unbind K. Y. Srinivasan
2015-02-04 2:26 ` [PATCH 08/16] Drivers: hv: vmbus: Teardown clockevent devices on module unload K. Y. Srinivasan
2015-02-04 2:26 ` [PATCH 09/16] hv: hv_util: move vmbus_open() to a later place K. Y. Srinivasan
2015-02-04 2:26 ` [PATCH 10/16] hv: vmbus_post_msg: retry the hypercall on some transient errors K. Y. Srinivasan
2015-02-04 2:26 ` [PATCH 11/16] hv: vmbus_open(): reset the channel state on ENOMEM K. Y. Srinivasan
2015-02-04 2:26 ` [PATCH 12/16] hv: channel: match var type to return type of wait_for_completion K. Y. Srinivasan
2015-02-04 2:26 ` [PATCH 13/16] hv: channel_mgmt: " K. Y. Srinivasan
2015-02-04 2:26 ` [PATCH 14/16] hv: hv_balloon: " K. Y. Srinivasan
2015-02-04 2:26 ` [PATCH 15/16] Drivers: hv: vmbus: Fix a bug in the error path in vmbus_open() K. Y. Srinivasan
2015-02-04 2:26 ` [PATCH 16/16] Drivers: hv: vmbus: Add support for the NetworkDirect GUID K. Y. Srinivasan
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1423016804-22014-1-git-send-email-kys@microsoft.com \
--to=kys@microsoft.com \
--cc=apw@canonical.com \
--cc=devel@linuxdriverproject.org \
--cc=gregkh@linuxfoundation.org \
--cc=linux-kernel@vger.kernel.org \
--cc=olaf@aepfle.de \
--cc=vkuznets@redhat.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.