From nobody Mon Jun 27 19:35:33 2022
X-Original-To: dev-commits-src-branches@mlmmj.nyi.freebsd.org
Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2610:1c1:1:606c::19:1])
	by mlmmj.nyi.freebsd.org (Postfix) with ESMTP id 7D4C686DFBC;
	Mon, 27 Jun 2022 19:35:34 +0000 (UTC)
	(envelope-from git@FreeBSD.org)
Received: from mxrelay.nyi.freebsd.org (mxrelay.nyi.freebsd.org [IPv6:2610:1c1:1:606c::19:3])
	(using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)
	 key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256
	 client-signature RSA-PSS (4096 bits) client-digest SHA256)
	(Client CN "mxrelay.nyi.freebsd.org", Issuer "R3" (verified OK))
	by mx1.freebsd.org (Postfix) with ESMTPS id 4LWyck0cYBz3lXS;
	Mon, 27 Jun 2022 19:35:33 +0000 (UTC)
	(envelope-from git@FreeBSD.org)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim;
	t=1656358534;
	h=from:from:reply-to:subject:subject:date:date:message-id:message-id:
	 to:to:cc:mime-version:mime-version:content-type:content-type:
	 content-transfer-encoding:content-transfer-encoding;
	bh=3p6S/Hxoe9ThVLx+e8kv8LeQ+j4g4t9WQSd9FJkNY7M=;
	b=rM3eYnusdrz8inllbN+IcpxX4PSQrAyPoTEbsf/nWEJo0U0zwTy6LaX93JzcPsKDFF1io/
	tcCttuLJjH0ho4XTZzjwMERbLcKTosiiAdWG3s7gGLu2z8SryDEEjrXQoneTwUXX6FtFlp
	xwIsVpMpLdjNKY+nOlyAEvOXE9RAJlo1IaZV2VeAU0KYGCB5Gk1BWdjIEjD7x5MO59HsLp
	GX6Fh+4NSrtDzGWmr8SU8lovz1rkK5z4QP2rXDwNqejGIzpub8sNHB37mMs8nQNDOztlQR
	MXuHn5g4b6O6XuSevhksN1ceYI9TXFh6WXmjgCOZDtM+LwE8dSEJ0idYZmQ5mA==
Received: from gitrepo.freebsd.org (gitrepo.freebsd.org [IPv6:2610:1c1:1:6068::e6a:5])
	(using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)
	 key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256)
	(Client did not present a certificate)
	by mxrelay.nyi.freebsd.org (Postfix) with ESMTPS id 9389368AC;
	Mon, 27 Jun 2022 19:35:33 +0000 (UTC)
	(envelope-from git@FreeBSD.org)
Received: from gitrepo.freebsd.org ([127.0.1.44])
	by gitrepo.freebsd.org (8.16.1/8.16.1) with ESMTP id 25RJZXPL019762;
	Mon, 27 Jun 2022 19:35:33 GMT
	(envelope-from git@gitrepo.freebsd.org)
Received: (from git@localhost)
	by gitrepo.freebsd.org (8.16.1/8.16.1/Submit) id 25RJZX3x019761;
	Mon, 27 Jun 2022 19:35:33 GMT
	(envelope-from git)
Date: Mon, 27 Jun 2022 19:35:33 GMT
Message-Id: <202206271935.25RJZX3x019761@gitrepo.freebsd.org>
To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org,
        dev-commits-src-branches@FreeBSD.org
From: Mitchell Horne <mhorne@FreeBSD.org>
Subject: git: 6d26e87f4833 - stable/13 - Split out dumper allocation from list insertion
List-Id: Commits to the stable branches of the FreeBSD src repository <dev-commits-src-branches.freebsd.org>
List-Archive: https://lists.freebsd.org/archives/dev-commits-src-branches
List-Help: <mailto:dev-commits-src-branches+help@freebsd.org>
List-Post: <mailto:dev-commits-src-branches@freebsd.org>
List-Subscribe: <mailto:dev-commits-src-branches+subscribe@freebsd.org>
List-Unsubscribe: <mailto:dev-commits-src-branches+unsubscribe@freebsd.org>
Sender: owner-dev-commits-src-branches@freebsd.org
X-BeenThere: dev-commits-src-branches@freebsd.org
MIME-Version: 1.0
Content-Type: text/plain; charset=utf-8
Content-Transfer-Encoding: 8bit
X-Git-Committer: mhorne
X-Git-Repository: src
X-Git-Refname: refs/heads/stable/13
X-Git-Reftype: branch
X-Git-Commit: 6d26e87f48334ae4b30426a8a8bb0ba354d9689e
Auto-Submitted: auto-generated
ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org;
	s=dkim; t=1656358534;
	h=from:from:reply-to:subject:subject:date:date:message-id:message-id:
	 to:to:cc:mime-version:mime-version:content-type:content-type:
	 content-transfer-encoding:content-transfer-encoding;
	bh=3p6S/Hxoe9ThVLx+e8kv8LeQ+j4g4t9WQSd9FJkNY7M=;
	b=XeR5nH1/6VxN+v8YIXsrtLWjr7/c/8XJiUcqRnpbeSw04W6W8I+ImeipreNoIqOa330WbJ
	X0ssbalR9JcSVfUHWFMdahipy8Vq4h5EMMb/E/wjkWEEAz9mS/+BavlqdM6AWfQwit9niz
	wMD2R39wYCiniEoauwvDu64koPv5BYaR6079lk7X50sH1D7XhjvRbGpgYzaiGuOlelQLcd
	gZf4Q3LqpS5d3yPQVbOD/LnYPaFTU32N5VoTVH3BZ9LBSc97bQv6lb1Qe2YDsVl4BJe/ya
	EQZi45eft3MzsvuBXDxhTamdarN5R0v64X7UKxe1Y2/qFBn0TbSvl4GNOjXYbQ==
