diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms index 2019ef52d0..7cbc35b2c6 100644 --- a/src/libvirt_private.syms +++ b/src/libvirt_private.syms @@ -1118,6 +1118,7 @@ virCgroupSetMemorySoftLimit; virCgroupSetMemSwapHardLimit; virCgroupSetOwner; virCgroupSupportsCpuBW; +virCgroupTerminateMachine; # util/virclosecallbacks.h diff --git a/src/qemu/qemu_cgroup.c b/src/qemu/qemu_cgroup.c index bd22b7fbd6..fa894c578b 100644 --- a/src/qemu/qemu_cgroup.c +++ b/src/qemu/qemu_cgroup.c @@ -1206,13 +1206,22 @@ qemuSetupCgroupForIOThreads(virDomainObjPtr vm) } int -qemuRemoveCgroup(virDomainObjPtr vm) +qemuRemoveCgroup(virQEMUDriverPtr driver, + virDomainObjPtr vm) { qemuDomainObjPrivatePtr priv = vm->privateData; + virQEMUDriverConfigPtr cfg = virQEMUDriverGetConfig(driver); if (priv->cgroup == NULL) return 0; /* Not supported, so claim success */ + if (virCgroupTerminateMachine(vm->def->name, + "qemu", + cfg->privileged) < 0) { + if (!virCgroupNewIgnoreError()) + VIR_DEBUG("Failed to terminate cgroup for %s", vm->def->name); + } + return virCgroupRemove(priv->cgroup); } diff --git a/src/qemu/qemu_cgroup.h b/src/qemu/qemu_cgroup.h index 8a2c723bb7..4a4f22c778 100644 --- a/src/qemu/qemu_cgroup.h +++ b/src/qemu/qemu_cgroup.h @@ -66,7 +66,7 @@ int qemuSetupCgroupForIOThreads(virDomainObjPtr vm); int qemuSetupCgroupForEmulator(virQEMUDriverPtr driver, virDomainObjPtr vm, virBitmapPtr nodemask); -int qemuRemoveCgroup(virDomainObjPtr vm); +int qemuRemoveCgroup(virQEMUDriverPtr driver, virDomainObjPtr vm); int qemuAddToCgroup(virDomainObjPtr vm); #endif /* __QEMU_CGROUP_H__ */ diff --git a/src/qemu/qemu_process.c b/src/qemu/qemu_process.c index 11eeb3ca38..712a25e022 100644 --- a/src/qemu/qemu_process.c +++ b/src/qemu/qemu_process.c @@ -4143,7 +4143,7 @@ int qemuProcessStart(virConnectPtr conn, /* Ensure no historical cgroup for this VM is lying around bogus * settings */ VIR_DEBUG("Ensuring no historical cgroup is lying around"); - qemuRemoveCgroup(vm); + qemuRemoveCgroup(driver, vm); for (i = 0; i < vm->def->ngraphics; ++i) { virDomainGraphicsDefPtr graphics = vm->def->graphics[i]; @@ -4921,7 +4921,7 @@ void qemuProcessStop(virQEMUDriverPtr driver, } retry: - if ((ret = qemuRemoveCgroup(vm)) < 0) { + if ((ret = qemuRemoveCgroup(driver, vm)) < 0) { if (ret == -EBUSY && (retries++ < 5)) { usleep(200*1000); goto retry; diff --git a/src/util/vircgroup.c b/src/util/vircgroup.c index 1dbe6f99e8..d69f71bc22 100644 --- a/src/util/vircgroup.c +++ b/src/util/vircgroup.c @@ -1680,6 +1680,17 @@ virCgroupNewMachineSystemd(const char *name, } +/* + * Returns 0 on success, -1 on fatal error + */ +int virCgroupTerminateMachine(const char *name, + const char *drivername, + bool privileged) +{ + return virSystemdTerminateMachine(name, drivername, privileged); +} + + static int virCgroupNewMachineManual(const char *name, const char *drivername, diff --git a/src/util/vircgroup.h b/src/util/vircgroup.h index 19e82d16eb..7718a07d10 100644 --- a/src/util/vircgroup.h +++ b/src/util/vircgroup.h @@ -106,6 +106,11 @@ int virCgroupNewMachine(const char *name, ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2) ATTRIBUTE_NONNULL(4); +int virCgroupTerminateMachine(const char *name, + const char *drivername, + bool privileged) + ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2); + bool virCgroupNewIgnoreError(void); void virCgroupFree(virCgroupPtr *group);