Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]


Groups > linux.kernel > #1535488

[PATCH V2 10/15] hv: make CPU offlining prevention fine-grained

From kys@exchange.microsoft.com
Newsgroups linux.kernel
Subject [PATCH V2 10/15] hv: make CPU offlining prevention fine-grained
Date 2016-12-03 19:50 +0100
Message-ID <sKnxL-4Vc-3@gated-at.bofh.it> (permalink)
References <sKno5-4RX-9@gated-at.bofh.it> <sKno5-4RX-11@gated-at.bofh.it>
Organization linux.* mail to news gateway

Show all headers | View raw


From: Vitaly Kuznetsov <vkuznets@redhat.com>

Since commit e513229b4c38 ("Drivers: hv: vmbus: prevent cpu offlining on
newer hypervisors") cpu offlining was disabled. It is still true that we
can't offline CPUs which have VMBus channels bound to them but we may have
'free' CPUs (e.v. we booted with maxcpus= parameter and onlined CPUs after
VMBus was initialized), these CPUs may be disabled without issues.

In future, we may even allow closing CPUs which have only sub-channels
assinged to them by closing these sub-channels. All devices will continue
to work.

Signed-off-by: Vitaly Kuznetsov <vkuznets@redhat.com>
Signed-off-by: K. Y. Srinivasan <kys@microsoft.com>
---
 drivers/hv/hv.c        |   31 +++++++++++++++++++++++++++++++
 drivers/hv/vmbus_drv.c |    9 ++++-----
 2 files changed, 35 insertions(+), 5 deletions(-)

diff --git a/drivers/hv/hv.c b/drivers/hv/hv.c
index b3f6a1b..4ece040 100644
--- a/drivers/hv/hv.c
+++ b/drivers/hv/hv.c
@@ -586,10 +586,41 @@ int hv_synic_cleanup(unsigned int cpu)
 	union hv_synic_simp simp;
 	union hv_synic_siefp siefp;
 	union hv_synic_scontrol sctrl;
+	struct vmbus_channel *channel, *sc;
+	bool channel_found = false;
+	unsigned long flags;
 
 	if (!hv_context.synic_initialized)
 		return -EFAULT;
 
+	/*
+	 * Search for channels which are bound to the CPU we're about to
+	 * cleanup. In case we find one and vmbus is still connected we need to
+	 * fail, this will effectively prevent CPU offlining. There is no way
+	 * we can re-bind channels to different CPUs for now.
+	 */
+	mutex_lock(&vmbus_connection.channel_mutex);
+	list_for_each_entry(channel, &vmbus_connection.chn_list, listentry) {
+		if (channel->target_cpu == cpu) {
+			channel_found = true;
+			break;
+		}
+		spin_lock_irqsave(&channel->lock, flags);
+		list_for_each_entry(sc, &channel->sc_list, sc_list) {
+			if (sc->target_cpu == cpu) {
+				channel_found = true;
+				break;
+			}
+		}
+		spin_unlock_irqrestore(&channel->lock, flags);
+		if (channel_found)
+			break;
+	}
+	mutex_unlock(&vmbus_connection.channel_mutex);
+
+	if (channel_found && vmbus_connection.conn_state == CONNECTED)
+		return -EBUSY;
+
 	/* Turn off clockevent device */
 	if (ms_hyperv.features & HV_X64_MSR_SYNTIMER_AVAILABLE) {
 		clockevents_unbind_device(hv_context.clk_evt[cpu], cpu);
diff --git a/drivers/hv/vmbus_drv.c b/drivers/hv/vmbus_drv.c
index a115c90..61d879f 100644
--- a/drivers/hv/vmbus_drv.c
+++ b/drivers/hv/vmbus_drv.c
@@ -855,9 +855,6 @@ static int vmbus_bus_init(void)
 	if (ret)
 		goto err_connect;
 
-	if (vmbus_proto_version > VERSION_WIN7)
-		cpu_hotplug_disable();
-
 	/*
 	 * Only register if the crash MSRs are available
 	 */
@@ -1328,6 +1325,9 @@ static void hv_kexec_handler(void)
 {
 	hv_synic_clockevents_cleanup();
 	vmbus_initiate_unload(false);
+	vmbus_connection.conn_state = DISCONNECTED;
+	/* Make sure conn_state is set as hv_synic_cleanup checks for it */
+	mb();
 	cpuhp_remove_state(hyperv_cpuhp_online);
 	hv_cleanup(false);
 };
@@ -1340,6 +1340,7 @@ static void hv_crash_handler(struct pt_regs *regs)
 	 * doing the cleanup for current CPU only. This should be sufficient
 	 * for kdump.
 	 */
+	vmbus_connection.conn_state = DISCONNECTED;
 	hv_synic_cleanup(smp_processor_id());
 	hv_cleanup(true);
 };
@@ -1408,8 +1409,6 @@ static void __exit vmbus_exit(void)
 	cpuhp_remove_state(hyperv_cpuhp_online);
 	hv_synic_free();
 	acpi_bus_unregister_driver(&vmbus_acpi_driver);
-	if (vmbus_proto_version > VERSION_WIN7)
-		cpu_hotplug_enable();
 }
 
 
