From nobody Thu Jan 26 18:54:22 2023
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 4P2qct2sC0z3bPNH;
	Thu, 26 Jan 2023 18:54:22 +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 4P2qct2FhVz4620;
	Thu, 26 Jan 2023 18:54:22 +0000 (UTC)
	(envelope-from git@FreeBSD.org)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim;
	t=1674759262;
	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=LmxJx0YE8ea0XMvhmI/muJTYbqoJJJbzXc52fLKS6jc=;
	b=H7OuKKp313Z79L+h2QF5fTaFc5ALCGwmM9EQdJ+WXGRXxy9/ZcxRG7lEqyChPqWh17cGWG
	Tlmt3kF+hxpq0jf4YLeUu3LGyGmbmEMzX4arF37kDqArExESwSQQkzkgPvWnDMaiRlXhvH
	56zs67L0z10h2UyA+2UPNmzqOCzbeWXs+Y0XlMk/i8CcAcUWcRSimnNRMsLSigEu/68CpK
	9F5y5uJv30t9SthuSLLO3gCzgwcr0WF2dxfRiU+RUq6cJkz4tnezf4oWAT+RzL2gNr0Anw
	361t8i0NKL0sNuPnXlpsHCfnjs4jS/LN3haaFPzKkhwdXCQ3MW1kaWgYoUbJFw==
ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org;
	s=dkim; t=1674759262;
	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=LmxJx0YE8ea0XMvhmI/muJTYbqoJJJbzXc52fLKS6jc=;
	b=OJy45oAakcZCTnMqr0nJdDE0754OrHdiuKeK1V2DP7SXj6QdPLri883P2bd8SQHLomm0UT
	2r7kMqSCWKfRYe4bIiIf8VnakDb38I7V+L4jkS2cjwp61MwtS/t8EoSFmumR3jsrTHvq7J
	3DsgxSo3DTVydOiFMXRV9k1wXwYdt/j/tPE1ne0DDFGrYpszPvFVw7Bh+RHHxvdgDeN9Bg
	GjKaB7tvWILI6RmgX3sBpZcgrEmzSfKBjXQwLqxncRFI5mAbYP8H/IWFOYLMqMcF+HCLO0
	A47MBV/mus3bL4Hddpck4Ml/+Lb7SgSkumoqPAZ7/sG7Z7pAexCI+VECyxR77A==
ARC-Authentication-Results: i=1;
	mx1.freebsd.org;
	none
ARC-Seal: i=1; s=dkim; d=freebsd.org; t=1674759262; a=rsa-sha256; cv=none;
	b=HkUm7OPCcl0NjzTZcRhSBUAbHZE8umFWMB1Jd9LHcIbY6lBSO+Vbndt3JpsmNSr6kyTNAv
	GDdNCan4JfG/y6crlYU37eJMvsZh2TRZwzc6rV9mI34K8LAzTu43GAMi795FC+jthRsCb6
	nqAwY0VUBZqQ4Urgm1c052CziAgO2qascfNIlouAZmtbXs3lOKQQjAcxAbtQYI8R8B1DjJ
	lAdhMGADetv6w293tRh38xhqkkLyGV9dDxyyV/Ec5xWFrf0U7ZXkIV5p3kCht3M4Zzg3i9
	FnD0P9L9FiHp+0cXTuhVRPYrLMnyXFPwsSmOFXemgvCWFJ64Y5b1A5zAMuANTg==
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 4P2qct1CLwzgKv;
	Thu, 26 Jan 2023 18:54:22 +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 30QIsMtV034111;
	Thu, 26 Jan 2023 18:54:22 GMT
	(envelope-from git@gitrepo.freebsd.org)
Received: (from git@localhost)
	by gitrepo.freebsd.org (8.16.1/8.16.1/Submit) id 30QIsMKC034110;
	Thu, 26 Jan 2023 18:54:22 GMT
	(envelope-from git)
Date: Thu, 26 Jan 2023 18:54:22 GMT
Message-Id: <202301261854.30QIsMKC034110@gitrepo.freebsd.org>
To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org,
        dev-commits-src-branches@FreeBSD.org
From: John Baldwin <jhb@FreeBSD.org>
Subject: git: 3c17cf307b01 - stable/13 - bhyve/snapshot: provide a way to send other messages/data to bhyve
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: jhb
X-Git-Repository: src
X-Git-Refname: refs/heads/stable/13
X-Git-Reftype: branch
X-Git-Commit: 3c17cf307b0109fb518aa8a976e540f104b97019
Auto-Submitted: auto-generated
X-ThisMailContainsUnwantedMimeParts: N

The branch stable/13 has been updated by jhb:

URL: https://cgit.FreeBSD.org/src/commit/?id=3c17cf307b0109fb518aa8a976e540f104b97019

commit 3c17cf307b0109fb518aa8a976e540f104b97019
Author:     Robert Wing <rew@FreeBSD.org>
AuthorDate: 2021-03-03 06:05:47 +0000
Commit:     John Baldwin <jhb@FreeBSD.org>
CommitDate: 2023-01-26 18:46:07 +0000

    bhyve/snapshot: provide a way to send other messages/data to bhyve
    
    This is a step towards sending messages (other than suspend/checkpoint)
    from bhyvectl to bhyve.
    
    Introduce a new struct, ipc_message - this struct stores the type of
    message and a union containing message specific structures for the type
    of message being sent.
    
    Reviewed by:    grehan
    Differential Revision: https://reviews.freebsd.org/D30221
    
    (cherry picked from commit d4870e3a7256704905655e997b37a866024c2894)
