Add log_trace statements in key places to assist with
troubleshooting.
diff --git usr.sbin/vmd/config.c usr.sbin/vmd/config.c
index 9ea87eb86e8..623a9b9d4f3 100644
--- usr.sbin/vmd/config.c
+++ usr.sbin/vmd/config.c
@@ -81,14 +81,18 @@ config_purge(struct vmd *env, unsigned int reset)
struct vmd_switch *vsw;
unsigned int what;
+ log_trace("%s: purging vms and switches from running config",
+ __func__);
/* Reset global configuration (prefix was verified before) */
(void)host(VMD_DHCP_PREFIX, &env->vmd_cfg.cfg_localprefix);
/* Reset other configuration */
what = ps->ps_what[privsep_process] & reset;
if (what & CONFIG_VMS && env->vmd_vms != NULL) {
- while ((vm = TAILQ_FIRST(env->vmd_vms)) != NULL)
+ while ((vm = TAILQ_FIRST(env->vmd_vms)) != NULL) {
+ log_trace("%s: calling vm_remove", __func__);
vm_remove(vm);
+ }
env->vmd_nvm = 0;
}
if (what & CONFIG_SWITCHES && env->vmd_switches != NULL) {
@@ -104,6 +108,7 @@ config_setconfig(struct vmd *env)
struct privsep *ps = &env->vmd_ps;
unsigned int id;
+ log_trace("%s: setting config", __func__);
for (id = 0; id < PROC_MAX; id++) {
if (id == privsep_process)
continue;
@@ -117,6 +122,7 @@ config_setconfig(struct vmd *env)
int
config_getconfig(struct vmd *env, struct imsg *imsg)
{
+ log_trace("%s: retrieving config", __func__);
IMSG_SIZE_CHECK(imsg, &env->vmd_cfg);
memcpy(&env->vmd_cfg, imsg->data, sizeof(env->vmd_cfg));
@@ -129,6 +135,7 @@ config_setreset(struct vmd *env, unsigned int reset)
struct privsep *ps = &env->vmd_ps;
unsigned int id;
+ log_trace("%s: resetting state", __func__);
for (id = 0; id < PROC_MAX; id++) {
if ((reset & ps->ps_what[id]) == 0 ||
id == privsep_process)
@@ -147,6 +154,7 @@ config_getreset(struct vmd *env, struct imsg *imsg)
IMSG_SIZE_CHECK(imsg, &mode);
memcpy(&mode, imsg->data, sizeof(mode));
+ log_trace("%s: resetting state", __func__);
config_purge(env, mode);
return (0);
@@ -374,6 +382,7 @@ config_setvm(struct privsep *ps, struct vmd_vm *vm,
uint32_t peerid, uid_t uid)
free(tapfds);
}
+ log_trace("%s: calling vm_remove", __func__);
vm_remove(vm);
errno = saved_errno;
if (errno == 0)
@@ -406,6 +415,7 @@ config_getvm(struct privsep *ps, struct imsg *imsg)
imsg->fd = -1;
}
+ log_trace("%s: calling vm_remove", __func__);
vm_remove(vm);
if (errno == 0)
errno = EINVAL;
diff --git usr.sbin/vmd/control.c usr.sbin/vmd/control.c
index 1af8a0d5e14..9263d0a3ae1 100644
--- usr.sbin/vmd/control.c
+++ usr.sbin/vmd/control.c
@@ -276,6 +276,7 @@ control_close(int fd, struct control_sock *cs)
{
struct ctl_conn *c;
+ log_trace("%s", __func__);
if ((c = control_connbyfd(fd)) == NULL) {
log_warn("%s: fd %d: not found", __func__, fd);
return;
@@ -401,9 +402,14 @@ control_dispatch_imsg(int fd, short event, void *arg)
goto fail;
memcpy(&vid, imsg.data, sizeof(vid));
vid.vid_uid = c->peercred.uid;
+ log_trace("%s vid: %d, name: %s, uid: %d",
+ __func__, vid.vid_id, vid.vid_name,
+ vid.vid_uid);
if (proc_compose_imsg(ps, PROC_PARENT, -1,
imsg.hdr.type, fd, -1, &vid, sizeof(vid)) == -1) {
+ log_trace("%s: proc_compose_imsg failed...",
+ __func__);
control_close(fd, cs);
return;
}
diff --git usr.sbin/vmd/proc.c usr.sbin/vmd/proc.c
index 183db93a678..2bf0a98c8ee 100644
--- usr.sbin/vmd/proc.c
+++ usr.sbin/vmd/proc.c
@@ -756,6 +756,8 @@ proc_compose_imsg(struct privsep *ps, enum privsep_procid
id, int n,
proc_range(ps, id, &n, &m);
for (; n < m; n++) {
+ log_trace("%s: about to compose_event to PROC %d", __func__,
+ id);
if (imsg_compose_event(&ps->ps_ievs[id][n],
type, peerid, ps->ps_instance + 1, fd, data, datalen) == -1)
return (-1);
diff --git usr.sbin/vmd/vmd.c usr.sbin/vmd/vmd.c
index c7b9247d326..f34917e1a3b 100644
--- usr.sbin/vmd/vmd.c
+++ usr.sbin/vmd/vmd.c
@@ -372,6 +372,8 @@ vmd_dispatch_vmm(int fd, struct privsep_proc *p, struct
imsg *imsg)
case IMSG_VMDOP_TERMINATE_VM_RESPONSE:
IMSG_SIZE_CHECK(imsg, &vmr);
memcpy(&vmr, imsg->data, sizeof(vmr));
+ log_trace("%s: forwarding TERMINATE VM for %d",
+ __func__, vmr.vmr_id);
proc_forward_imsg(ps, imsg, PROC_CONTROL, -1);
if ((vm = vm_getbyvmid(vmr.vmr_id)) == NULL)
break;
@@ -392,15 +394,24 @@ vmd_dispatch_vmm(int fd, struct privsep_proc *p, struct
imsg *imsg)
case IMSG_VMDOP_TERMINATE_VM_EVENT:
IMSG_SIZE_CHECK(imsg, &vmr);
memcpy(&vmr, imsg->data, sizeof(vmr));
+ log_trace("%s: handling TERMINATE_EVENT for %d",
+ __func__, vmr.vmr_id);
if ((vm = vm_getbyvmid(vmr.vmr_id)) == NULL)
break;
if (vmr.vmr_result == 0) {
- if (vm->vm_from_config)
+ if (vm->vm_from_config) {
+ log_trace("%s: about to stop vm %d",
+ __func__, vm->vm_vmid);
vm_stop(vm, 0);
- else
+ } else {
+ log_trace("%s: about to remove vm %d",
+ __func__, vm->vm_vmid);
vm_remove(vm);
+ }
} else if (vmr.vmr_result == EAGAIN) {
/* Stop VM instance but keep the tty open */
+ log_trace("%s: about to stop vm %d with tty open",
+ __func__, vm->vm_vmid);
vm_stop(vm, 1);
config_setvm(ps, vm, (uint32_t)-1, 0);
}
@@ -425,6 +436,8 @@ vmd_dispatch_vmm(int fd, struct privsep_proc *p, struct
imsg *imsg)
}
if (proc_compose_imsg(ps, PROC_CONTROL, -1, imsg->hdr.type,
imsg->hdr.peerid, -1, &vir, sizeof(vir)) == -1) {
+ log_trace("%s: GET_INFO_VM failed for vm
%d...removing",
+ __func__, vm->vm_vmid);
vm_remove(vm);
return (-1);
}
@@ -453,6 +466,8 @@ vmd_dispatch_vmm(int fd, struct privsep_proc *p, struct
imsg *imsg)
IMSG_VMDOP_GET_INFO_VM_DATA,
imsg->hdr.peerid, -1, &vir,
sizeof(vir)) == -1) {
+ log_trace("%s: GET_INFO_VM_END failed",
+ __func__);
vm_remove(vm);
return (-1);
}
@@ -592,6 +607,7 @@ vmd_sighdlr(int sig, short event, void *arg)
{
if (privsep_process != PROC_PARENT)
return;
+ log_trace("%s: handling signal", __func__);
switch (sig) {
case SIGHUP:
@@ -862,8 +878,11 @@ vmd_reload(unsigned int reset, const char *filename)
if (reload) {
TAILQ_FOREACH_SAFE(vm, env->vmd_vms, vm_entry, next_vm)
{
- if (vm->vm_running == 0)
+ if (vm->vm_running == 0) {
+ log_trace("%s: calling vm_remove",
+ __func__);
vm_remove(vm);
+ }
}
/* Update shared global configuration in all children */
@@ -914,6 +933,7 @@ vmd_shutdown(void)
{
struct vmd_vm *vm, *vm_next;
+ log_trace("%s: performing shutdown", __func__);
TAILQ_FOREACH_SAFE(vm, env->vmd_vms, vm_entry, vm_next) {
vm_remove(vm);
}
@@ -1011,6 +1031,7 @@ vm_stop(struct vmd_vm *vm, int keeptty)
if (vm == NULL)
return;
+ log_trace("%s: stopping vm %d", __func__, vm->vm_vmid);
vm->vm_running = 0;
vm->vm_shutdown = 0;
@@ -1051,7 +1072,10 @@ vm_remove(struct vmd_vm *vm)
if (vm == NULL)
return;
+ log_trace("%s: removing vm %d from running config",
+ __func__, vm->vm_vmid);
TAILQ_REMOVE(env->vmd_vms, vm, vm_entry);
+ log_trace("%s: calling vm_stop", __func__);
vm_stop(vm, 0);
free(vm);
}
@@ -1178,6 +1202,7 @@ vm_register(struct privsep *ps, struct vmop_create_params
*vmc,
/* Assign a new internal Id if not specified */
vm->vm_vmid = id == 0 ? env->vmd_nvm : id;
+ log_trace("%s: registering vm %d", __func__, vm->vm_vmid);
TAILQ_INSERT_TAIL(env->vmd_vms, vm, vm_entry);
*ret_vm = vm;
diff --git usr.sbin/vmd/vmm.c usr.sbin/vmd/vmm.c
index 73a895f726e..d3233147cff 100644
--- usr.sbin/vmd/vmm.c
+++ usr.sbin/vmd/vmm.c
@@ -146,6 +146,7 @@ vmm_dispatch_parent(int fd, struct privsep_proc *p, struct
imsg *imsg)
IMSG_SIZE_CHECK(imsg, &vtp);
memcpy(&vtp, imsg->data, sizeof(vtp));
id = vtp.vtp_vm_id;
+ log_trace("%s: recv'ed TERMINATE_VM for %d", __func__, id);
if (id == 0) {
res = ENOENT;
@@ -278,8 +279,11 @@ vmm_dispatch_parent(int fd, struct privsep_proc *p, struct
imsg *imsg)
case IMSG_VMDOP_START_VM_RESPONSE:
if (res != 0) {
/* Remove local reference if it exists */
- if ((vm = vm_getbyvmid(imsg->hdr.peerid)) != NULL)
+ if ((vm = vm_getbyvmid(imsg->hdr.peerid)) != NULL) {
+ log_trace("%s: removing vm, START_VM_RESPONSE",
+ __func__);
vm_remove(vm);
+ }
}
if (id == 0)
id = imsg->hdr.peerid;
@@ -314,6 +318,7 @@ vmm_sighdlr(int sig, short event, void *arg)
struct vmd_vm *vm;
struct vm_terminate_params vtp;
+ log_trace("%s: handling signal", __func__);
switch (sig) {
case SIGCHLD:
do {
@@ -355,6 +360,7 @@ vmm_sighdlr(int sig, short event, void *arg)
log_warnx("could not terminate VM %u",
vm->vm_vmid);
+ log_trace("%s: calling vm_remove", __func__);
vm_remove(vm);
} else
fatalx("unexpected cause of SIGCHLD");
@@ -381,6 +387,7 @@ vmm_shutdown(void)
/* XXX suspend or request graceful shutdown */
(void)terminate_vm(&vtp);
+ log_trace("%s: calling vm_remove", __func__);
vm_remove(vm);
}
}
@@ -465,8 +472,10 @@ vmm_dispatch_vm(int fd, short event, void *arg)
case IMSG_VMDOP_SEND_VM_RESPONSE:
IMSG_SIZE_CHECK(&imsg, &vmr);
memcpy(&vmr, imsg.data, sizeof(vmr));
- if(!vmr.vmr_result)
+ if(!vmr.vmr_result) {
+ log_trace("%s: calling vm_remove", __func__);
vm_remove(vm);
+ }
case IMSG_VMDOP_PAUSE_VM_RESPONSE:
case IMSG_VMDOP_UNPAUSE_VM_RESPONSE:
for (i = 0; i < sizeof(procs); i++) {
@@ -639,6 +648,7 @@ vmm_start_vm(struct imsg *imsg, uint32_t *id)
return (0);
err:
+ log_trace("%s: calling vm_remove", __func__);
vm_remove(vm);
return (ret);
--
2.14.1