ARC-Seal: i=1; s=dkim; d=freebsd.org; t=1656358534; a=rsa-sha256; cv=none;
	b=jVUA907ta8u60pkAgEHFa1IJIvtnPb93Wy+mFGd9vCQhx5Jz9D9MehSYRChRGdF0ypf9FW
	7wOgENqjH3lYQhRQAQ677uc1jlEFEj7uyfFydahHkes5jb7EyBmG+FWWSX20vwZ/iqTJQz
	MdjC4V2+u3woK21W1EIOF3L1nK6m7RIp3/fTEq0PTpLYWkk+XmzhcUpOHQfLp5vpFX52Mn
	BSFvNf1Y32uaCJ9+gakPMrhgkRSdXQqLmPaen/oPLDcZa80RP0mwCe3wpKboG3cu1Xq101
	RhF463uXqjxWvlgP1QBGC8xIR6WkvyZqzABXt8jmFidk+TGycnvgcMxl/CO2kQ==
ARC-Authentication-Results: i=1;
	mx1.freebsd.org;
	none
X-ThisMailContainsUnwantedMimeParts: N

The branch stable/13 has been updated by mhorne:

URL: https://cgit.FreeBSD.org/src/commit/?id=6d26e87f48334ae4b30426a8a8bb0ba354d9689e

commit 6d26e87f48334ae4b30426a8a8bb0ba354d9689e
Author:     Mitchell Horne <mhorne@FreeBSD.org>
AuthorDate: 2021-08-09 17:21:07 +0000
Commit:     Mitchell Horne <mhorne@FreeBSD.org>
CommitDate: 2022-06-27 19:32:06 +0000

    Split out dumper allocation from list insertion
    
    Add a new function, dumper_create(), to allocate a dumper.
    dumper_insert() will call this function and retains the existing
    behaviour.
    
    This is desirable for performing live dumps of the system. Here, there
    is a need to allocate and configure a dumper structure that is invoked
    outside of the typical debugger context. Therefore, it should be
    excluded from the list of panic-time dumpers.
    
    free_single_dumper() is made public and renamed to dumper_destroy().
    
    Reviewed by:    kib, markj
    MFC after:      1 week
    Sponsored by:   Juniper Networks, Inc.
    Sponsored by:   Klara, Inc.
    Differential Revision:  https://reviews.freebsd.org/D34068
    
    (cherry picked from commit 59c27ea18c32f5db2c2f9e8213b3ed4219e70704)
---
 sys/kern/kern_shutdown.c | 79 +++++++++++++++++++++++++++++++-----------------
 sys/sys/conf.h           |  3 ++
 2 files changed, 54 insertions(+), 28 deletions(-)

diff --git a/sys/kern/kern_shutdown.c b/sys/kern/kern_shutdown.c
index 0c87ecb9bb67..37544e364ee2 100644
--- a/sys/kern/kern_shutdown.c
+++ b/sys/kern/kern_shutdown.c
@@ -1167,45 +1167,39 @@ kerneldumpcomp_destroy(struct dumperinfo *di)
 }
 
 /*
- * Must not be present on global list.
+ * Free a dumper. Must not be present on global list.
  */
-static void
-free_single_dumper(struct dumperinfo *di)
+void
+dumper_destroy(struct dumperinfo *di)
 {
 
 	if (di == NULL)
 		return;
 
 	zfree(di->blockbuf, M_DUMPER);
-
 	kerneldumpcomp_destroy(di);
-
 #ifdef EKCD
 	zfree(di->kdcrypto, M_EKCD);
 #endif
 	zfree(di, M_DUMPER);
 }
 
-/* Registration of dumpers */
+/*
+ * Allocate and set up a new dumper from the provided template.
+ */
 int
