From 39aad72510a324cb50c20d5082fa0fe0edf1e565 Mon Sep 17 00:00:00 2001 From: Richard Weinberger Date: Fri, 14 Feb 2014 16:42:48 +0100 Subject: [PATCH] lxc: Add destroy support for suspended domains Destroying a suspended domain needs special action. We cannot simply terminate all process because they are frozen. Do deal with that we send them SIGKILL and thaw them. Upon wakeup the process sees the pending signal and dies immediately. Signed-off-by: Richard Weinberger --- src/lxc/lxc_process.c | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/src/lxc/lxc_process.c b/src/lxc/lxc_process.c index 8989245f64..ac7ed39c56 100644 --- a/src/lxc/lxc_process.c +++ b/src/lxc/lxc_process.c @@ -697,6 +697,30 @@ int virLXCProcessStop(virLXCDriverPtr driver, VIR_FREE(vm->def->seclabels[0]->imagelabel); } + /* If the LXC domain is suspended we send all processes a SIGKILL + * and thaw them. Upon wakeup the process sees the pending signal + * and dies immediately. It is guaranteed that priv->cgroup != NULL + * here because the domain has aleady been suspended using the + * freezer cgroup. + */ + if (reason == VIR_DOMAIN_SHUTOFF_DESTROYED && + virDomainObjGetState(vm, NULL) == VIR_DOMAIN_PAUSED) { + if (virCgroupKillRecursive(priv->cgroup, SIGKILL) <= 0) { + virReportError(VIR_ERR_INTERNAL_ERROR, "%s", + _("Unable to kill all processes")); + return -1; + } + + if (virCgroupSetFreezerState(priv->cgroup, "THAWED") < 0) { + virReportError(VIR_ERR_OPERATION_FAILED, "%s", + _("Unable to thaw all processes")); + + return -1; + } + + goto cleanup; + } + if (priv->cgroup) { rc = virCgroupKillPainfully(priv->cgroup); if (rc < 0) @@ -716,6 +740,7 @@ int virLXCProcessStop(virLXCDriverPtr driver, } } +cleanup: virLXCProcessCleanup(driver, vm, reason); return 0; -- GitLab