diff --git a/src/bhyve/bhyve_domain.h b/src/bhyve/bhyve_domain.h index b8ef22a444..0a60392166 100644 --- a/src/bhyve/bhyve_domain.h +++ b/src/bhyve/bhyve_domain.h @@ -26,11 +26,15 @@ # include "domain_addr.h" # include "domain_conf.h" +# include "bhyve_monitor.h" + typedef struct _bhyveDomainObjPrivate bhyveDomainObjPrivate; typedef bhyveDomainObjPrivate *bhyveDomainObjPrivatePtr; struct _bhyveDomainObjPrivate { virDomainPCIAddressSetPtr pciaddrs; bool persistentAddrs; + + bhyveMonitorPtr mon; }; extern virDomainXMLPrivateDataCallbacks virBhyveDriverPrivateDataCallbacks; diff --git a/src/bhyve/bhyve_monitor.c b/src/bhyve/bhyve_monitor.c index 131672014a..37c9e79146 100644 --- a/src/bhyve/bhyve_monitor.c +++ b/src/bhyve/bhyve_monitor.c @@ -27,6 +27,7 @@ #include #include +#include "bhyve_domain.h" #include "bhyve_monitor.h" #include "bhyve_process.h" #include "viralloc.h" @@ -41,7 +42,6 @@ VIR_LOG_INIT("bhyve.bhyve_monitor"); struct _bhyveMonitor { int kq; int watch; - virDomainObjPtr vm; bhyveConnPtr driver; }; @@ -49,7 +49,9 @@ static void bhyveMonitorIO(int watch, int kq, int events ATTRIBUTE_UNUSED, void *opaque) { const struct timespec zerowait = { 0, 0 }; - bhyveMonitorPtr mon = opaque; + virDomainObjPtr vm = opaque; + bhyveDomainObjPrivatePtr priv = vm->privateData; + bhyveMonitorPtr mon = priv->mon; struct kevent kev; int rc, status; @@ -75,10 +77,10 @@ bhyveMonitorIO(int watch, int kq, int events ATTRIBUTE_UNUSED, void *opaque) } if (kev.filter == EVFILT_PROC && (kev.fflags & NOTE_EXIT) != 0) { - if ((pid_t)kev.ident != mon->vm->pid) { + if ((pid_t)kev.ident != vm->pid) { virReportError(VIR_ERR_INTERNAL_ERROR, _("event from unexpected proc %ju!=%ju"), - (uintmax_t)mon->vm->pid, (uintmax_t)kev.ident); + (uintmax_t)vm->pid, (uintmax_t)kev.ident); return; } @@ -86,28 +88,28 @@ bhyveMonitorIO(int watch, int kq, int events ATTRIBUTE_UNUSED, void *opaque) if (WIFSIGNALED(status) && WCOREDUMP(status)) { virReportError(VIR_ERR_INTERNAL_ERROR, _("Guest %s got signal %d and crashed"), - mon->vm->def->name, + vm->def->name, WTERMSIG(status)); - virBhyveProcessStop(mon->driver, mon->vm, + virBhyveProcessStop(mon->driver, vm, VIR_DOMAIN_SHUTOFF_CRASHED); } else if (WIFEXITED(status)) { if (WEXITSTATUS(status) == 0) { /* 0 - reboot */ /* TODO: Implementing reboot is a little more complicated. */ VIR_INFO("Guest %s rebooted; destroying domain.", - mon->vm->def->name); - virBhyveProcessStop(mon->driver, mon->vm, + vm->def->name); + virBhyveProcessStop(mon->driver, vm, VIR_DOMAIN_SHUTOFF_SHUTDOWN); } else if (WEXITSTATUS(status) < 3) { /* 1 - shutdown, 2 - halt, 3 - triple fault. others - error */ VIR_INFO("Guest %s shut itself down; destroying domain.", - mon->vm->def->name); - virBhyveProcessStop(mon->driver, mon->vm, + vm->def->name); + virBhyveProcessStop(mon->driver, vm, VIR_DOMAIN_SHUTOFF_SHUTDOWN); } else { VIR_INFO("Guest %s had an error and exited with status %d; destroying domain.", - mon->vm->def->name, WEXITSTATUS(status)); - virBhyveProcessStop(mon->driver, mon->vm, + vm->def->name, WEXITSTATUS(status)); + virBhyveProcessStop(mon->driver, vm, VIR_DOMAIN_SHUTOFF_UNKNOWN); } } @@ -117,24 +119,24 @@ bhyveMonitorIO(int watch, int kq, int events ATTRIBUTE_UNUSED, void *opaque) static void bhyveMonitorRelease(void *opaque) { - bhyveMonitorPtr mon = opaque; + virDomainObjPtr vm = opaque; + bhyveDomainObjPrivatePtr priv = vm->privateData; + bhyveMonitorPtr mon = priv->mon; VIR_FORCE_CLOSE(mon->kq); - virObjectUnref(mon->vm); VIR_FREE(mon); } bhyveMonitorPtr bhyveMonitorOpen(virDomainObjPtr vm, bhyveConnPtr driver) { - bhyveMonitorPtr mon; + bhyveMonitorPtr mon = NULL; struct kevent kev; int rc; if (VIR_ALLOC(mon) < 0) return NULL; - mon->vm = virObjectRef(vm); mon->driver = driver; mon->kq = kqueue(); @@ -157,7 +159,7 @@ bhyveMonitorOpen(virDomainObjPtr vm, bhyveConnPtr driver) VIR_EVENT_HANDLE_ERROR | VIR_EVENT_HANDLE_HANGUP, bhyveMonitorIO, - mon, + vm, bhyveMonitorRelease); if (mon->watch < 0) { virReportError(VIR_ERR_INTERNAL_ERROR, "%s", diff --git a/src/bhyve/bhyve_process.c b/src/bhyve/bhyve_process.c index 284641a808..42255d21bd 100644 --- a/src/bhyve/bhyve_process.c +++ b/src/bhyve/bhyve_process.c @@ -113,6 +113,7 @@ virBhyveProcessStart(virConnectPtr conn, virCommandPtr cmd = NULL; virCommandPtr load_cmd = NULL; bhyveConnPtr privconn = conn->privateData; + bhyveDomainObjPrivatePtr priv = vm->privateData; int ret = -1, rc; if (virAsprintf(&logfile, "%s/%s.log", @@ -210,7 +211,7 @@ virBhyveProcessStart(virConnectPtr conn, vm->def->id = vm->pid; virDomainObjSetState(vm, VIR_DOMAIN_RUNNING, reason); - vm->privateData = bhyveMonitorOpen(vm, driver); + priv->mon = bhyveMonitorOpen(vm, driver); if (virDomainSaveStatus(driver->xmlopt, BHYVE_STATE_DIR, @@ -257,6 +258,7 @@ virBhyveProcessStop(bhyveConnPtr driver, { int ret = -1; virCommandPtr cmd = NULL; + bhyveDomainObjPrivatePtr priv = vm->privateData; if (!virDomainObjIsActive(vm)) { VIR_DEBUG("VM '%s' not active", vm->def->name); @@ -270,8 +272,8 @@ virBhyveProcessStop(bhyveConnPtr driver, return -1; } - if (vm->privateData != NULL) - bhyveMonitorClose((bhyveMonitorPtr)vm->privateData); + if ((priv != NULL) && (priv->mon != NULL)) + bhyveMonitorClose(priv->mon); /* First, try to kill 'bhyve' process */ if (virProcessKillPainfully(vm->pid, true) != 0) @@ -358,6 +360,7 @@ virBhyveProcessReconnect(virDomainObjPtr vm, int nprocs; char **proc_argv; char *expected_proctitle = NULL; + bhyveDomainObjPrivatePtr priv = vm->privateData; int ret = -1; if (!virDomainObjIsActive(vm)) @@ -379,7 +382,7 @@ virBhyveProcessReconnect(virDomainObjPtr vm, if (proc_argv && proc_argv[0]) { if (STREQ(expected_proctitle, proc_argv[0])) { ret = 0; - vm->privateData = bhyveMonitorOpen(vm, data->driver); + priv->mon = bhyveMonitorOpen(vm, data->driver); } }