Sophie

Sophie

distrib > Fedora > 17 > i386 > media > updates-src > by-pkgid > ab4b662b9827b6375ffd451bf4abd615 > files > 372

systemd-44-24.fc17.src.rpm

From a4522a3ae38e24e177db98aa8e262cdf54d42646 Mon Sep 17 00:00:00 2001
From: Lennart Poettering <lennart@poettering.net>
Date: Thu, 31 May 2012 04:36:08 +0200
Subject: [PATCH] main: allow setting of timer slack for PID 1 (cherry picked
 from commit aa0f64ac851ebf27342d66947b5170bfeb9f49ae)

---
 man/systemd.conf.xml |   24 ++++++++++++++++++++++++
 src/core/main.c      |    6 ++++++
 src/core/system.conf |    1 +
 3 files changed, 31 insertions(+)

diff --git a/man/systemd.conf.xml b/man/systemd.conf.xml
index 8e288eb..db35519 100644
--- a/man/systemd.conf.xml
+++ b/man/systemd.conf.xml
@@ -228,6 +228,30 @@
                         </varlistentry>
 
                         <varlistentry>
+                                <term><varname>TimerSlackNSec=</varname></term>
+
+                                <listitem><para>Sets the timer slack
+                                in nanoseconds for PID 1 which is then
+                                inherited to all executed processes,
+                                unless overriden individually, for
+                                example with the
+                                <varname>TimerSlackNSec=</varname>
+                                setting in service units (for details
+                                see
+                                <citerefentry><refentrytitle>systemd.exec</refentrytitle><manvolnum>5</manvolnum></citerefentry>). The
+                                timer slack controls the accuracy of
+                                wake-ups triggered by timers. See
+                                <citerefentry><refentrytitle>prctl</refentrytitle><manvolnum>2</manvolnum></citerefentry>
+                                for more information. Note that in
+                                contrast to most other time span
+                                definitions this parameter takes an
+                                integer value in nano-seconds if no
+                                unit is specified. The usual time
+                                units are understood
+                                too.</para></listitem>
+                        </varlistentry>
+
+                        <varlistentry>
                                 <term><varname>DefaultLimitCPU=</varname></term>
                                 <term><varname>DefaultLimitFSIZE=</varname></term>
                                 <term><varname>DefaultLimitDATA=</varname></term>
diff --git a/src/core/main.c b/src/core/main.c
index ccf993d..2e79ca5 100644
--- a/src/core/main.c
+++ b/src/core/main.c
@@ -92,6 +92,7 @@ static usec_t arg_runtime_watchdog = 0;
 static usec_t arg_shutdown_watchdog = 10 * USEC_PER_MINUTE;
 static struct rlimit *arg_default_rlimit[RLIMIT_NLIMITS] = {};
 static uint64_t arg_capability_bounding_set_drop = 0;
+static nsec_t arg_timer_slack_nsec = (nsec_t) -1;
 
 static FILE* serialization = NULL;
 
@@ -685,6 +686,7 @@ static int parse_config_file(void) {
                 { "Manager", "RuntimeWatchdogSec",    config_parse_usec,         0, &arg_runtime_watchdog    },
                 { "Manager", "ShutdownWatchdogSec",   config_parse_usec,         0, &arg_shutdown_watchdog   },
                 { "Manager", "CapabilityBoundingSet", config_parse_bounding_set, 0, &arg_capability_bounding_set_drop },
+                { "Manager", "TimerSlackNSec",        config_parse_nsec,         0, &arg_timer_slack_nsec    },
                 { "Manager", "DefaultLimitCPU",       config_parse_limit,        0, &arg_default_rlimit[RLIMIT_CPU]},
                 { "Manager", "DefaultLimitFSIZE",     config_parse_limit,        0, &arg_default_rlimit[RLIMIT_FSIZE]},
                 { "Manager", "DefaultLimitDATA",      config_parse_limit,        0, &arg_default_rlimit[RLIMIT_DATA]},
@@ -1491,6 +1493,10 @@ int main(int argc, char *argv[]) {
         if (arg_running_as == MANAGER_SYSTEM && arg_runtime_watchdog > 0)
                 watchdog_set_timeout(&arg_runtime_watchdog);
 
+        if (arg_timer_slack_nsec != (nsec_t) -1)
+                if (prctl(PR_SET_TIMERSLACK, arg_timer_slack_nsec) < 0)
+                        log_error("Failed to adjust timer slack: %m");
+
         if (arg_capability_bounding_set_drop) {
                 r = capability_bounding_set_drop(arg_capability_bounding_set_drop, true);
                 if (r < 0) {
diff --git a/src/core/system.conf b/src/core/system.conf
index e50ee3c..df0465e 100644
--- a/src/core/system.conf
+++ b/src/core/system.conf
@@ -27,6 +27,7 @@
 #RuntimeWatchdogSec=0
 #ShutdownWatchdogSec=10min
 #CapabilityBoundingSet=
+#TimerSlackNSec=
 #DefaultLimitCPU=
 #DefaultLimitFSIZE=
 #DefaultLimitDATA=