svn commit: r300650 - head/sys/dev/hyperv/vmbus

Sepherosa Ziehau sephe at FreeBSD.org
Wed May 25 05:22:37 UTC 2016


Author: sephe
Date: Wed May 25 05:22:35 2016
New Revision: 300650
URL: https://svnweb.freebsd.org/changeset/base/300650

Log:
  hyperv/vmbus: Move two global flags into vmbus softc
  
  And pack them into one flag field.
  
  MFC after:	1 week
  Sponsored by:	Microsoft OSTC
  Differential Revision:	https://reviews.freebsd.org/D6522

Modified:
  head/sys/dev/hyperv/vmbus/hv_hv.c
  head/sys/dev/hyperv/vmbus/hv_vmbus_drv_freebsd.c
  head/sys/dev/hyperv/vmbus/hv_vmbus_priv.h
  head/sys/dev/hyperv/vmbus/vmbus_var.h

Modified: head/sys/dev/hyperv/vmbus/hv_hv.c
==============================================================================
--- head/sys/dev/hyperv/vmbus/hv_hv.c	Wed May 25 05:20:34 2016	(r300649)
+++ head/sys/dev/hyperv/vmbus/hv_hv.c	Wed May 25 05:22:35 2016	(r300650)
@@ -96,13 +96,6 @@ u_int	hyperv_recommends;
 static u_int	hyperv_pm_features;
 static u_int	hyperv_features3;
 
-/**
- * Globals
- */
-hv_vmbus_context hv_vmbus_g_context = {
-	.syn_ic_initialized = FALSE,
-};
-
 static struct timecounter hv_timecounter = {
 	hv_get_timecount, 0, ~0u, HV_NANOSECONDS_PER_SEC/100, "Hyper-V", HV_NANOSECONDS_PER_SEC/100
 };

Modified: head/sys/dev/hyperv/vmbus/hv_vmbus_drv_freebsd.c
==============================================================================
--- head/sys/dev/hyperv/vmbus/hv_vmbus_drv_freebsd.c	Wed May 25 05:20:34 2016	(r300649)
+++ head/sys/dev/hyperv/vmbus/hv_vmbus_drv_freebsd.c	Wed May 25 05:22:35 2016	(r300650)
@@ -68,8 +68,6 @@ __FBSDID("$FreeBSD$");
 
 struct vmbus_softc	*vmbus_sc;
 
-static int vmbus_inited;
-
 static char *vmbus_ids[] = { "VMBUS", NULL };
 
 extern inthand_t IDTVEC(hv_vmbus_callback);
@@ -264,8 +262,6 @@ vmbus_synic_setup(void *arg __unused)
 
 	wrmsr(HV_X64_MSR_SCONTROL, sctrl.as_uint64_t);
 
-	hv_vmbus_g_context.syn_ic_initialized = TRUE;
-
 	/*
 	 * Set up the cpuid mapping from Hyper-V to FreeBSD.
 	 * The array is indexed using FreeBSD cpuid.
@@ -280,9 +276,6 @@ vmbus_synic_teardown(void *arg)
 	hv_vmbus_synic_simp	simp;
 	hv_vmbus_synic_siefp	siefp;
 
-	if (!hv_vmbus_g_context.syn_ic_initialized)
-	    return;
-
 	shared_sint.as_uint64_t = rdmsr(
 	    HV_X64_MSR_SINT0 + HV_VMBUS_MESSAGE_SINT);
 
@@ -608,14 +601,12 @@ vmbus_probe(device_t dev)
 static int
 vmbus_bus_init(void)
 {
-	struct vmbus_softc *sc;
+	struct vmbus_softc *sc = vmbus_get_softc();
 	int ret;
 
-	if (vmbus_inited)
+	if (sc->vmbus_flags & VMBUS_FLAG_ATTACHED)
 		return (0);
-
-	vmbus_inited = 1;
-	sc = vmbus_get_softc();
+	sc->vmbus_flags |= VMBUS_FLAG_ATTACHED;
 
 	/*
 	 * Allocate DMA stuffs.
@@ -631,10 +622,13 @@ vmbus_bus_init(void)
 	if (ret != 0)
 		goto cleanup;
 
+	/*
+	 * Setup SynIC.
+	 */
 	if (bootverbose)
-		printf("VMBUS: Calling smp_rendezvous, smp_started = %d\n",
-		    smp_started);
+		device_printf(sc->vmbus_dev, "smp_started = %d\n", smp_started);
 	smp_rendezvous(NULL, vmbus_synic_setup, NULL, NULL);
+	sc->vmbus_flags |= VMBUS_FLAG_SYNIC;
 
 	/*
 	 * Connect to VMBus in the root partition
@@ -725,7 +719,10 @@ vmbus_detach(device_t dev)
 	hv_vmbus_release_unattached_channels();
 	hv_vmbus_disconnect();
 
-	smp_rendezvous(NULL, vmbus_synic_teardown, NULL, NULL);
+	if (sc->vmbus_flags & VMBUS_FLAG_SYNIC) {
+		sc->vmbus_flags &= ~VMBUS_FLAG_SYNIC;
+		smp_rendezvous(NULL, vmbus_synic_teardown, NULL, NULL);
+	}
 
 	vmbus_intr_teardown(sc);
 	vmbus_dma_free(sc);

Modified: head/sys/dev/hyperv/vmbus/hv_vmbus_priv.h
==============================================================================
--- head/sys/dev/hyperv/vmbus/hv_vmbus_priv.h	Wed May 25 05:20:34 2016	(r300649)
+++ head/sys/dev/hyperv/vmbus/hv_vmbus_priv.h	Wed May 25 05:22:35 2016	(r300650)
@@ -200,10 +200,6 @@ enum {
 struct vmbus_message;
 union vmbus_event_flags;
 
-typedef struct {
-	hv_bool_uint8_t	syn_ic_initialized;
-} hv_vmbus_context;
-
 /*
  * Define hypervisor message types
  */
@@ -635,7 +631,6 @@ typedef enum {
  * Global variables
  */
 
-extern hv_vmbus_context		hv_vmbus_g_context;
 extern hv_vmbus_connection	hv_vmbus_g_connection;
 
 extern u_int			hyperv_features;

Modified: head/sys/dev/hyperv/vmbus/vmbus_var.h
==============================================================================
--- head/sys/dev/hyperv/vmbus/vmbus_var.h	Wed May 25 05:20:34 2016	(r300649)
+++ head/sys/dev/hyperv/vmbus/vmbus_var.h	Wed May 25 05:22:35 2016	(r300650)
@@ -55,8 +55,12 @@ struct vmbus_softc {
 	/* Rarely used fields */
 	device_t		vmbus_dev;
 	int			vmbus_idtvec;
+	uint32_t		vmbus_flags;	/* see VMBUS_FLAG_ */
 };
 
+#define VMBUS_FLAG_ATTACHED	0x0001	/* vmbus was attached */
+#define VMBUS_FLAG_SYNIC	0x0002	/* SynIC was setup */
+
 extern struct vmbus_softc	*vmbus_sc;
 
 static __inline struct vmbus_softc *


More information about the svn-src-all mailing list