-- 
1.7.4.1

Back to linux.kernel | Previous | NextPrevious in thread | Next in thread | Find similar | Unroll thread


Thread

[PATCH V2 01/15] Drivers: hv: vmbus: Raise retry/wait limits in vmbus_post_msg() kys@exchange.microsoft.com - 2016-12-03 19:40 +0100
  [PATCH V2 06/15] hv: allocate synic pages for all present CPUs kys@exchange.microsoft.com - 2016-12-03 19:50 +0100
    Re: [PATCH V2 06/15] hv: allocate synic pages for all present CPUs Greg KH <gregkh@linuxfoundation.org> - 2016-12-06 11:20 +0100
  [PATCH V2 10/15] hv: make CPU offlining prevention fine-grained kys@exchange.microsoft.com - 2016-12-03 19:50 +0100
  [PATCH V2 03/15] Drivers: hv: vmbus: Prevent sending data on a rescinded channel kys@exchange.microsoft.com - 2016-12-03 19:50 +0100
  [PATCH V2 11/15] hv: don't reset hv_context.tsc_page on crash kys@exchange.microsoft.com - 2016-12-03 19:50 +0100
  [PATCH V2 07/15] hv: init percpu_list in hv_synic_alloc() kys@exchange.microsoft.com - 2016-12-03 19:50 +0100
    Re: [PATCH V2 07/15] hv: init percpu_list in hv_synic_alloc() Greg KH <gregkh@linuxfoundation.org> - 2016-12-06 11:20 +0100
  [PATCH V2 15/15] hyperv: Add a function to detect if the device is a vmbus dev kys@exchange.microsoft.com - 2016-12-03 19:50 +0100
    Re: [PATCH V2 15/15] hyperv: Add a function to detect if the device  is a vmbus dev Greg KH <gregkh@linuxfoundation.org> - 2016-12-06 12:00 +0100
      RE: [PATCH V2 15/15] hyperv: Add a function to detect if the device  is a vmbus dev KY Srinivasan <kys@microsoft.com> - 2016-12-06 16:20 +0100
  [PATCH V2 08/15] hv: change clockevents unbind tactics kys@exchange.microsoft.com - 2016-12-03 19:50 +0100
  [PATCH V2 05/15] hv: acquire vmbus_connection.channel_mutex in vmbus_free_channels() kys@exchange.microsoft.com - 2016-12-03 19:50 +0100
  [PATCH V2 09/15] hv: switch to cpuhp state machine for synic init/cleanup kys@exchange.microsoft.com - 2016-12-03 19:50 +0100
  [PATCH V2 14/15] Tools: hv: kvp: configurable external scripts path kys@exchange.microsoft.com - 2016-12-03 19:50 +0100
  [PATCH V2 12/15] vmbus: add support for dynamic device id's kys@exchange.microsoft.com - 2016-12-03 19:50 +0100
  [PATCH V2 13/15] uio-hv-generic: new userspace i/o driver for VMBus kys@exchange.microsoft.com - 2016-12-03 19:50 +0100
  [PATCH V2 04/15] Drivers: hv: vmbus: Enhance the rescind callback functionality kys@exchange.microsoft.com - 2016-12-03 19:50 +0100
    Re: [PATCH V2 04/15] Drivers: hv: vmbus: Enhance the rescind  callback functionality Greg KH <gregkh@linuxfoundation.org> - 2016-12-06 11:10 +0100
  Re: [PATCH V2 01/15] Drivers: hv: vmbus: Raise retry/wait limits in  vmbus_post_msg() Greg KH <gregkh@linuxfoundation.org> - 2016-12-06 11:10 +0100

csiph-web