diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms index d5ec146646..b076e60c65 100644 --- a/src/libvirt_private.syms +++ b/src/libvirt_private.syms @@ -1192,6 +1192,7 @@ virCgroupKillPainfully; virCgroupKillRecursive; virCgroupMoveTask; virCgroupNewDetect; +virCgroupNewDetectMachine; virCgroupNewDomainPartition; virCgroupNewEmulator; virCgroupNewIgnoreError; diff --git a/src/lxc/lxc_process.c b/src/lxc/lxc_process.c index 06ead9fafd..e632e1390d 100644 --- a/src/lxc/lxc_process.c +++ b/src/lxc/lxc_process.c @@ -1189,16 +1189,14 @@ int virLXCProcessStart(virConnectPtr conn, goto cleanup; } - if (virCgroupNewDetect(vm->pid, &priv->cgroup) < 0) + if (virCgroupNewDetectMachine(vm->def->name, "lxc", + vm->pid, &priv->cgroup) < 0) goto error; - if (!virCgroupIsValidMachineGroup(priv->cgroup, - vm->def->name, - "lxc")) { + if (!priv->cgroup) { virReportError(VIR_ERR_INTERNAL_ERROR, - _("Cgroup name is not valid for machine %s"), + _("No valid cgroup for machine %s"), vm->def->name); - virCgroupFree(&priv->cgroup); goto error; } @@ -1399,16 +1397,14 @@ virLXCProcessReconnectDomain(virDomainObjPtr vm, if (!(priv->monitor = virLXCProcessConnectMonitor(driver, vm))) goto error; - if (virCgroupNewDetect(vm->pid, &priv->cgroup) < 0) + if (virCgroupNewDetectMachine(vm->def->name, "lxc", + vm->pid, &priv->cgroup) < 0) goto error; - if (!virCgroupIsValidMachineGroup(priv->cgroup, - vm->def->name, - "lxc")) { + if (!priv->cgroup) { virReportError(VIR_ERR_INTERNAL_ERROR, - _("Cgroup name is not valid for machine %s"), + _("No valid cgroup for machine %s"), vm->def->name); - virCgroupFree(&priv->cgroup); goto error; } diff --git a/src/qemu/qemu_cgroup.c b/src/qemu/qemu_cgroup.c index bca8630323..07e901c34c 100644 --- a/src/qemu/qemu_cgroup.c +++ b/src/qemu/qemu_cgroup.c @@ -704,19 +704,11 @@ qemuConnectCgroup(virQEMUDriverPtr driver, virCgroupFree(&priv->cgroup); - if (virCgroupNewDetect(vm->pid, &priv->cgroup) < 0) { - if (virCgroupNewIgnoreError()) - goto done; + if (virCgroupNewDetectMachine(vm->def->name, + "qemu", + vm->pid, + &priv->cgroup) < 0) goto cleanup; - } - - if (!virCgroupIsValidMachineGroup(priv->cgroup, - vm->def->name, - "qemu")) { - VIR_DEBUG("Cgroup name is not valid for machine"); - virCgroupFree(&priv->cgroup); - goto done; - } done: ret = 0; diff --git a/src/util/vircgroup.c b/src/util/vircgroup.c index 87325c0394..6872ac4d12 100644 --- a/src/util/vircgroup.c +++ b/src/util/vircgroup.c @@ -1575,6 +1575,28 @@ int virCgroupNewDetect(pid_t pid ATTRIBUTE_UNUSED, } #endif +/* + * Returns 0 on success (but @group may be NULL), -1 on fatal error + */ +int virCgroupNewDetectMachine(const char *name, + const char *drivername, + pid_t pid, + virCgroupPtr *group) +{ + if (virCgroupNewDetect(pid, group) < 0) { + if (virCgroupNewIgnoreError()) + return 0; + return -1; + } + + if (!virCgroupIsValidMachineGroup(*group, name, drivername)) { + virCgroupFree(group); + return 0; + } + + return 0; +} + int virCgroupNewMachine(const char *name, const char *drivername, bool privileged ATTRIBUTE_UNUSED, diff --git a/src/util/vircgroup.h b/src/util/vircgroup.h index e47367ce5d..4f72aa8ced 100644 --- a/src/util/vircgroup.h +++ b/src/util/vircgroup.h @@ -83,6 +83,11 @@ int virCgroupNewEmulator(virCgroupPtr domain, int virCgroupNewDetect(pid_t pid, virCgroupPtr *group); +int virCgroupNewDetectMachine(const char *name, + const char *drivername, + pid_t pid, + virCgroupPtr *group); + int virCgroupNewMachine(const char *name, const char *drivername, bool privileged,