svn commit: r289760 - head/sys/dev/ioat

Conrad E. Meyer cem at FreeBSD.org
Thu Oct 22 16:46:23 UTC 2015


Author: cem
Date: Thu Oct 22 16:46:21 2015
New Revision: 289760
URL: https://svnweb.freebsd.org/changeset/base/289760

Log:
  ioat: Fix some attach/detach issues
  
  Don't run the selftest until after we've enabled bus mastering, or the
  DMA engine can't copy anything for our test.
  
  Create the ioat_test device on attach, if so tuned.  Destroy the
  ioat_test device on teardown.
  
  Replace deprecated 'CALLOUT_MPSAFE' with correct '1' in callout_init().
  
  Sponsored by:	EMC / Isilon Storage Division

Modified:
  head/sys/dev/ioat/ioat.c
  head/sys/dev/ioat/ioat_internal.h
  head/sys/dev/ioat/ioat_test.c

Modified: head/sys/dev/ioat/ioat.c
==============================================================================
--- head/sys/dev/ioat/ioat.c	Thu Oct 22 16:38:01 2015	(r289759)
+++ head/sys/dev/ioat/ioat.c	Thu Oct 22 16:46:21 2015	(r289760)
@@ -56,6 +56,7 @@ static int ioat_detach(device_t device);
 static int ioat_setup_intr(struct ioat_softc *ioat);
 static int ioat_teardown_intr(struct ioat_softc *ioat);
 static int ioat3_attach(device_t device);
+static int ioat3_selftest(struct ioat_softc *ioat);
 static int ioat_map_pci_bar(struct ioat_softc *ioat);
 static void ioat_dmamap_cb(void *arg, bus_dma_segment_t *segs, int nseg,
     int error);
@@ -239,7 +240,15 @@ ioat_attach(device_t device)
 	if (error != 0)
 		goto err;
 
+	error = ioat3_selftest(ioat);
+	if (error != 0)
+		return (error);
+
+	ioat_process_events(ioat);
+	ioat_setup_sysctl(device);
+
 	ioat_channel[ioat_channel_index++] = ioat;
+	ioat_test_attach();
 
 err:
 	if (error != 0)
@@ -254,6 +263,8 @@ ioat_detach(device_t device)
 	uint32_t i;
 
 	ioat = DEVICE2SOFTC(device);
+
+	ioat_test_detach();
 	callout_drain(&ioat->timer);
 
 	pci_disable_busmaster(device);
@@ -347,7 +358,7 @@ ioat3_attach(device_t device)
 
 	mtx_init(&ioat->submit_lock, "ioat_submit", NULL, MTX_DEF);
 	mtx_init(&ioat->cleanup_lock, "ioat_process_events", NULL, MTX_DEF);
-	callout_init(&ioat->timer, CALLOUT_MPSAFE);
+	callout_init(&ioat->timer, 1);
 
 	ioat->is_resize_pending = FALSE;
 	ioat->is_completion_pending = FALSE;
@@ -415,13 +426,6 @@ ioat3_attach(device_t device)
 	ioat_write_chanctrl(ioat, IOAT_CHANCTRL_RUN);
 	ioat_write_chancmp(ioat, ioat->comp_update_bus_addr);
 	ioat_write_chainaddr(ioat, ring[0]->hw_desc_bus_addr);
-
-	error = ioat3_selftest(ioat);
-	if (error != 0)
-		return (error);
-
-	ioat_process_events(ioat);
-	ioat_setup_sysctl(device);
 	return (0);
 }
 

Modified: head/sys/dev/ioat/ioat_internal.h
==============================================================================
--- head/sys/dev/ioat/ioat_internal.h	Thu Oct 22 16:38:01 2015	(r289759)
+++ head/sys/dev/ioat/ioat_internal.h	Thu Oct 22 16:46:21 2015	(r289760)
@@ -366,6 +366,9 @@ struct ioat_softc {
 	struct mtx		cleanup_lock;
 };
 
+void ioat_test_attach(void);
+void ioat_test_detach(void);
+
 static inline uint64_t
 ioat_get_chansts(struct ioat_softc *ioat)
 {

Modified: head/sys/dev/ioat/ioat_test.c
==============================================================================
--- head/sys/dev/ioat/ioat_test.c	Thu Oct 22 16:38:01 2015	(r289759)
+++ head/sys/dev/ioat/ioat_test.c	Thu Oct 22 16:46:21 2015	(r289760)
@@ -367,6 +367,22 @@ static struct cdevsw ioat_cdevsw = {
 };
 
 static int
+enable_ioat_test(bool enable)
+{
+
+	mtx_assert(&Giant, MA_OWNED);
+
+	if (enable && g_ioat_cdev == NULL) {
+		g_ioat_cdev = make_dev(&ioat_cdevsw, 0, UID_ROOT, GID_WHEEL,
+		    0600, "ioat_test");
+	} else if (!enable && g_ioat_cdev != NULL) {
+		destroy_dev(g_ioat_cdev);
+		g_ioat_cdev = NULL;
+	}
+	return (0);
+}
+
+static int
 sysctl_enable_ioat_test(SYSCTL_HANDLER_ARGS)
 {
 	int error, enabled;
@@ -376,15 +392,32 @@ sysctl_enable_ioat_test(SYSCTL_HANDLER_A
 	if (error != 0 || req->newptr == NULL)
 		return (error);
 
-	if (enabled != 0 && g_ioat_cdev == NULL) {
-		g_ioat_cdev = make_dev(&ioat_cdevsw, 0, UID_ROOT, GID_WHEEL,
-		    0600, "ioat_test");
-	} else if (enabled == 0 && g_ioat_cdev != NULL) {
-		destroy_dev(g_ioat_cdev);
-		g_ioat_cdev = NULL;
-	}
+	enable_ioat_test(enabled);
 	return (0);
 }
 SYSCTL_PROC(_hw_ioat, OID_AUTO, enable_ioat_test, CTLTYPE_INT | CTLFLAG_RW,
     0, 0, sysctl_enable_ioat_test, "I",
     "Non-zero: Enable the /dev/ioat_test device");
+
+void
+ioat_test_attach(void)
+{
+	char *val;
+
+	val = kern_getenv("hw.ioat.enable_ioat_test");
+	if (val != NULL && strcmp(val, "0") != 0) {
+		mtx_lock(&Giant);
+		enable_ioat_test(true);
+		mtx_unlock(&Giant);
+	}
+	freeenv(val);
+}
+
+void
+ioat_test_detach(void)
+{
+
+	mtx_lock(&Giant);
+	enable_ioat_test(false);
+	mtx_unlock(&Giant);
+}


More information about the svn-src-all mailing list