From: "Daniel P. Berrange" <berrange@xxxxxxxxxx> Instead of requiring one API call to create a cgroup and another to add a task to it, introduce a new API virCgroupNewMachine which does both jobs at once. This will facilitate the later code to talk to systemd to achieve this job which is also atomic. Signed-off-by: Daniel P. Berrange <berrange@xxxxxxxxxx> --- src/libvirt_private.syms | 1 + src/util/vircgroup.c | 51 ++++++++++++++++++++++++++++++++++++++++++++++++ src/util/vircgroup.h | 13 ++++++++++++ 3 files changed, 65 insertions(+) diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms index 5a5d112..eef6bdd 100644 --- a/src/libvirt_private.syms +++ b/src/libvirt_private.syms @@ -1191,6 +1191,7 @@ virCgroupNewDetect; virCgroupNewDomainPartition; virCgroupNewEmulator; virCgroupNewIgnoreError; +virCgroupNewMachine; virCgroupNewPartition; virCgroupNewSelf; virCgroupNewVcpu; diff --git a/src/util/vircgroup.c b/src/util/vircgroup.c index 593caad..6f9d25a 100644 --- a/src/util/vircgroup.c +++ b/src/util/vircgroup.c @@ -1563,6 +1563,57 @@ int virCgroupNewDetect(pid_t pid ATTRIBUTE_UNUSED, } #endif +int virCgroupNewMachine(const char *name, + const char *drivername, + bool privileged ATTRIBUTE_UNUSED, + const unsigned char *uuid ATTRIBUTE_UNUSED, + const char *rootdir ATTRIBUTE_UNUSED, + pid_t pidleader ATTRIBUTE_UNUSED, + bool isContainer ATTRIBUTE_UNUSED, + const char *partition, + int controllers, + virCgroupPtr *group) +{ + virCgroupPtr parent = NULL; + int ret = -1; + + *group = NULL; + + if (virCgroupNewPartition(partition, + STREQ(partition, "/machine"), + controllers, + &parent) < 0) { + if (virCgroupNewIgnoreError()) + goto done; + + goto cleanup; + } + + if (virCgroupNewDomainPartition(parent, + drivername, + name, + true, + group) < 0) + goto cleanup; + + if (virCgroupAddTask(*group, pidleader) < 0) { + virErrorPtr saved = virSaveLastError(); + virCgroupRemove(*group); + virCgroupFree(group); + if (saved) { + virSetError(saved); + virFreeError(saved); + } + } + +done: + ret = 0; + +cleanup: + virCgroupFree(&parent); + return ret; +} + bool virCgroupNewIgnoreError(void) { if (virLastErrorIsSystemErrno(ENXIO) || diff --git a/src/util/vircgroup.h b/src/util/vircgroup.h index 3c05604..e47367c 100644 --- a/src/util/vircgroup.h +++ b/src/util/vircgroup.h @@ -83,6 +83,19 @@ int virCgroupNewEmulator(virCgroupPtr domain, int virCgroupNewDetect(pid_t pid, virCgroupPtr *group); +int virCgroupNewMachine(const char *name, + const char *drivername, + bool privileged, + const unsigned char *uuid, + const char *rootdir, + pid_t pidleader, + bool isContainer, + const char *partition, + int controllers, + virCgroupPtr *group) + ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2) + ATTRIBUTE_NONNULL(4); + bool virCgroupNewIgnoreError(void); int virCgroupPathOfController(virCgroupPtr group, -- 1.8.1.4 -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list