From owner-svn-src-user@freebsd.org Tue Mar 6 21:16:46 2018 Return-Path: Delivered-To: svn-src-user@mailman.ysv.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2610:1c1:1:606c::19:1]) by mailman.ysv.freebsd.org (Postfix) with ESMTP id D707DF3029E for ; Tue, 6 Mar 2018 21:16:45 +0000 (UTC) (envelope-from markj@FreeBSD.org) Received: from mxrelay.nyi.freebsd.org (mxrelay.nyi.freebsd.org [IPv6:2610:1c1:1:606c::19:3]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (Client CN "mxrelay.nyi.freebsd.org", Issuer "Let's Encrypt Authority X3" (verified OK)) by mx1.freebsd.org (Postfix) with ESMTPS id 852846C192; Tue, 6 Mar 2018 21:16:45 +0000 (UTC) (envelope-from markj@FreeBSD.org) Received: from repo.freebsd.org (repo.freebsd.org [IPv6:2610:1c1:1:6068::e6a:0]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (Client did not present a certificate) by mxrelay.nyi.freebsd.org (Postfix) with ESMTPS id 7FA0D182FF; Tue, 6 Mar 2018 21:16:45 +0000 (UTC) (envelope-from markj@FreeBSD.org) Received: from repo.freebsd.org ([127.0.1.37]) by repo.freebsd.org (8.15.2/8.15.2) with ESMTP id w26LGjh2028592; Tue, 6 Mar 2018 21:16:45 GMT (envelope-from markj@FreeBSD.org) Received: (from markj@localhost) by repo.freebsd.org (8.15.2/8.15.2/Submit) id w26LGil9028586; Tue, 6 Mar 2018 21:16:44 GMT (envelope-from markj@FreeBSD.org) Message-Id: <201803062116.w26LGil9028586@repo.freebsd.org> X-Authentication-Warning: repo.freebsd.org: markj set sender to markj@FreeBSD.org using -f From: Mark Johnston Date: Tue, 6 Mar 2018 21:16:44 +0000 (UTC) To: src-committers@freebsd.org, svn-src-user@freebsd.org Subject: svn commit: r330552 - in user/markj/netdump/sys: dev/null geom kern netinet/netdump sys X-SVN-Group: user X-SVN-Commit-Author: markj X-SVN-Commit-Paths: in user/markj/netdump/sys: dev/null geom kern netinet/netdump sys X-SVN-Commit-Revision: 330552 X-SVN-Commit-Repository: base MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-BeenThere: svn-src-user@freebsd.org X-Mailman-Version: 2.1.25 Precedence: list List-Id: "SVN commit messages for the experimental " user" src tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Tue, 06 Mar 2018 21:16:46 -0000 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);