-dumper_insert(const struct dumperinfo *di_template, const char *devname,
-    const struct diocskerneldump_arg *kda)
+dumper_create(const struct dumperinfo *di_template, const char *devname,
+    const struct diocskerneldump_arg *kda, struct dumperinfo **dip)
 {
-	struct dumperinfo *newdi, *listdi;
-	bool inserted;
-	uint8_t index;
-	int error;
+	struct dumperinfo *newdi;
+	int error = 0;
 
-	index = kda->kda_index;
-	MPASS(index != KDA_REMOVE && index != KDA_REMOVE_DEV &&
-	    index != KDA_REMOVE_ALL);
-
-	error = priv_check(curthread, PRIV_SETDUMPER);
-	if (error != 0)
-		return (error);
+	if (dip == NULL)
+		return (EINVAL);
 
-	newdi = malloc(sizeof(*newdi) + strlen(devname) + 1, M_DUMPER, M_WAITOK
-	    | M_ZERO);
+	/* Allocate a new dumper */
+	newdi = malloc(sizeof(*newdi) + strlen(devname) + 1, M_DUMPER,
+	    M_WAITOK | M_ZERO);
 	memcpy(newdi, di_template, sizeof(*newdi));
 	newdi->blockbuf = NULL;
 	newdi->kdcrypto = NULL;
@@ -1214,7 +1208,7 @@ dumper_insert(const struct dumperinfo *di_template, const char *devname,
 
 	if (kda->kda_encryption != KERNELDUMP_ENC_NONE) {
 #ifdef EKCD
-		newdi->kdcrypto = kerneldumpcrypto_create(di_template->blocksize,
+		newdi->kdcrypto = kerneldumpcrypto_create(newdi->blocksize,
 		    kda->kda_encryption, kda->kda_key,
 		    kda->kda_encryptedkeysize, kda->kda_encryptedkey);
 		if (newdi->kdcrypto == NULL) {
@@ -1246,9 +1240,39 @@ dumper_insert(const struct dumperinfo *di_template, const char *devname,
 			goto cleanup;
 		}
 	}
-
 	newdi->blockbuf = malloc(newdi->blocksize, M_DUMPER, M_WAITOK | M_ZERO);
 
+	*dip = newdi;
+	return (0);
+cleanup:
+	dumper_destroy(newdi);
+	return (error);
+}
+
+/*
+ * Create a new dumper and register it in the global list.
+ */
+int
+dumper_insert(const struct dumperinfo *di_template, const char *devname,
+    const struct diocskerneldump_arg *kda)
+{
+	struct dumperinfo *newdi, *listdi;
+	bool inserted;
+	uint8_t index;
+	int error;
+
+	index = kda->kda_index;
+	MPASS(index != KDA_REMOVE && index != KDA_REMOVE_DEV &&
+	    index != KDA_REMOVE_ALL);
+
+	error = priv_check(curthread, PRIV_SETDUMPER);
+	if (error != 0)
+		return (error);
+
+	error = dumper_create(di_template, devname, kda, &newdi);
+	if (error != 0)
+		return (error);
+
 	/* Add the new configuration to the queue */
 	mtx_lock(&dumpconf_list_lk);
 	inserted = false;
@@ -1265,10 +1289,6 @@ dumper_insert(const struct dumperinfo *di_template, const char *devname,
 	mtx_unlock(&dumpconf_list_lk);
 
 	return (0);
-
-cleanup:
-	free_single_dumper(newdi);
-	return (error);
 }
 
 #ifdef DDB
@@ -1323,6 +1343,9 @@ dumper_config_match(const struct dumperinfo *di, const char *devname,
 	return (true);
 }
 
+/*
+ * Remove and free the requested dumper(s) from the global list.
+ */
 int
 dumper_remove(const char *devname, const struct diocskerneldump_arg *kda)
 {
@@ -1346,7 +1369,7 @@ dumper_remove(const char *devname, const struct diocskerneldump_arg *kda)
 		if (dumper_config_match(di, devname, kda)) {
 			found = true;
 			TAILQ_REMOVE(&dumper_configs, di, di_next);
-			free_single_dumper(di);
+			dumper_destroy(di);
 		}
 	}
 	mtx_unlock(&dumpconf_list_lk);
diff --git a/sys/sys/conf.h b/sys/sys/conf.h
index b6be85697405..7e9631154802 100644
--- a/sys/sys/conf.h
+++ b/sys/sys/conf.h
@@ -364,6 +364,9 @@ extern int dumping;		/* system is dumping */
 
 int doadump(boolean_t);
 struct diocskerneldump_arg;
+int dumper_create(const struct dumperinfo *di_template, const char *devname,
+    const struct diocskerneldump_arg *kda, struct dumperinfo **dip);
+void dumper_destroy(struct dumperinfo *di);
 int dumper_insert(const struct dumperinfo *di_template, const char *devname,
     const struct diocskerneldump_arg *kda);
 int dumper_remove(const char *devname, const struct diocskerneldump_arg *kda);