---
 usr.sbin/bhyve/snapshot.c    | 16 ++++++++--------
 usr.sbin/bhyve/snapshot.h    | 21 ++++++++++++++++++---
 usr.sbin/bhyvectl/bhyvectl.c | 15 +++++++++------
 3 files changed, 35 insertions(+), 17 deletions(-)

diff --git a/usr.sbin/bhyve/snapshot.c b/usr.sbin/bhyve/snapshot.c
index 061ba11096e9..b70e43adfe2d 100644
--- a/usr.sbin/bhyve/snapshot.c
+++ b/usr.sbin/bhyve/snapshot.c
@@ -1441,16 +1441,16 @@ done:
 }
 
 int
-handle_message(struct checkpoint_op *checkpoint_op, struct vmctx *ctx)
+handle_message(struct ipc_message *imsg, struct vmctx *ctx)
 {
 	int err;
 
-	switch (checkpoint_op->op) {
+	switch (imsg->code) {
 		case START_CHECKPOINT:
-			err = vm_checkpoint(ctx, checkpoint_op->snapshot_filename, false);
+			err = vm_checkpoint(ctx, imsg->data.op.snapshot_filename, false);
 			break;
 		case START_SUSPEND:
-			err = vm_checkpoint(ctx, checkpoint_op->snapshot_filename, true);
+			err = vm_checkpoint(ctx, imsg->data.op.snapshot_filename, true);
 			break;
 		default:
 			EPRINTLN("Unrecognized checkpoint operation\n");
@@ -1469,7 +1469,7 @@ handle_message(struct checkpoint_op *checkpoint_op, struct vmctx *ctx)
 void *
 checkpoint_thread(void *param)
 {
-	struct checkpoint_op op;
+	struct ipc_message imsg;
 	struct checkpoint_thread_info *thread_info;
 	ssize_t n;
 
@@ -1477,14 +1477,14 @@ checkpoint_thread(void *param)
 	thread_info = (struct checkpoint_thread_info *)param;
 
 	for (;;) {
-		n = recvfrom(thread_info->socket_fd, &op, sizeof(op), 0, NULL, 0);
+		n = recvfrom(thread_info->socket_fd, &imsg, sizeof(imsg), 0, NULL, 0);
 
 		/*
 		 * slight sanity check: see if there's enough data to at
 		 * least determine the type of message.
 		 */
-		if (n >= sizeof(op.op))
-			handle_message(&op, thread_info->ctx);
+		if (n >= sizeof(imsg.code))
+			handle_message(&imsg, thread_info->ctx);
 		else
 			EPRINTLN("Failed to receive message: %s\n",
 			    n == -1 ? strerror(errno) : "unknown error");
diff --git a/usr.sbin/bhyve/snapshot.h b/usr.sbin/bhyve/snapshot.h
index 8a6ee67ef19d..f28b56cf0a7f 100644
--- a/usr.sbin/bhyve/snapshot.h
+++ b/usr.sbin/bhyve/snapshot.h
@@ -60,14 +60,29 @@ struct restore_state {
 	ucl_object_t *meta_root_obj;
 };
 
+/* Filename that will be used for save/restore */
+struct checkpoint_op {
+	char snapshot_filename[MAX_SNAPSHOT_FILENAME];
+};
+
+/* Messages that a bhyve process understands. */
 enum ipc_opcode {
 	START_CHECKPOINT,
 	START_SUSPEND,
 };
 
-struct checkpoint_op {
-	unsigned int op;
-	char snapshot_filename[MAX_SNAPSHOT_FILENAME];
+/*
+ * The type of message and associated data to
+ * send to a bhyve process.
+ */
+struct ipc_message {
+        enum ipc_opcode code;
+        union {
+                /*
+                 * message specific structures
+                 */
+                struct checkpoint_op op;
+        } data;
 };
 
 struct checkpoint_thread_info {
diff --git a/usr.sbin/bhyvectl/bhyvectl.c b/usr.sbin/bhyvectl/bhyvectl.c
index df02f7caf345..017427db4d4f 100644
--- a/usr.sbin/bhyvectl/bhyvectl.c
+++ b/usr.sbin/bhyvectl/bhyvectl.c
@@ -1684,7 +1684,7 @@ show_memseg(struct vmctx *ctx)
 
 #ifdef BHYVE_SNAPSHOT
 static int
-send_checkpoint_op_req(struct vmctx *ctx, struct checkpoint_op *op)
+send_message(struct vmctx *ctx, void *data, size_t len)
 {
 	struct sockaddr_un addr;
 	ssize_t len_sent;
@@ -1709,7 +1709,7 @@ send_checkpoint_op_req(struct vmctx *ctx, struct checkpoint_op *op)
 
 	snprintf(addr.sun_path, sizeof(addr.sun_path), "%s%s", BHYVE_RUN_DIR, vmname_buf);
 
-	len_sent = sendto(socket_fd, op, sizeof(*op), 0,
+	len_sent = sendto(socket_fd, data, len, 0,
 	    (struct sockaddr *)&addr, sizeof(struct sockaddr_un));
 
 	if (len_sent < 0) {
@@ -1726,12 +1726,15 @@ done:
 static int
 snapshot_request(struct vmctx *ctx, const char *file, enum ipc_opcode code)
 {
-	struct checkpoint_op op;
+	struct ipc_message imsg;
+	size_t length;
 
-	op.op = code;
-	strlcpy(op.snapshot_filename, file, MAX_SNAPSHOT_FILENAME);
+	imsg.code = code;
+	strlcpy(imsg.data.op.snapshot_filename, file, MAX_SNAPSHOT_FILENAME);
 
-	return (send_checkpoint_op_req(ctx, &op));
+	length = offsetof(struct ipc_message, data) + sizeof(imsg.data.op);
+
+	return (send_message(ctx, (void *)&imsg, length));
 }
 #endif