From: "Daniel P. Berrange" <berrange(a)redhat.com>
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(a)redhat.com>
---
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