[pve-devel] [PATCH v2 kvm] add -wait-for-cgroup option to deal with systemd-run race
Wolfgang Bumiller
w.bumiller at proxmox.com
Wed Jun 1 12:19:42 CEST 2016
---
Changes since v2:
removed leftovers from old patch
fixed the option documentation (also a leftover from an patch)
...r-cgroup-option-to-deal-with-systemd-run-.patch | 145 +++++++++++++++++++++
debian/patches/series | 1 +
2 files changed, 146 insertions(+)
create mode 100644 debian/patches/pve/0046-add-wait-for-cgroup-option-to-deal-with-systemd-run-.patch
diff --git a/debian/patches/pve/0046-add-wait-for-cgroup-option-to-deal-with-systemd-run-.patch b/debian/patches/pve/0046-add-wait-for-cgroup-option-to-deal-with-systemd-run-.patch
new file mode 100644
index 0000000..03a2f1c
--- /dev/null
+++ b/debian/patches/pve/0046-add-wait-for-cgroup-option-to-deal-with-systemd-run-.patch
@@ -0,0 +1,145 @@
+From b5eceb21c4f82187a4e2cb1fb5146b5b6ecdb66a Mon Sep 17 00:00:00 2001
+From: Wolfgang Bumiller <w.bumiller at proxmox.com>
+Date: Tue, 31 May 2016 15:58:39 +0200
+Subject: [PATCH] add -wait-for-cgroup option to deal with systemd-run race
+
+---
+ os-posix.c | 92 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+ qemu-options.hx | 2 ++
+ 2 files changed, 94 insertions(+)
+
+diff --git a/os-posix.c b/os-posix.c
+index e4da406..5bc1cbc 100644
+--- a/os-posix.c
++++ b/os-posix.c
+@@ -49,6 +49,7 @@ static struct passwd *user_pwd;
+ static const char *chroot_dir;
+ static int daemonize;
+ static int daemon_pipe;
++static GPtrArray *wait_cgroups;
+
+ void os_setup_early_signal_handling(void)
+ {
+@@ -156,6 +157,11 @@ void os_parse_cmd_args(int index, const char *optarg)
+ case QEMU_OPTION_daemonize:
+ daemonize = 1;
+ break;
++ case QEMU_OPTION_wait_for_cgroup:
++ if (!wait_cgroups)
++ wait_cgroups = g_ptr_array_new();
++ g_ptr_array_add(wait_cgroups, g_strdup(optarg));
++ break;
+ #if defined(CONFIG_LINUX)
+ case QEMU_OPTION_enablefips:
+ fips_set_state(true);
+@@ -202,8 +208,94 @@ static void change_root(void)
+
+ }
+
++static bool wait_for_cgroup(char *cgroup)
++{
++ static bool unified = false;
++
++ bool found = false;
++ char *colon;
++ const char *type;
++ size_t type_len;
++ FILE *fh;
++ char *line = NULL;
++ size_t n = 0;
++ ssize_t linelen;
++
++ if (unified) {
++ fprintf(stderr, "Mixed cgroup v1 and v2 parameters\n");
++ exit(1);
++ }
++
++ colon = strchr(cgroup, ':');
++ if (!colon) {
++ unified = true;
++ type = "";
++ } else {
++ type = cgroup;
++ *colon = 0;
++ cgroup = colon+1;
++ }
++ type_len = strlen(type);
++
++ while (!found) {
++ fh = fopen("/proc/self/cgroup", "r");
++ if (!fh) {
++ perror("open(/proc/self/cgroup)");
++ exit(1);
++ }
++
++ while ((linelen = getline(&line, &n, fh)) != -1) {
++ line[linelen-1] = 0; /* cut newline */
++ if (strncmp(line, "0::", 3) == 0) {
++ /* This is a cgroup v2 file */
++ if (strcmp(line+3, cgroup) == 0) {
++ found = true;
++ }
++ /* cgroup v2 only has one line */
++ break;
++ } else {
++ colon = strchr(line, ':');
++ if (!colon) {
++ /* bad cgroup line */
++ continue;
++ }
++ colon += 1;
++ if (strncmp(colon, type, type_len) != 0 || colon[type_len] != ':') {
++ /* not the cgroup we're interested in */
++ continue;
++ }
++ if (strcmp(colon + type_len + 1, cgroup) == 0) {
++ found = true;
++ break;
++ }
++ }
++ }
++
++ fclose(fh);
++ free(line);
++ line = NULL;
++ if (!found) {
++ usleep(50000);
++ }
++ }
++
++ return found;
++}
++
+ void os_daemonize(void)
+ {
++ if (wait_cgroups) {
++ char **cgroups, **i;
++
++ g_ptr_array_add(wait_cgroups, NULL);
++ cgroups = (char**)g_ptr_array_free(wait_cgroups, FALSE);
++
++ for (i = cgroups; *i; ++i) {
++ wait_for_cgroup(*i);
++ }
++
++ g_strfreev(cgroups);
++ }
+ if (daemonize) {
+ pid_t pid;
+ int fds[2];
+diff --git a/qemu-options.hx b/qemu-options.hx
+index a9ecd76..fc71ee3 100644
+--- a/qemu-options.hx
++++ b/qemu-options.hx
+@@ -3119,6 +3119,8 @@ ETEXI
+ #ifndef _WIN32
+ DEF("daemonize", 0, QEMU_OPTION_daemonize, \
+ "-daemonize daemonize QEMU after initializing\n", QEMU_ARCH_ALL)
++DEF("wait-for-cgroup", HAS_ARG, QEMU_OPTION_wait_for_cgroup, \
++ "-wait-for-cgroup wait for a specific cgroup setting before daemonizing\n", QEMU_ARCH_ALL)
+ #endif
+ STEXI
+ @item -daemonize
+--
+2.1.4
+
diff --git a/debian/patches/series b/debian/patches/series
index 10e5d46..5184986 100644
--- a/debian/patches/series
+++ b/debian/patches/series
@@ -43,6 +43,7 @@ pve/0042-vma-writer-don-t-bail-out-on-zero-length-files.patch
pve/0043-vma-better-driver-guessing-for-bdrv_open.patch
pve/0044-block-add-zeroinit.patch
pve/0045-vma-add-format-option-to-device-mapping.patch
+pve/0046-add-wait-for-cgroup-option-to-deal-with-systemd-run-.patch
extra/0001-vnc-clear-vs-tlscreds-after-unparenting-it.patch
extra/CVE-2016-2198-ehci-null-pointer.patch
extra/CVE-2016-2391-usb-ohci-avoid-multiple-eof-timers.patch
--
2.1.4
More information about the pve-devel
mailing list