]> xenbits.xensource.com Git - libvirt.git/commitdiff
bhyve: implement domainShutdown
authorRoman Bogorodskiy <bogorodskiy@gmail.com>
Wed, 4 May 2016 16:41:59 +0000 (19:41 +0300)
committerRoman Bogorodskiy <bogorodskiy@gmail.com>
Thu, 5 May 2016 05:04:01 +0000 (08:04 +0300)
Bhyve supports ACPI shutdown by issuing SIGTERM signal to a bhyve
process.

Add the bhyveDomainShutdown() function and virBhyveProcessShutdown()
helper function that just sends SIGTERM to VM's bhyve process. If
a guest supports ACPI shutdown then process will be terminated and
this event will be noticed by the bhyve monitor code that will handle
setting proper status and clean up VM's resources by calling
virBhyveProcessStop().

src/bhyve/bhyve_driver.c
src/bhyve/bhyve_process.c
src/bhyve/bhyve_process.h

index 5526bb037fade7d411cde5de7b1a734e04662950..4fc504e3479d07f4bcec60100d7e84e33d6fe404 100644 (file)
@@ -1017,6 +1017,32 @@ bhyveDomainDestroy(virDomainPtr dom)
     return ret;
 }
 
+static int
+bhyveDomainShutdown(virDomainPtr dom)
+{
+    virDomainObjPtr vm;
+    int ret = -1;
+
+    if (!(vm = bhyveDomObjFromDomain(dom)))
+        goto cleanup;
+
+    if (virDomainShutdownEnsureACL(dom->conn, vm->def) < 0)
+        goto cleanup;
+
+    if (!virDomainObjIsActive(vm)) {
+        virReportError(VIR_ERR_OPERATION_INVALID,
+                       "%s", _("Domain is not running"));
+        goto cleanup;
+    }
+
+    ret = virBhyveProcessShutdown(vm);
+
+ cleanup:
+    if (vm)
+        virObjectUnlock(vm);
+    return ret;
+}
+
 static int
 bhyveDomainOpenConsole(virDomainPtr dom,
                        const char *dev_name ATTRIBUTE_UNUSED,
@@ -1502,6 +1528,7 @@ static virHypervisorDriver bhyveHypervisorDriver = {
     .domainCreateWithFlags = bhyveDomainCreateWithFlags, /* 1.2.3 */
     .domainCreateXML = bhyveDomainCreateXML, /* 1.2.4 */
     .domainDestroy = bhyveDomainDestroy, /* 1.2.2 */
+    .domainShutdown = bhyveDomainShutdown, /* 1.3.3 */
     .domainLookupByUUID = bhyveDomainLookupByUUID, /* 1.2.2 */
     .domainLookupByName = bhyveDomainLookupByName, /* 1.2.2 */
     .domainLookupByID = bhyveDomainLookupByID, /* 1.2.3 */
index fe61a9aa307fd8a21d416ebaea2195c4d135f492..6db070f6ba46d9ff43ea2fc4ae5235b1ba2d2d56 100644 (file)
@@ -308,6 +308,29 @@ virBhyveProcessStop(bhyveConnPtr driver,
     return ret;
 }
 
+int
+virBhyveProcessShutdown(virDomainObjPtr vm)
+{
+    if (vm->pid <= 0) {
+        virReportError(VIR_ERR_INTERNAL_ERROR,
+                       _("Invalid PID %d for VM"),
+                       (int)vm->pid);
+        return -1;
+    }
+
+    /* Bhyve tries to perform ACPI shutdown when it receives
+     * SIGTERM signal. So we just issue SIGTERM here and rely
+     * on the bhyve monitor to clean things up if process disappears.
+     */
+    if (virProcessKill(vm->pid, SIGTERM) != 0) {
+        VIR_WARN("Failed to terminate bhyve process for VM '%s': %s",
+                 vm->def->name, virGetLastErrorMessage());
+        return -1;
+    }
+
+    return 0;
+}
+
 int
 virBhyveGetDomainTotalCpuStats(virDomainObjPtr vm,
                                unsigned long long *cpustats)
index cfa80af6aa3a163267a63c014665d3599d0ba9d6..ebabe17d87d2d0008352cdd5b56fb0e8134f4efc 100644 (file)
@@ -34,6 +34,8 @@ int virBhyveProcessStop(bhyveConnPtr driver,
                         virDomainObjPtr vm,
                         virDomainShutoffReason reason);
 
+int virBhyveProcessShutdown(virDomainObjPtr vm);
+
 int virBhyveGetDomainTotalCpuStats(virDomainObjPtr vm,
                                    unsigned long long *cpustats);