]> asedeno.scripts.mit.edu Git - linux.git/commitdiff
Drivers: hv: vmbus: Break out synic enable and disable operations
authorDexuan Cui <decui@microsoft.com>
Thu, 5 Sep 2019 23:01:15 +0000 (23:01 +0000)
committerSasha Levin <sashal@kernel.org>
Fri, 6 Sep 2019 18:52:44 +0000 (14:52 -0400)
Break out synic enable and disable operations into separate
hv_synic_disable_regs() and hv_synic_enable_regs() functions for use by a
later patch to support hibernation.

There is no functional change except the unnecessary check
"if (sctrl.enable != 1) return -EFAULT;" which is removed, because when
we're in hv_synic_cleanup(), we're absolutely sure sctrl.enable must be 1.

Signed-off-by: Dexuan Cui <decui@microsoft.com>
Reviewed-by: Michael Kelley <mikelley@microsoft.com>
Signed-off-by: Sasha Levin <sashal@kernel.org>
drivers/hv/hv.c
drivers/hv/hyperv_vmbus.h

index 6188fb7dda4245e914a7fa46515f5b9161048b67..fcc52797c16935ea47cee18af55ae61de75681d4 100644 (file)
@@ -154,7 +154,7 @@ void hv_synic_free(void)
  * retrieve the initialized message and event pages.  Otherwise, we create and
  * initialize the message and event pages.
  */
-int hv_synic_init(unsigned int cpu)
+void hv_synic_enable_regs(unsigned int cpu)
 {
        struct hv_per_cpu_context *hv_cpu
                = per_cpu_ptr(hv_context.cpu_context, cpu);
@@ -196,6 +196,11 @@ int hv_synic_init(unsigned int cpu)
        sctrl.enable = 1;
 
        hv_set_synic_state(sctrl.as_uint64);
+}
+
+int hv_synic_init(unsigned int cpu)
+{
+       hv_synic_enable_regs(cpu);
 
        hv_stimer_init(cpu);
 
@@ -205,20 +210,45 @@ int hv_synic_init(unsigned int cpu)
 /*
  * hv_synic_cleanup - Cleanup routine for hv_synic_init().
  */
-int hv_synic_cleanup(unsigned int cpu)
+void hv_synic_disable_regs(unsigned int cpu)
 {
        union hv_synic_sint shared_sint;
        union hv_synic_simp simp;
        union hv_synic_siefp siefp;
        union hv_synic_scontrol sctrl;
+
+       hv_get_synint_state(VMBUS_MESSAGE_SINT, shared_sint.as_uint64);
+
+       shared_sint.masked = 1;
+
+       /* Need to correctly cleanup in the case of SMP!!! */
+       /* Disable the interrupt */
+       hv_set_synint_state(VMBUS_MESSAGE_SINT, shared_sint.as_uint64);
+
+       hv_get_simp(simp.as_uint64);
+       simp.simp_enabled = 0;
+       simp.base_simp_gpa = 0;
+
+       hv_set_simp(simp.as_uint64);
+
+       hv_get_siefp(siefp.as_uint64);
+       siefp.siefp_enabled = 0;
+       siefp.base_siefp_gpa = 0;
+
+       hv_set_siefp(siefp.as_uint64);
+
+       /* Disable the global synic bit */
+       hv_get_synic_state(sctrl.as_uint64);
+       sctrl.enable = 0;
+       hv_set_synic_state(sctrl.as_uint64);
+}
+
+int hv_synic_cleanup(unsigned int cpu)
+{
        struct vmbus_channel *channel, *sc;
        bool channel_found = false;
        unsigned long flags;
 
-       hv_get_synic_state(sctrl.as_uint64);
-       if (sctrl.enable != 1)
-               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
@@ -249,29 +279,7 @@ int hv_synic_cleanup(unsigned int cpu)
 
        hv_stimer_cleanup(cpu);
 
-       hv_get_synint_state(VMBUS_MESSAGE_SINT, shared_sint.as_uint64);
-
-       shared_sint.masked = 1;
-
-       /* Need to correctly cleanup in the case of SMP!!! */
-       /* Disable the interrupt */
-       hv_set_synint_state(VMBUS_MESSAGE_SINT, shared_sint.as_uint64);
-
-       hv_get_simp(simp.as_uint64);
-       simp.simp_enabled = 0;
-       simp.base_simp_gpa = 0;
-
-       hv_set_simp(simp.as_uint64);
-
-       hv_get_siefp(siefp.as_uint64);
-       siefp.siefp_enabled = 0;
-       siefp.base_siefp_gpa = 0;
-
-       hv_set_siefp(siefp.as_uint64);
-
-       /* Disable the global synic bit */
-       sctrl.enable = 0;
-       hv_set_synic_state(sctrl.as_uint64);
+       hv_synic_disable_regs(cpu);
 
        return 0;
 }
index 362e70e9d145410f71dd14c1561a761195ac971c..26ea161a6876585e72b83dbab79f6d7bfa3fe4dd 100644 (file)
@@ -171,8 +171,10 @@ extern int hv_synic_alloc(void);
 
 extern void hv_synic_free(void);
 
+extern void hv_synic_enable_regs(unsigned int cpu);
 extern int hv_synic_init(unsigned int cpu);
 
+extern void hv_synic_disable_regs(unsigned int cpu);
 extern int hv_synic_cleanup(unsigned int cpu);
 
 /* Interface */