On 04/14/2016 11:22 AM, Daniel P. Berrange wrote:
Add the virDomainLxcEnterCGroup API to the libvirt-lxc.so
file. This method moves the calling process into the cgroups
associated with the container.
Signed-off-by: Daniel P. Berrange <berrange(a)redhat.com>
---
include/libvirt/libvirt-lxc.h | 2 ++
src/libvirt-lxc.c | 47 +++++++++++++++++++++++++++++++++++++++++++
src/libvirt_lxc.syms | 5 +++++
3 files changed, 54 insertions(+)
diff --git a/include/libvirt/libvirt-lxc.h b/include/libvirt/libvirt-lxc.h
index 1901fce..0d16a5c 100644
--- a/include/libvirt/libvirt-lxc.h
+++ b/include/libvirt/libvirt-lxc.h
@@ -46,6 +46,8 @@ int virDomainLxcEnterSecurityLabel(virSecurityModelPtr model,
virSecurityLabelPtr label,
virSecurityLabelPtr oldlabel,
unsigned int flags);
+int virDomainLxcEnterCGroup(virDomainPtr domain,
+ unsigned int flags);
# ifdef __cplusplus
}
diff --git a/src/libvirt-lxc.c b/src/libvirt-lxc.c
index 8553570..16e08e9 100644
--- a/src/libvirt-lxc.c
+++ b/src/libvirt-lxc.c
@@ -36,6 +36,7 @@
#ifdef WITH_APPARMOR
# include <sys/apparmor.h>
#endif
+#include "vircgroup.h"
#define VIR_FROM_THIS VIR_FROM_NONE
@@ -269,3 +270,49 @@ virDomainLxcEnterSecurityLabel(virSecurityModelPtr model,
virDispatchError(NULL);
return -1;
}
+
+
+/**
+ * virDomainLxcEnterCGroup:
+ * @domain: a domain object
+ * @flags: currently unused, pass 0
+ *
+ * This API is LXC specific, so it will only work with hypervisor
+ * connections to the LXC driver.
+ *
+ * Attaches the process to the control cgroups associated
+ * with the container @domain.
+ *
+ * Returns 0 on success, -1 on error
+ */
+int virDomainLxcEnterCGroup(virDomainPtr domain,
+ unsigned int flags)
+{
+ virConnectPtr conn;
+ virCgroupPtr cgroup = NULL;
+
+ VIR_DOMAIN_DEBUG(domain, "flags=%x", flags);
+
+ virResetLastError();
+
+ virCheckDomainReturn(domain, -1);
+ conn = domain->conn;
+
+ virCheckReadOnlyGoto(conn->flags, error);
+ virCheckFlagsGoto(0, error);
+
+ if (virCgroupNewDetect(domain->id, -1, &cgroup) < 0)
virCgroupNewDetect takes a pid as parameter 1
ACK with that (your call on 1.3.4 or wait for 1.3.5 in which case the
next file would need adjustment)
John
+ goto error;
+
+ if (virCgroupAddTask(cgroup, getpid()) < 0)
+ goto error;
+
+ virCgroupFree(&cgroup);
+
+ return 0;
+
+ error:
+ virDispatchError(NULL);
+ virCgroupFree(&cgroup);
+ return -1;
+}
diff --git a/src/libvirt_lxc.syms b/src/libvirt_lxc.syms
index ccf1be9..061152a 100644
--- a/src/libvirt_lxc.syms
+++ b/src/libvirt_lxc.syms
@@ -20,3 +20,8 @@ LIBVIRT_LXC_1.0.4 {
global:
virDomainLxcEnterSecurityLabel;
} LIBVIRT_LXC_1.0.2;
+
+LIBVIRT_LXC_1.3.4 {
+ global:
+ virDomainLxcEnterCGroup;
+} LIBVIRT_LXC_1.0.4;