svn commit: r330552 - in user/markj/netdump/sys: dev/null geom kern netinet/netdump sys

Mark Johnston markj at FreeBSD.org
Tue Mar 6 21:16:46 UTC 2018


Author: markj
Date: Tue Mar  6 21:16:44 2018
New Revision: 330552
URL: https://svnweb.freebsd.org/changeset/base/330552

Log:
  Clean up when the dump device is deconfigured by request.

Modified:
  user/markj/netdump/sys/dev/null/null.c
  user/markj/netdump/sys/geom/geom_dev.c
  user/markj/netdump/sys/kern/kern_mbuf.c
  user/markj/netdump/sys/kern/kern_shutdown.c
  user/markj/netdump/sys/netinet/netdump/netdump_client.c
  user/markj/netdump/sys/sys/conf.h

Modified: user/markj/netdump/sys/dev/null/null.c
==============================================================================
--- user/markj/netdump/sys/dev/null/null.c	Tue Mar  6 21:16:12 2018	(r330551)
+++ user/markj/netdump/sys/dev/null/null.c	Tue Mar  6 21:16:44 2018	(r330552)
@@ -109,14 +109,14 @@ null_ioctl(struct cdev *dev __unused, u_long cmd, cadd
     int flags __unused, struct thread *td)
 {
 	int error;
-	error = 0;
 
+	error = 0;
 	switch (cmd) {
 #ifdef COMPAT_FREEBSD11
 	case DIOCSKERNELDUMP_FREEBSD11:
 #endif
 	case DIOCSKERNELDUMP:
-		error = set_dumper(NULL, NULL, td, 0, 0, NULL, 0, NULL);
+		error = clear_dumper(td);
 		break;
 	case FIONBIO:
 		break;

Modified: user/markj/netdump/sys/geom/geom_dev.c
==============================================================================
--- user/markj/netdump/sys/geom/geom_dev.c	Tue Mar  6 21:16:12 2018	(r330551)
+++ user/markj/netdump/sys/geom/geom_dev.c	Tue Mar  6 21:16:44 2018	(r330552)
@@ -140,7 +140,7 @@ g_dev_setdumpdev(struct cdev *dev, struct diocskerneld
 	int error, len;
 
 	if (dev == NULL || kda == NULL)
-		return (set_dumper(NULL, NULL, td, 0, 0, NULL, 0, NULL));
+		return (clear_dumper(td));
 
 	cp = dev->si_drv2;
 	len = sizeof(kd);
@@ -836,7 +836,7 @@ g_dev_orphan(struct g_consumer *cp)
 
 	/* Reset any dump-area set on this device */
 	if (dev->si_flags & SI_DUMPDEV)
-		(void)set_dumper(NULL, NULL, curthread, 0, 0, NULL, 0, NULL);
+		(void)clear_dumper(curthread);
 
 	/* Destroy the struct cdev *so we get no more requests */
 	destroy_dev_sched_cb(dev, g_dev_callback, cp);

Modified: user/markj/netdump/sys/kern/kern_mbuf.c
==============================================================================
--- user/markj/netdump/sys/kern/kern_mbuf.c	Tue Mar  6 21:16:12 2018	(r330551)
+++ user/markj/netdump/sys/kern/kern_mbuf.c	Tue Mar  6 21:16:44 2018	(r330552)
@@ -521,7 +521,7 @@ netdump_mbuf_init(int nmbuf, int nclust)
 }
 
 /*
- * Free preallocated mbufs and clusters.
+ * Free preallocated mbufs and clusters and destroy netdump cache zones.
  */
 void
 netdump_mbuf_drain(void)
@@ -534,9 +534,18 @@ netdump_mbuf_drain(void)
 	while ((item = mbufq_dequeue(&nd_clustq)) != NULL)
 		uma_zfree(zone_clust, item);
 
-	uma_zdestroy(nd_zone_mbuf);
-	uma_zdestroy(nd_zone_clust);
-	uma_zdestroy(nd_zone_pack);
+	if (nd_zone_mbuf != NULL) {
+		uma_zdestroy(nd_zone_mbuf);
+		nd_zone_mbuf = NULL;
+	}
+	if (nd_zone_clust != NULL) {
+		uma_zdestroy(nd_zone_clust);
+		nd_zone_clust = NULL;
+	}
+	if (nd_zone_pack != NULL) {
+		uma_zdestroy(nd_zone_pack);
+		nd_zone_pack = NULL;
+	}
 }
 
 /*

Modified: user/markj/netdump/sys/kern/kern_shutdown.c
==============================================================================
--- user/markj/netdump/sys/kern/kern_shutdown.c	Tue Mar  6 21:16:12 2018	(r330551)
+++ user/markj/netdump/sys/kern/kern_shutdown.c	Tue Mar  6 21:16:44 2018	(r330552)
@@ -190,6 +190,11 @@ SYSCTL_INT(_kern, OID_AUTO, kerneldump_gzlevel, CTLFLA
     &kerneldump_gzlevel, 0,
     "Kernel crash dump compression level");
 
+#ifdef NETDUMP
+/* Defined in kern_mbuf.c. */
+void	netdump_mbuf_drain(void);
+#endif
+
 /*
  * Variable panicstr contains argument to first call to panic; used as flag
  * to indicate that the kernel has already called panic.
@@ -1040,10 +1045,6 @@ set_dumper(struct dumperinfo *di, const char *devname,
 	if (error != 0)
 		return (error);
 
-	if (di == NULL) {
-		error = 0;
-		goto cleanup;
-	}
 	if (dumper.dumper != NULL)
 		return (EBUSY);
 	dumper = *di;
@@ -1089,7 +1090,25 @@ set_dumper(struct dumperinfo *di, const char *devname,
 
 	dumper.blockbuf = malloc(di->blocksize, M_DUMPER, M_WAITOK | M_ZERO);
 	return (0);
+
 cleanup:
+	(void)clear_dumper(td);
+	return (error);
+}
+
+int
+clear_dumper(struct thread *td)
+{
+	int error;
+
+	error = priv_check(td, PRIV_SETDUMPER);
+	if (error != 0)
+		return (error);
+
+#ifdef NETDUMP
+	netdump_mbuf_drain();
+#endif
+
 #ifdef EKCD
 	if (dumper.kdcrypto != NULL) {
 		explicit_bzero(dumper.kdcrypto, sizeof(*dumper.kdcrypto) +
@@ -1106,7 +1125,7 @@ cleanup:
 	}
 	explicit_bzero(&dumper, sizeof(dumper));
 	dumpdevname[0] = '\0';
-	return (error);
+	return (0);
 }
 
 static int

Modified: user/markj/netdump/sys/netinet/netdump/netdump_client.c
==============================================================================
--- user/markj/netdump/sys/netinet/netdump/netdump_client.c	Tue Mar  6 21:16:12 2018	(r330551)
+++ user/markj/netdump/sys/netinet/netdump/netdump_client.c	Tue Mar  6 21:16:44 2018	(r330552)
@@ -1135,15 +1135,12 @@ netdump_ioctl(struct cdev *dev __unused, u_long cmd, c
 		memcpy(&conf->ndc_gateway, &nd_gateway, sizeof(nd_gateway));
 		break;
 	case NETDUMPSCONF:
-		error = priv_check(td, PRIV_SETDUMPER);
-		if (error != 0)
-			break;
-
 		conf = (struct netdump_conf *)addr;
 		if (conf->ndc_kda.kda_enable == 0) {
 			if (nd_enabled) {
-				nd_enabled = 0;
-				netdump_mbuf_drain();
+				error = clear_dumper(td);
+				if (error == 0)
+					nd_enabled = 0;
 			}
 			break;
 		}
@@ -1165,10 +1162,8 @@ netdump_ioctl(struct cdev *dev __unused, u_long cmd, c
 		    conf->ndc_kda.kda_compression, conf->ndc_kda.kda_encryption,
 		    conf->ndc_kda.kda_key, conf->ndc_kda.kda_encryptedkeysize,
 		    conf->ndc_kda.kda_encryptedkey);
-		if (error != 0) {
+		if (error != 0)
 			nd_enabled = 0;
-			netdump_mbuf_drain();
-		}
 		break;
 	default:
 		error = EINVAL;
@@ -1229,9 +1224,9 @@ netdump_modevent(module_t mod __unused, int what, void
 	case MOD_UNLOAD:
 		destroy_dev(netdump_cdev);
 		if (nd_enabled) {
-			(void)set_dumper(NULL, NULL, curthread, 0, 0, NULL, 0,
-			    NULL);
-			netdump_mbuf_drain();
+			printf("netdump: disabling dump device for unload\n");
+			(void)clear_dumper(curthread);
+			nd_enabled = 0;
 		}
 		break;
 	default:

Modified: user/markj/netdump/sys/sys/conf.h
==============================================================================
--- user/markj/netdump/sys/sys/conf.h	Tue Mar  6 21:16:12 2018	(r330551)
+++ user/markj/netdump/sys/sys/conf.h	Tue Mar  6 21:16:44 2018	(r330552)
@@ -356,6 +356,7 @@ int doadump(boolean_t);
 int set_dumper(struct dumperinfo *di, const char *devname, struct thread *td,
     uint8_t compression, uint8_t encryption, const uint8_t *key,
     uint32_t encryptedkeysize, const uint8_t *encryptedkey);
+int clear_dumper(struct thread *td);
 
 int dump_start(struct dumperinfo *di, struct kerneldumpheader *kdh);
 int dump_append(struct dumperinfo *, void *, vm_offset_t, size_t);


More information about the svn-src-user mailing list