From nobody Thu Jan 26 18:54:25 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 4P2qcy0XPMz3bPNP; Thu, 26 Jan 2023 18:54:26 +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 4P2qcx42HXz45s8; Thu, 26 Jan 2023 18:54:25 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1674759265; 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=8scpyJpd5Wfl+Q4sruapudKe/JyjbKohoVdluddGBNA=; b=nRzYLikHvESGcp0nKRETy4HXxj8rpM2W77wRhVnTnOTr7eRYInV/Yt+ECCAdqbWbSo/35f BrIEhPTClFX8myhvbafl12NZoZu3QcBfbGwqDKdBXVlUM1mHHwCutk1B4FmOHTqSelydqE ga268cIiw6G+RttFhE6wAPHZ8ewa6XfHQ7js0TTT0Mv9WfD6wPsTCcziB2cu/0CR+X27gQ 5A6DAZW0sppDmb/Wb4TxBgFJoOr9JdaU/24ASBjMU7gp8OjRu+gzOMro9CfxJFO6NcYVVr s2bXwYKqH3GKg7tXtM21ZbjfIoNNmH4bL/D69nIO+uxiMZ1gs5zLPMkwQpBRWQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1674759265; 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=8scpyJpd5Wfl+Q4sruapudKe/JyjbKohoVdluddGBNA=; b=DKLpF65itNXd1lRQMWyAAwJwYjD/xD02mlXxB3cQzMf5fmeV4kldr44JBWynnuD/g7q6mh twmxBRAIIbx8Uv6guvLq2wOZGhoHTeFN9FEyHEpSTzBcHm5Nc4BAjspeN8ZJm0WgX+T7VC 2QArUjz7tV3uq7u25XmWlBB0dvplwrskeP8MHL+ihRCu4YGA7rDaAKScVoDnJd92oAf+No BnIpPUstjKtQjTy4x5lLSg3Xsz2VRbzggx+x3trKGudOi8hkFvWmijPlrRaoPdgVYpam8h BDF7hVynvXvRYZ2HNIxcr1Q/ZgJPq5TeBLuXsNEByCdR4prexl6NPc+jq8gY3w== ARC-Authentication-Results: i=1; mx1.freebsd.org; none ARC-Seal: i=1; s=dkim; d=freebsd.org; t=1674759265; a=rsa-sha256; cv=none; b=vYs+9IoJYJKtlTDtFqYEJCWqr3i6mzMmnszDfKXMuXyNR5j0kSSHJGUbiuC9M54XpLB5xP BCzFs6J6VpYnc47DB5i1JpjEctSt9HqO1TTovYaIChbj0VCwuqOeLh5qLqGAMRInM2AJHh pUt2GjuMTp+acfj649MWl84Y34QEnAYXupUO71EVQByz+KMcPW9xovwXyUpKyiP9KKkNH4 UAvPN8dkVGQBYKfx7hEtQj0LyyEy3eSUpL/BgYQ+YOLQjB8fBSY4O3ri1O0m88KRX85KL6 Niy9JSfJgcoPJ0dFyoSwSzXiS2PTBJ7YXcvJNyI8WNa1mJB6vcBmyMNhrrCCQA== 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 4P2qcx37thzgJx; Thu, 26 Jan 2023 18:54:25 +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 30QIsPbs034190; Thu, 26 Jan 2023 18:54:25 GMT (envelope-from git@gitrepo.freebsd.org) Received: (from git@localhost) by gitrepo.freebsd.org (8.16.1/8.16.1/Submit) id 30QIsPeJ034189; Thu, 26 Jan 2023 18:54:25 GMT (envelope-from git) Date: Thu, 26 Jan 2023 18:54:25 GMT Message-Id: <202301261854.30QIsPeJ034189@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: bc740a76c3eb - stable/13 - bhyve/snapshot: switch to nvlist for snapshot requests 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: bc740a76c3eb89d84648484e24b158dfd3e4adf5 Auto-Submitted: auto-generated X-ThisMailContainsUnwantedMimeParts: N The branch stable/13 has been updated by jhb: URL: https://cgit.FreeBSD.org/src/commit/?id=bc740a76c3eb89d84648484e24b158dfd3e4adf5 commit bc740a76c3eb89d84648484e24b158dfd3e4adf5 Author: Robert Wing AuthorDate: 2022-02-09 17:11:57 +0000 Commit: John Baldwin CommitDate: 2023-01-26 18:47:26 +0000 bhyve/snapshot: switch to nvlist for snapshot requests Switch to using an nvlist with nvlist_send()/nvlist_recv() to communicate from bhyvectl(8) to bhyve(8). The idea is that a bhyve process receives a command with with a set of arguments. The nvlist here is structured to reflect that premise. For example, to snapshot the vm, the expected nvlist looks like: { cmd=START_CHECKPOINT, filename="filename" } Reviewed by: markj Differential Revision: https://reviews.freebsd.org/D33977 (cherry picked from commit edfb339d3868bbd36393efb2738287e170767784) --- usr.sbin/bhyve/snapshot.c | 42 +++++++++++++++++++++--------------------- usr.sbin/bhyve/snapshot.h | 19 ------------------- usr.sbin/bhyvectl/Makefile | 1 + usr.sbin/bhyvectl/bhyvectl.c | 39 +++++++++++++++++++-------------------- 4 files changed, 41 insertions(+), 60 deletions(-) diff --git a/usr.sbin/bhyve/snapshot.c b/usr.sbin/bhyve/snapshot.c index 85c56d519390..62ef0acd8f95 100644 --- a/usr.sbin/bhyve/snapshot.c +++ b/usr.sbin/bhyve/snapshot.c @@ -1325,7 +1325,7 @@ vm_vcpu_resume(struct vmctx *ctx) } static int -vm_checkpoint(struct vmctx *ctx, char *checkpoint_file, bool stop_vm) +vm_checkpoint(struct vmctx *ctx, const char *checkpoint_file, bool stop_vm) { int fd_checkpoint = 0, kdata_fd = 0; int ret = 0; @@ -1440,17 +1440,23 @@ done: return (error); } -int -handle_message(struct ipc_message *imsg, struct vmctx *ctx) +static int +handle_message(struct vmctx *ctx, nvlist_t *nvl) { - int err; + int err, cmd; - switch (imsg->code) { - case START_CHECKPOINT: - err = vm_checkpoint(ctx, imsg->data.op.snapshot_filename, false); - break; + if (!nvlist_exists_number(nvl, "cmd")) + return (-1); + + cmd = nvlist_get_number(nvl, "cmd"); + switch (cmd) { case START_SUSPEND: - err = vm_checkpoint(ctx, imsg->data.op.snapshot_filename, true); + case START_CHECKPOINT: + if (!nvlist_exists_string(nvl, "filename")) + err = -1; + else + err = vm_checkpoint(ctx, nvlist_get_string(nvl, "filename"), + cmd == START_SUSPEND ? true : false); break; default: EPRINTLN("Unrecognized checkpoint operation\n"); @@ -1460,6 +1466,7 @@ handle_message(struct ipc_message *imsg, struct vmctx *ctx) if (err != 0) EPRINTLN("Unable to perform the requested operation\n"); + nvlist_destroy(nvl); return (err); } @@ -1469,25 +1476,18 @@ handle_message(struct ipc_message *imsg, struct vmctx *ctx) void * checkpoint_thread(void *param) { - struct ipc_message imsg; struct checkpoint_thread_info *thread_info; - ssize_t n; + nvlist_t *nvl; pthread_set_name_np(pthread_self(), "checkpoint thread"); thread_info = (struct checkpoint_thread_info *)param; for (;;) { - 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(imsg.code)) - handle_message(&imsg, thread_info->ctx); + nvl = nvlist_recv(thread_info->socket_fd, 0); + if (nvl != NULL) + handle_message(thread_info->ctx, nvl); else - EPRINTLN("Failed to receive message: %s\n", - n == -1 ? strerror(errno) : "unknown error"); + EPRINTLN("nvlist_recv() failed: %s", strerror(errno)); } return (NULL); diff --git a/usr.sbin/bhyve/snapshot.h b/usr.sbin/bhyve/snapshot.h index 3ffd42fbeabc..ddf23b8c0619 100644 --- a/usr.sbin/bhyve/snapshot.h +++ b/usr.sbin/bhyve/snapshot.h @@ -60,31 +60,12 @@ 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, }; -/* - * 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 { struct vmctx *ctx; int socket_fd; diff --git a/usr.sbin/bhyvectl/Makefile b/usr.sbin/bhyvectl/Makefile index 12fdb706cadb..c004d603c8db 100644 --- a/usr.sbin/bhyvectl/Makefile +++ b/usr.sbin/bhyvectl/Makefile @@ -17,6 +17,7 @@ WARNS?= 3 CFLAGS+= -I${SRCTOP}/sys/amd64/vmm .if ${MK_BHYVE_SNAPSHOT} != "no" +LIBADD+= nv CFLAGS+= -DBHYVE_SNAPSHOT # usr.sbin/bhyve/snapshot.h needs ucl header diff --git a/usr.sbin/bhyvectl/bhyvectl.c b/usr.sbin/bhyvectl/bhyvectl.c index 017427db4d4f..560a3a3eb443 100644 --- a/usr.sbin/bhyvectl/bhyvectl.c +++ b/usr.sbin/bhyvectl/bhyvectl.c @@ -33,10 +33,13 @@ __FBSDID("$FreeBSD$"); #include #include -#include +#include #include #include -#include +#include +#include +#include +#include #include #include @@ -57,9 +60,6 @@ __FBSDID("$FreeBSD$"); #include #include -#include -#include - #include "amd/vmcb.h" #include "intel/vmcs.h" @@ -1684,10 +1684,9 @@ show_memseg(struct vmctx *ctx) #ifdef BHYVE_SNAPSHOT static int -send_message(struct vmctx *ctx, void *data, size_t len) +send_message(struct vmctx *ctx, nvlist_t *nvl) { struct sockaddr_un addr; - ssize_t len_sent; int err, socket_fd; char vmname_buf[MAX_VMNAME]; @@ -1709,14 +1708,16 @@ send_message(struct vmctx *ctx, void *data, size_t len) snprintf(addr.sun_path, sizeof(addr.sun_path), "%s%s", BHYVE_RUN_DIR, vmname_buf); - len_sent = sendto(socket_fd, data, len, 0, - (struct sockaddr *)&addr, sizeof(struct sockaddr_un)); - - if (len_sent < 0) { - perror("Failed to send message to bhyve vm"); - err = -1; + if (connect(socket_fd, (struct sockaddr *)&addr, SUN_LEN(&addr)) != 0) { + perror("connect() failed"); + err = errno; + goto done; } + if (nvlist_send(socket_fd, nvl) < 0) + perror("nvlist_send() failed"); + nvlist_destroy(nvl); + done: if (socket_fd > 0) close(socket_fd); @@ -1726,15 +1727,13 @@ done: static int snapshot_request(struct vmctx *ctx, const char *file, enum ipc_opcode code) { - struct ipc_message imsg; - size_t length; - - imsg.code = code; - strlcpy(imsg.data.op.snapshot_filename, file, MAX_SNAPSHOT_FILENAME); + nvlist_t *nvl; - length = offsetof(struct ipc_message, data) + sizeof(imsg.data.op); + nvl = nvlist_create(0); + nvlist_add_number(nvl, "cmd", code); + nvlist_add_string(nvl, "filename", file); - return (send_message(ctx, (void *)&imsg, length)); + return (send_message(ctx, nvl)); } #endif