git: 4f8c634de09f - main - arm64 Hyper-V: enable Hyper-V SMP for ARM64

From: Wei Hu <whu_at_FreeBSD.org>
Date: Wed, 07 Jun 2023 08:24:50 UTC
The branch main has been updated by whu:

URL: https://cgit.FreeBSD.org/src/commit/?id=4f8c634de09ffa2583306821e235f6f92104e729

commit 4f8c634de09ffa2583306821e235f6f92104e729
Author:     Wei Hu <whu@FreeBSD.org>
AuthorDate: 2023-06-07 08:03:59 +0000
Commit:     Wei Hu <whu@FreeBSD.org>
CommitDate: 2023-06-07 08:24:13 +0000

    arm64 Hyper-V: enable Hyper-V SMP for ARM64
    
    Vmbus_synic_setup() is invoked via vmbus_intrhook -> vmbus_doattach
    -> smp_rendezvous. On !EARLY_AP_STARTUP (e.g., aarch64), SMP isn't
    functional in intrhooks and smp_rendezvous() will just call
    vmbus_synic_setup() on the boot processor. There's nothing that will
    initialize the pcpu data on every other AP.
    
    To fix it we need to use SI_SUB_SMP for vmbus_doattach(). With this
    patch the vmbus interrupt should work on all arm64 cpus on HyperV.
    
    Reported by:    kevans
    Reviewed by:    kevans, whu
    Tested by:      Souradeep Chakrabarti <schakrabarti@microsoft.com>
    Obtained from:  Souradeep Chakrabarti <schakrabarti@microsoft.com>
    Sponsored by:   Microsoft
    Differential Revision:  https://reviews.freebsd.org/D40279
---
 sys/dev/hyperv/vmbus/vmbus.c | 28 ++++++----------------------
 1 file changed, 6 insertions(+), 22 deletions(-)

diff --git a/sys/dev/hyperv/vmbus/vmbus.c b/sys/dev/hyperv/vmbus/vmbus.c
index ae4c466d98d9..cc37d84ff151 100644
--- a/sys/dev/hyperv/vmbus/vmbus.c
+++ b/sys/dev/hyperv/vmbus/vmbus.c
@@ -114,7 +114,7 @@ static uint32_t			vmbus_get_vcpu_id_method(device_t bus,
 				    device_t dev, int cpu);
 static struct taskqueue		*vmbus_get_eventtq_method(device_t, device_t,
 				    int);
-#if defined(EARLY_AP_STARTUP) || defined(__aarch64__)
+#if defined(EARLY_AP_STARTUP)
 static void			vmbus_intrhook(void *);
 #endif
 
@@ -1482,7 +1482,7 @@ vmbus_event_proc_dummy(struct vmbus_softc *sc __unused, int cpu __unused)
 {
 }
 
-#if defined(EARLY_AP_STARTUP) || defined(__aarch64__)
+#if defined(EARLY_AP_STARTUP)
 
 static void
 vmbus_intrhook(void *xsc)
@@ -1495,7 +1495,7 @@ vmbus_intrhook(void *xsc)
 	config_intrhook_disestablish(&sc->vmbus_intrhook);
 }
 
-#endif /* EARLY_AP_STARTUP  aarch64 */
+#endif /* EARLY_AP_STARTUP */
 
 static int
 vmbus_attach(device_t dev)
@@ -1511,22 +1511,13 @@ vmbus_attach(device_t dev)
 	 */
 	vmbus_sc->vmbus_event_proc = vmbus_event_proc_dummy;
 
-#if defined(EARLY_AP_STARTUP) || defined(__aarch64__)
+#if defined(EARLY_AP_STARTUP)
 	/*
 	 * Defer the real attach until the pause(9) works as expected.
 	 */
 	vmbus_sc->vmbus_intrhook.ich_func = vmbus_intrhook;
 	vmbus_sc->vmbus_intrhook.ich_arg = vmbus_sc;
 	config_intrhook_establish(&vmbus_sc->vmbus_intrhook);
-#else	/* !EARLY_AP_STARTUP */
-	/* 
-	 * If the system has already booted and thread
-	 * scheduling is possible indicated by the global
-	 * cold set to zero, we just call the driver
-	 * initialization directly.
-	 */
-	if (!cold)
-		vmbus_doattach(vmbus_sc);
 #endif /* EARLY_AP_STARTUP  and aarch64 */
 
 	return (0);
@@ -1572,7 +1563,7 @@ vmbus_detach(device_t dev)
 	return (0);
 }
 
-#if !defined(EARLY_AP_STARTUP) && !defined(__aarch64__)
+#if !defined(EARLY_AP_STARTUP)
 
 static void
 vmbus_sysinit(void *arg __unused)
@@ -1582,14 +1573,7 @@ vmbus_sysinit(void *arg __unused)
 	if (vm_guest != VM_GUEST_HV || sc == NULL)
 		return;
 
-	/* 
-	 * If the system has already booted and thread
-	 * scheduling is possible, as indicated by the
-	 * global cold set to zero, we just call the driver
-	 * initialization directly.
-	 */
-	if (!cold)
-		vmbus_doattach(sc);
+	vmbus_doattach(sc);
 }
 /*
  * NOTE: