Page MenuHomeFreeBSD

D57494.id179360.diff
No OneTemporary

D57494.id179360.diff

diff --git a/usr.sbin/bhyve/amd64/bhyverun_machdep.c b/usr.sbin/bhyve/amd64/bhyverun_machdep.c
--- a/usr.sbin/bhyve/amd64/bhyverun_machdep.c
+++ b/usr.sbin/bhyve/amd64/bhyverun_machdep.c
@@ -37,6 +37,9 @@
#include "acpi.h"
#include "atkbdc.h"
#include "bhyverun.h"
+#ifdef BHYVE_SNAPSHOT
+#include "snapshot.h"
+#endif
#include "bootrom.h"
#include "config.h"
#include "debug.h"
@@ -65,6 +68,7 @@
set_config_bool("x86.strictmsr", true);
set_config_bool("x86.verbosemsr", false);
set_config_value("lpc.fwcfg", "bhyve");
+ set_config_value("rundir", BHYVE_RUN_DIR);
}
void
diff --git a/usr.sbin/bhyve/bhyverun.c b/usr.sbin/bhyve/bhyverun.c
--- a/usr.sbin/bhyve/bhyverun.c
+++ b/usr.sbin/bhyve/bhyverun.c
@@ -1062,7 +1062,7 @@
/*
* checkpointing thread for communication with bhyvectl
*/
- if (init_checkpoint_thread(ctx) != 0)
+ if (init_checkpoint_thread(ctx, get_config_value("rundir")) != 0)
errx(EX_OSERR, "Failed to start checkpoint thread");
#endif
diff --git a/usr.sbin/bhyve/snapshot.h b/usr.sbin/bhyve/snapshot.h
--- a/usr.sbin/bhyve/snapshot.h
+++ b/usr.sbin/bhyve/snapshot.h
@@ -99,7 +99,7 @@
int get_checkpoint_msg(int conn_fd, struct vmctx *ctx);
void *checkpoint_thread(void *param);
-int init_checkpoint_thread(struct vmctx *ctx);
+int init_checkpoint_thread(struct vmctx *ctx, const char *bhyve_run_dir);
int load_restore_file(const char *filename, struct restore_state *rstate);
diff --git a/usr.sbin/bhyve/snapshot.c b/usr.sbin/bhyve/snapshot.c
--- a/usr.sbin/bhyve/snapshot.c
+++ b/usr.sbin/bhyve/snapshot.c
@@ -1399,13 +1399,13 @@
* Create the listening socket for IPC with bhyvectl
*/
int
-init_checkpoint_thread(struct vmctx *ctx)
+init_checkpoint_thread(struct vmctx *ctx, const char *bhyve_run_dir)
{
struct checkpoint_thread_info *checkpoint_info = NULL;
struct sockaddr_un addr;
int socket_fd;
pthread_t checkpoint_pthread;
- int err;
+ int err, ret;
#ifndef WITHOUT_CAPSICUM
cap_rights_t rights;
#endif
@@ -1421,8 +1421,14 @@
addr.sun_family = AF_UNIX;
- snprintf(addr.sun_path, sizeof(addr.sun_path), "%s%s",
- BHYVE_RUN_DIR, vm_get_name(ctx));
+ ret = snprintf(addr.sun_path, sizeof(addr.sun_path), "%s/%s",
+ bhyve_run_dir, vm_get_name(ctx));
+ if ((ret < 0) || ((size_t)ret >= sizeof(addr.sun_path))) {
+ EPRINTLN("%s: error setting socket path (%d)", __func__, ret);
+ err = -1;
+ goto fail;
+ }
+
addr.sun_len = SUN_LEN(&addr);
unlink(addr.sun_path);
diff --git a/usr.sbin/bhyvectl/bhyvectl.c b/usr.sbin/bhyvectl/bhyvectl.c
--- a/usr.sbin/bhyvectl/bhyvectl.c
+++ b/usr.sbin/bhyvectl/bhyvectl.c
@@ -86,6 +86,7 @@
#ifdef BHYVE_SNAPSHOT
SET_CHECKPOINT_FILE,
SET_SUSPEND_FILE,
+ SET_RUNDIR,
#endif
OPT_LAST,
};
@@ -138,6 +139,7 @@
#ifdef BHYVE_SNAPSHOT
{ "checkpoint", REQ_ARG, 0, SET_CHECKPOINT_FILE},
{ "suspend", REQ_ARG, 0, SET_SUSPEND_FILE},
+ { "rundir", REQ_ARG, 0, SET_RUNDIR},
#endif
};
@@ -155,6 +157,7 @@
#ifdef BHYVE_SNAPSHOT
[SET_CHECKPOINT_FILE] = "filename",
[SET_SUSPEND_FILE] = "filename",
+ [SET_RUNDIR] = BHYVE_RUN_DIR,
#endif
};
(void)fprintf(stderr, "Usage: %s --vm=<vmname>\n", progname);
@@ -252,10 +255,10 @@
#ifdef BHYVE_SNAPSHOT
static int
-send_message(const char *vmname, nvlist_t *nvl)
+send_message(const char *vmname, nvlist_t *nvl, const char *rundir)
{
struct sockaddr_un addr;
- int err = 0, socket_fd;
+ int err = 0, ret, socket_fd;
socket_fd = socket(PF_UNIX, SOCK_STREAM, 0);
if (socket_fd < 0) {
@@ -265,8 +268,15 @@
}
memset(&addr, 0, sizeof(struct sockaddr_un));
- snprintf(addr.sun_path, sizeof(addr.sun_path), "%s%s",
- BHYVE_RUN_DIR, vmname);
+ ret = snprintf(addr.sun_path, sizeof(addr.sun_path), "%s/%s",
+ rundir, vmname);
+ if ((ret < 0) || ((size_t)ret >= sizeof(addr.sun_path))) {
+ fprintf(stderr, "%s: error setting socket path (%d)",
+ __func__, ret);
+ err = 1;
+ goto done;
+ }
+
addr.sun_family = AF_UNIX;
addr.sun_len = SUN_LEN(&addr);
@@ -305,7 +315,7 @@
}
static int
-snapshot_request(const char *vmname, char *file, bool suspend)
+snapshot_request(const char *vmname, char *file, bool suspend, const char *rundir)
{
nvlist_t *nvl;
int fd;
@@ -319,7 +329,7 @@
nvlist_add_bool(nvl, "suspend", suspend);
nvlist_move_descriptor(nvl, "fddir", fd);
- return (send_message(vmname, nvl));
+ return (send_message(vmname, nvl, rundir));
}
#endif
@@ -335,6 +345,7 @@
struct option *opts;
#ifdef BHYVE_SNAPSHOT
char *checkpoint_file = NULL;
+ char *rundir = NULL;
#endif
opts = setup_options();
@@ -379,6 +390,11 @@
checkpoint_file = optarg;
vm_suspend_opt = (ch == SET_SUSPEND_FILE);
break;
+
+ case SET_RUNDIR:
+ rundir = optarg;
+ break;
+
#endif
default:
usage(opts);
@@ -528,7 +544,9 @@
#ifdef BHYVE_SNAPSHOT
if (!error && checkpoint_file)
- error = snapshot_request(vmname, checkpoint_file, vm_suspend_opt);
+ error = snapshot_request(vmname, checkpoint_file,
+ vm_suspend_opt,
+ rundir ? rundir : BHYVE_RUN_DIR);
#endif
if (error)

File Metadata

Mime Type
text/plain
Expires
Mon, Aug 3, 12:13 PM (16 h, 56 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
35908187
Default Alt Text
D57494.id179360.diff (4 KB)

Event Timeline