Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 30 May 2016 08:50:34 +0000 (UTC)
From:      Sepherosa Ziehau <sephe@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r300989 - head/sys/dev/hyperv/vmbus
Message-ID:  <201605300850.u4U8oYOp089709@repo.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: sephe
Date: Mon May 30 08:50:33 2016
New Revision: 300989
URL: https://svnweb.freebsd.org/changeset/base/300989

Log:
  hyperv/et: Make sure only one event timer will be registered
  
  This nullifies the need to use softc.
  
  MFC after:	1 week
  Sponsored by:	Microsoft OSTC
  Differential Revision:	https://reviews.freebsd.org/D6591

Modified:
  head/sys/dev/hyperv/vmbus/hv_et.c

Modified: head/sys/dev/hyperv/vmbus/hv_et.c
==============================================================================
--- head/sys/dev/hyperv/vmbus/hv_et.c	Mon May 30 08:42:35 2016	(r300988)
+++ head/sys/dev/hyperv/vmbus/hv_et.c	Mon May 30 08:50:33 2016	(r300989)
@@ -59,7 +59,7 @@ __FBSDID("$FreeBSD$");
 					 CPUID_HV_MSR_SYNIC |		\
 					 CPUID_HV_MSR_SYNTIMER)
 
-static struct eventtimer *et;
+static struct eventtimer	vmbus_et;
 
 static __inline uint64_t
 sbintime2tick(sbintime_t time)
@@ -88,12 +88,12 @@ vmbus_et_intr(struct trapframe *frame)
 	struct trapframe *oldframe;
 	struct thread *td;
 
-	if (et->et_active) {
+	if (vmbus_et.et_active) {
 		td = curthread;
 		td->td_intr_nesting_level++;
 		oldframe = td->td_intr_frame;
 		td->td_intr_frame = frame;
-		et->et_event_cb(et, et->et_arg);
+		vmbus_et.et_event_cb(&vmbus_et, vmbus_et.et_arg);
 		td->td_intr_frame = oldframe;
 		td->td_intr_nesting_level--;
 	}
@@ -102,7 +102,8 @@ vmbus_et_intr(struct trapframe *frame)
 static void
 hv_et_identify(driver_t *driver, device_t parent)
 {
-	if (device_find_child(parent, "hv_et", -1) != NULL ||
+	if (device_get_unit(parent) != 0 ||
+	    device_find_child(parent, "hv_et", -1) != NULL ||
 	    (hyperv_features & CPUID_HV_ET_MASK) != CPUID_HV_ET_MASK)
 		return;
 
@@ -145,17 +146,17 @@ vmbus_et_config(void *arg __unused)
 static int
 hv_et_attach(device_t dev)
 {
-	/* XXX: need allocate SINT and remove global et */
-	et = device_get_softc(dev);
+	/* TODO: use independent IDT vector */
 
-	et->et_name = "Hyper-V";
-	et->et_flags = ET_FLAGS_ONESHOT | ET_FLAGS_PERCPU;
-	et->et_quality = 1000;
-	et->et_frequency = HV_TIMER_FREQUENCY;
-	et->et_min_period = HV_MIN_DELTA_TICKS * ((1LL << 32) / HV_TIMER_FREQUENCY);
-	et->et_max_period = HV_MAX_DELTA_TICKS * ((1LL << 32) / HV_TIMER_FREQUENCY);
-	et->et_start = hv_et_start;
-	et->et_priv = dev;
+	vmbus_et.et_name = "Hyper-V";
+	vmbus_et.et_flags = ET_FLAGS_ONESHOT | ET_FLAGS_PERCPU;
+	vmbus_et.et_quality = 1000;
+	vmbus_et.et_frequency = HV_TIMER_FREQUENCY;
+	vmbus_et.et_min_period =
+	    HV_MIN_DELTA_TICKS * ((1LL << 32) / HV_TIMER_FREQUENCY);
+	vmbus_et.et_max_period =
+	    HV_MAX_DELTA_TICKS * ((1LL << 32) / HV_TIMER_FREQUENCY);
+	vmbus_et.et_start = hv_et_start;
 
 	/*
 	 * Delay a bit to make sure that MSR_HV_TIME_REF_COUNT will
@@ -165,13 +166,13 @@ hv_et_attach(device_t dev)
 	DELAY(100);
 	smp_rendezvous(NULL, vmbus_et_config, NULL, NULL);
 
-	return (et_register(et));
+	return (et_register(&vmbus_et));
 }
 
 static int
 hv_et_detach(device_t dev)
 {
-	return (et_deregister(et));
+	return (et_deregister(&vmbus_et));
 }
 
 static device_method_t hv_et_methods[] = {
@@ -186,7 +187,7 @@ static device_method_t hv_et_methods[] =
 static driver_t hv_et_driver = {
 	"hv_et",
 	hv_et_methods,
-	sizeof(struct eventtimer)
+	0
 };
 
 static devclass_t hv_et_devclass;



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201605300850.u4U8oYOp089709>