From 323c0a78c3a60430853bae516ace5c047b317b6a Mon Sep 17 00:00:00 2001 From: David Teigland Date: Feb 16 2011 22:17:51 +0000 Subject: wdmd: high priority options - set highest possible realtime priority - mlockall (TODO: -h 0 option to disable) --- diff --git a/src/main.c b/src/main.c index 49f2f02..3d49866 100644 --- a/src/main.c +++ b/src/main.c @@ -20,6 +20,7 @@ #include #include #include +#include #include #include #include diff --git a/wdmd/main.c b/wdmd/main.c index 1814418..f320317 100644 --- a/wdmd/main.c +++ b/wdmd/main.c @@ -21,11 +21,13 @@ #include #include #include +#include #include #include #include #include #include +#include #include #include @@ -34,9 +36,11 @@ #define DEFAULT_TEST_INTERVAL 10 #define DEFAULT_FIRE_TIMEOUT 60 +#define DEFAULT_HIGH_PRIORITY 1 static int test_interval = DEFAULT_TEST_INTERVAL; static int fire_timeout = DEFAULT_FIRE_TIMEOUT; +static int high_priority = DEFAULT_HIGH_PRIORITY; static int daemon_quit; static int daemon_debug; static time_t last_keepalive; @@ -796,6 +800,33 @@ static int lockfile(void) return -1; } +static void setup_priority(void) +{ + struct sched_param sched_param; + int rv; + + if (!high_priority) + return; + + rv = mlockall(MCL_CURRENT | MCL_FUTURE); + if (rv < 0) { + log_error("mlockall failed"); + } + + rv = sched_get_priority_max(SCHED_RR); + if (rv < 0) { + log_error("could not get max scheduler priority err %d", errno); + return; + } + + sched_param.sched_priority = rv; + rv = sched_setscheduler(0, SCHED_RR|SCHED_RESET_ON_FORK, &sched_param); + if (rv < 0) { + log_error("could not set RR|RESET_ON_FORK priority %d err %d", + sched_param.sched_priority, errno); + } +} + /* If wdmd exits abnormally, /dev/watchdog will eventually fire, and clients can detect wdmd is gone and begin to shut down cleanly ahead of the reset. But what if wdmd is restarted before the wd fires? It will begin petting @@ -808,6 +839,8 @@ int main(int argc, char *argv[]) { int rv; + /* TODO: real option parsing, including -h 0 */ + if (argc > 1 && !strcmp(argv[1], "-D")) daemon_debug = 1; @@ -821,6 +854,8 @@ int main(int argc, char *argv[]) openlog("wdmd", LOG_CONS | LOG_PID, LOG_DAEMON); + setup_priority(); + rv = lockfile(); if (rv < 0) goto out;