x86/hyperv: Redirect reenlightment notifications on CPU offlining

"Linux Kernel Mailing List" <[email protected]> Sat, 10 Feb 2018 22:00:24 +0000 (UTC)
Newsgroups gmane.linux.kernel.commits.head
Message-ID <[email protected]>
Web:        https://git.kernel.org/torvalds/c/e7c4e36c447daca2b7df49024f6bf230871cb155
Commit:     e7c4e36c447daca2b7df49024f6bf230871cb155
Parent:     93286261de1b46339aa27cd4c639b21778f6cade
Refname:    refs/heads/master
Author:     Vitaly Kuznetsov <[email protected]>
AuthorDate: Wed Jan 24 14:23:34 2018 +0100
Committer:  Thomas Gleixner <[email protected]>
CommitDate: Tue Jan 30 23:55:33 2018 +0100

    x86/hyperv: Redirect reenlightment notifications on CPU offlining
    
    It is very unlikely for CPUs to get offlined when running on Hyper-V as
    there is a protection in the vmbus module which prevents it when the guest
    has any VMBus devices assigned. This, however, may change in future if an
    option to reassign an already active channel will be added. It is also
    possible to run without any Hyper-V devices or to have a CPU with no
    assigned channels.
    
    Reassign reenlightenment notifications to some other active CPU when the
    CPU which is assigned to them goes offline.
    
    Signed-off-by: Vitaly Kuznetsov <[email protected]>
    Signed-off-by: Thomas Gleixner <[email protected]>
    Reviewed-by: Thomas Gleixner <[email protected]>
    Cc: Stephen Hemminger <[email protected]>
    Cc: [email protected]
    Cc: Radim Krčmář <[email protected]>
    Cc: Haiyang Zhang <[email protected]>
    Cc: "Michael Kelley (EOSG)" <[email protected]>
    Cc: Roman Kagan <[email protected]>
    Cc: Andy Lutomirski <[email protected]>
    Cc: [email protected]
    Cc: Paolo Bonzini <[email protected]>
    Cc: "K. Y. Srinivasan" <[email protected]>
    Cc: Cathy Avery <[email protected]>
    Cc: Mohammed Gamal <[email protected]>
    Link: https://lkml.kernel.org/r/[email protected]
---
 arch/x86/hyperv/hv_init.c | 22 +++++++++++++++++++++-
 1 file changed, 21 insertions(+), 1 deletion(-)

diff --git a/arch/x86/hyperv/hv_init.c b/arch/x86/hyperv/hv_init.c
index 712ac40081f7..e4377e2f2a10 100644
--- a/arch/x86/hyperv/hv_init.c
+++ b/arch/x86/hyperv/hv_init.c
@@ -191,6 +191,26 @@ void clear_hv_tscchange_cb(void)
 }
 EXPORT_SYMBOL_GPL(clear_hv_tscchange_cb);
 
+static int hv_cpu_die(unsigned int cpu)
+{
+	struct hv_reenlightenment_control re_ctrl;
+	unsigned int new_cpu;
+
+	if (hv_reenlightenment_cb == NULL)
+		return 0;
+
+	rdmsrl(HV_X64_MSR_REENLIGHTENMENT_CONTROL, *((u64 *)&re_ctrl));
+	if (re_ctrl.target_vp == hv_vp_index[cpu]) {
+		/* Reassign to some other online CPU */
+		new_cpu = cpumask_any_but(cpu_online_mask, cpu);
+
+		re_ctrl.target_vp = hv_vp_index[new_cpu];
+		wrmsrl(HV_X64_MSR_REENLIGHTENMENT_CONTROL, *((u64 *)&re_ctrl));
+	}
+
+	return 0;
+}
+
 /*
  * This function is to be invoked early in the boot sequence after the
  * hypervisor has been detected.
@@ -220,7 +240,7 @@ void hyperv_init(void)
 		return;
 
 	if (cpuhp_setup_state(CPUHP_AP_ONLINE_DYN, "x86/hyperv_init:online",
-			      hv_cpu_init, NULL) < 0)
+			      hv_cpu_init, hv_cpu_die) < 0)
 		goto free_vp_index;
 
 	/*
--
To unsubscribe from this list: send the line "unsubscribe git-commits-head" in
the body of a message to [email protected]
More majordomo info at  http://vger.kernel.org/majordomo-info.html