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