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 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 List-Archive: https://lists.freebsd.org/archives/dev-commits-src-branches List-Help: List-Post: List-Subscribe: List-Unsubscribe: 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 AuthorDate: 2021-03-03 06:05:47 +0000 Commit: John Baldwin 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