From a45b99ead9419241b3a8a3300c4b2167efcc8b69 Mon Sep 17 00:00:00 2001 From: "Daniel P. Berrange" Date: Wed, 24 Jul 2013 17:36:42 +0100 Subject: [PATCH] Introduce a more convenient virCgroupNewDetectMachine Instead of requiring drivers to use a combination of calls to virCgroupNewDetect and virCgroupIsValidMachine, combine the two into virCgroupNewDetectMachine Signed-off-by: Daniel P. Berrange --- src/libvirt_private.syms | 1 + src/lxc/lxc_process.c | 20 ++++++++------------ src/qemu/qemu_cgroup.c | 16 ++++------------ src/util/vircgroup.c | 22 ++++++++++++++++++++++ src/util/vircgroup.h | 5 +++++ 5 files changed, 40 insertions(+), 24 deletions(-) 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,