git: 10e30f7d8fcb - stable/13 - bhyve/snapshot: ..back to SOCK_STREAM
- Go to: [ bottom of page ] [ top of archives ] [ this month ]
Date: Thu, 26 Jan 2023 18:54:33 UTC
The branch stable/13 has been updated by jhb:
URL: https://cgit.FreeBSD.org/src/commit/?id=10e30f7d8fcb45f80b49d656ed75e3bc74605fe7
commit 10e30f7d8fcb45f80b49d656ed75e3bc74605fe7
Author: Robert Wing <rew@FreeBSD.org>
AuthorDate: 2022-04-28 15:43:01 +0000
Commit: John Baldwin <jhb@FreeBSD.org>
CommitDate: 2023-01-26 18:50:42 +0000
bhyve/snapshot: ..back to SOCK_STREAM
Now that nvlist_send()/nvlist_recv() are being used, ditch the datagram
socket.
Reviewed by: markj
Differential Revision: https://reviews.freebsd.org/D34863
(cherry picked from commit 690b7ea081790eef2c890f63a4fe7e195cf51df0)
---
usr.sbin/bhyve/snapshot.c | 14 +++++++++++---
usr.sbin/bhyvectl/bhyvectl.c | 9 +++++----
2 files changed, 16 insertions(+), 7 deletions(-)
diff --git a/usr.sbin/bhyve/snapshot.c b/usr.sbin/bhyve/snapshot.c
index 7c34a9b2f0ea..df09e9f1cb21 100644
--- a/usr.sbin/bhyve/snapshot.c
+++ b/usr.sbin/bhyve/snapshot.c
@@ -1450,19 +1450,21 @@ handle_message(struct vmctx *ctx, nvlist_t *nvl)
void *
checkpoint_thread(void *param)
{
+ int fd;
struct checkpoint_thread_info *thread_info;
nvlist_t *nvl;
pthread_set_name_np(pthread_self(), "checkpoint thread");
thread_info = (struct checkpoint_thread_info *)param;
- for (;;) {
- nvl = nvlist_recv(thread_info->socket_fd, 0);
+ while ((fd = accept(thread_info->socket_fd, NULL, NULL)) != -1) {
+ nvl = nvlist_recv(fd, 0);
if (nvl != NULL)
handle_message(thread_info->ctx, nvl);
else
EPRINTLN("nvlist_recv() failed: %s", strerror(errno));
+ close(fd);
nvlist_destroy(nvl);
}
@@ -1515,7 +1517,7 @@ init_checkpoint_thread(struct vmctx *ctx)
memset(&addr, 0, sizeof(addr));
- socket_fd = socket(PF_UNIX, SOCK_DGRAM, 0);
+ socket_fd = socket(PF_UNIX, SOCK_STREAM, 0);
if (socket_fd < 0) {
EPRINTLN("Socket creation failed: %s", strerror(errno));
err = -1;
@@ -1536,6 +1538,12 @@ init_checkpoint_thread(struct vmctx *ctx)
goto fail;
}
+ if (listen(socket_fd, 10) < 0) {
+ EPRINTLN("ipc socket listen: %s\n", strerror(errno));
+ err = errno;
+ goto fail;
+ }
+
checkpoint_info = calloc(1, sizeof(*checkpoint_info));
checkpoint_info->ctx = ctx;
checkpoint_info->socket_fd = socket_fd;
diff --git a/usr.sbin/bhyvectl/bhyvectl.c b/usr.sbin/bhyvectl/bhyvectl.c
index 06ab05cd48e1..14ab6c7ad33e 100644
--- a/usr.sbin/bhyvectl/bhyvectl.c
+++ b/usr.sbin/bhyvectl/bhyvectl.c
@@ -1687,7 +1687,7 @@ send_message(const char *vmname, nvlist_t *nvl)
struct sockaddr_un addr;
int err, socket_fd;
- socket_fd = socket(PF_UNIX, SOCK_DGRAM, 0);
+ socket_fd = socket(PF_UNIX, SOCK_STREAM, 0);
if (socket_fd < 0) {
perror("Error creating bhyvectl socket");
err = -1;
@@ -1695,11 +1695,12 @@ send_message(const char *vmname, nvlist_t *nvl)
}
memset(&addr, 0, sizeof(struct sockaddr_un));
+ snprintf(addr.sun_path, sizeof(addr.sun_path), "%s%s",
+ BHYVE_RUN_DIR, vmname);
addr.sun_family = AF_UNIX;
+ addr.sun_len = SUN_LEN(&addr);
- snprintf(addr.sun_path, sizeof(addr.sun_path), "%s%s", BHYVE_RUN_DIR, vmname);
-
- if (connect(socket_fd, (struct sockaddr *)&addr, SUN_LEN(&addr)) != 0) {
+ if (connect(socket_fd, (struct sockaddr *)&addr, addr.sun_len) != 0) {
perror("connect() failed");
err = errno;
goto done;