[Pkg-libvirt-commits] [libvirt] 02/03: lxc: ensure libvirt_lxc and qemu-nbd move into systemd machine slice
Guido Guenther
agx at moszumanska.debian.org
Mon Jan 9 20:06:05 UTC 2017
This is an automated email from the git hooks/post-receive script.
agx pushed a commit to branch debian/sid
in repository libvirt.
commit 5be8cad5d78658f73d61cdb1b5df2713e93244da
Author: Guido Günther <agx at sigxcpu.org>
Date: Mon Jan 9 21:05:39 2017 +0100
lxc: ensure libvirt_lxc and qemu-nbd move into systemd machine slice
Closes: #848317
---
...rt_lxc-and-qemu-nbd-move-into-systemd-mac.patch | 155 +++++++++++++++++++++
debian/patches/series | 1 +
2 files changed, 156 insertions(+)
diff --git a/debian/patches/lxc-ensure-libvirt_lxc-and-qemu-nbd-move-into-systemd-mac.patch b/debian/patches/lxc-ensure-libvirt_lxc-and-qemu-nbd-move-into-systemd-mac.patch
new file mode 100644
index 0000000..ee3a634
--- /dev/null
+++ b/debian/patches/lxc-ensure-libvirt_lxc-and-qemu-nbd-move-into-systemd-mac.patch
@@ -0,0 +1,155 @@
+From: "Daniel P. Berrange" <berrange at redhat.com>
+Date: Thu, 5 Jan 2017 15:30:56 +0000
+Subject: lxc: ensure libvirt_lxc and qemu-nbd move into systemd machine slice
+MIME-Version: 1.0
+Content-Type: text/plain; charset="utf-8"
+Content-Transfer-Encoding: 8bit
+
+Currently when spawning containers with systemd, the container PID 1
+will get moved into the systemd machine slice. Libvirt then manually
+moves the libvirt_lxc and qemu-nbd processes into the cgroups associated
+with the slice, but skips the systemd controller cgroup. This means that
+from systemd's POV, libvirt_lxc and qemu-nbd are still part of the
+libvirtd.service unit.
+
+On systemctl daemon-reload, it will notice that libvirt_lxc & qemu-nbd
+are in the libvirtd.service unit for the systemd controller, but in the
+machine cgroups for resources. Systemd will thus move them back into
+the libvirtd.service resource cgroups next time libvirtd is restarted.
+This causes libvirtd to kill off the container due to incorrect cgroup
+placement.
+
+The solution is to ensure that when moving libvirt_lxc & qemu-nbd, we
+also move the systemd cgroup controller placement. Normally this is
+not something we ever want todo, but this is a special case as we are
+intentionally wanting to move them to a different systemd unit.
+
+Signed-off-by: Daniel P. Berrange <berrange at redhat.com>
+Signed-off-by: Guido Günther <agx at sigxcpu.org>
+---
+ src/libvirt_private.syms | 1 +
+ src/lxc/lxc_controller.c | 4 ++--
+ src/util/vircgroup.c | 52 +++++++++++++++++++++++++++++++++++++-----------
+ src/util/vircgroup.h | 1 +
+ 4 files changed, 44 insertions(+), 14 deletions(-)
+
+diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms
+index 43220e0..9aae1c1 100644
+--- a/src/libvirt_private.syms
++++ b/src/libvirt_private.syms
+@@ -1286,6 +1286,7 @@ virBufferVasprintf;
+
+
+ # util/vircgroup.h
++virCgroupAddMachineTask;
+ virCgroupAddTask;
+ virCgroupAddTaskController;
+ virCgroupAllowAllDevices;
+diff --git a/src/lxc/lxc_controller.c b/src/lxc/lxc_controller.c
+index 508bc3e..9880741 100644
+--- a/src/lxc/lxc_controller.c
++++ b/src/lxc/lxc_controller.c
+@@ -869,12 +869,12 @@ static int virLXCControllerSetupCgroupLimits(virLXCControllerPtr ctrl)
+ ctrl->nicindexes)))
+ goto cleanup;
+
+- if (virCgroupAddTask(ctrl->cgroup, getpid()) < 0)
++ if (virCgroupAddMachineTask(ctrl->cgroup, getpid()) < 0)
+ goto cleanup;
+
+ /* Add all qemu-nbd tasks to the cgroup */
+ for (i = 0; i < ctrl->nnbdpids; i++) {
+- if (virCgroupAddTask(ctrl->cgroup, ctrl->nbdpids[i]) < 0)
++ if (virCgroupAddMachineTask(ctrl->cgroup, ctrl->nbdpids[i]) < 0)
+ goto cleanup;
+ }
+
+diff --git a/src/util/vircgroup.c b/src/util/vircgroup.c
+index f151193..2d53a89 100644
+--- a/src/util/vircgroup.c
++++ b/src/util/vircgroup.c
+@@ -1178,16 +1178,8 @@ virCgroupNew(pid_t pid,
+ }
+
+
+-/**
+- * virCgroupAddTask:
+- *
+- * @group: The cgroup to add a task to
+- * @pid: The pid of the task to add
+- *
+- * Returns: 0 on success, -1 on error
+- */
+-int
+-virCgroupAddTask(virCgroupPtr group, pid_t pid)
++static int
++virCgroupAddTaskInternal(virCgroupPtr group, pid_t pid, bool withSystemd)
+ {
+ int ret = -1;
+ size_t i;
+@@ -1197,8 +1189,10 @@ virCgroupAddTask(virCgroupPtr group, pid_t pid)
+ if (!group->controllers[i].mountPoint)
+ continue;
+
+- /* We must never add tasks in systemd's hierarchy */
+- if (i == VIR_CGROUP_CONTROLLER_SYSTEMD)
++ /* We must never add tasks in systemd's hierarchy
++ * unless we're intentionally trying to move a
++ * task into a systemd machine scope */
++ if (i == VIR_CGROUP_CONTROLLER_SYSTEMD && !withSystemd)
+ continue;
+
+ if (virCgroupAddTaskController(group, pid, i) < 0)
+@@ -1210,6 +1204,40 @@ virCgroupAddTask(virCgroupPtr group, pid_t pid)
+ return ret;
+ }
+
++/**
++ * virCgroupAddTask:
++ *
++ * @group: The cgroup to add a task to
++ * @pid: The pid of the task to add
++ *
++ * Will add the task to all controllers, except the
++ * systemd unit controller.
++ *
++ * Returns: 0 on success, -1 on error
++ */
++int
++virCgroupAddTask(virCgroupPtr group, pid_t pid)
++{
++ return virCgroupAddTaskInternal(group, pid, false);
++}
++
++/**
++ * virCgroupAddMachineTask:
++ *
++ * @group: The cgroup to add a task to
++ * @pid: The pid of the task to add
++ *
++ * Will add the task to all controllers, including the
++ * systemd unit controller.
++ *
++ * Returns: 0 on success, -1 on error
++ */
++int
++virCgroupAddMachineTask(virCgroupPtr group, pid_t pid)
++{
++ return virCgroupAddTaskInternal(group, pid, true);
++}
++
+
+ /**
+ * virCgroupAddTaskController:
+diff --git a/src/util/vircgroup.h b/src/util/vircgroup.h
+index 4b8f3ff..2de1bf2 100644
+--- a/src/util/vircgroup.h
++++ b/src/util/vircgroup.h
+@@ -131,6 +131,7 @@ int virCgroupPathOfController(virCgroupPtr group,
+ char **path);
+
+ int virCgroupAddTask(virCgroupPtr group, pid_t pid);
++int virCgroupAddMachineTask(virCgroupPtr group, pid_t pid);
+
+ int virCgroupAddTaskController(virCgroupPtr group,
+ pid_t pid,
diff --git a/debian/patches/series b/debian/patches/series
index 3d19e77..40e0bc8 100644
--- a/debian/patches/series
+++ b/debian/patches/series
@@ -17,3 +17,4 @@ Set-defaults-for-zfs-tools.patch
Pass-GPG_TTY-env-var-to-the-ssh-binary.patch
AppArmor-policy-support-merged-usr.patch
apparmor-pass-attach_disconnected.patch
+lxc-ensure-libvirt_lxc-and-qemu-nbd-move-into-systemd-mac.patch
--
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-libvirt/libvirt.git
More information about the Pkg-libvirt-commits
mailing list