activation: set children oom_score_adj to 0
authorWaLyong Cho <walyong.cho@samsung.com>
Tue, 7 Jun 2016 14:26:42 +0000 (23:26 +0900)
committerSimon McVittie <simon.mcvittie@collabora.co.uk>
Thu, 30 Jun 2016 12:54:10 +0000 (13:54 +0100)
If dbus is running as systemd service, dbus daemon is running with
oom_score_adj -900 by OOMScoreAdjust=-900. And children will also have
same value with dbus daemon.
To avoid this, set the child itself values after fork () to 0.

Bug: https://bugs.freedesktop.org/show_bug.cgi?id=32851
Reviewed-by: Simon McVittie <simon.mcvittie@collabora.co.uk>
dbus/dbus-spawn.c

index ddd254d..45f3d87 100644 (file)
@@ -1354,6 +1354,26 @@ _dbus_spawn_async_with_babysitter (DBusBabysitter          **sitter_p,
        }
       else if (grandchild_pid == 0)
       {
+#ifdef __linux__
+          int fd = -1;
+
+#ifdef O_CLOEXEC
+          fd = open ("/proc/self/oom_score_adj", O_WRONLY | O_CLOEXEC);
+#endif
+
+          if (fd < 0)
+            {
+              fd = open ("/proc/self/oom_score_adj", O_WRONLY);
+              _dbus_fd_set_close_on_exec (fd);
+            }
+
+          if (fd >= 0)
+            {
+              if (write (fd, "0", sizeof (char)) < 0)
+                _dbus_warn ("writing oom_score_adj error: %s\n", strerror (errno));
+              _dbus_close (fd, NULL);
+            }
+#endif
           /* Go back to ignoring SIGPIPE, since it's evil
            */
           signal (SIGPIPE, SIG_IGN);