diff --git a/uvrrpd.c b/uvrrpd.c index 7136fd8..4b1b0e5 100644 --- a/uvrrpd.c +++ b/uvrrpd.c @@ -25,6 +25,11 @@ #include #include #include +#ifdef _POSIX_PRIORITY_SCHEDULING + #include +#else + #warning "no sched rt" +#endif #include "uvrrpd.h" #include "vrrp.h" @@ -128,6 +133,8 @@ int main(int argc, char *argv[]) /* lock procress's virtual address space into RAM */ mlockall(MCL_CURRENT | MCL_FUTURE); + /* set SCHED_RR */ + uvrrpd_sched_set(); /* process */ set_bit(KEEP_GOING, ®); @@ -412,3 +419,40 @@ static void ctrlfile(int vrid, int *fd) exit(EXIT_FAILURE); } } + +/** + * uvrrpd_sched_set() - set SCHED_RR scheduler + */ +int uvrrpd_sched_set() +{ +#ifdef _POSIX_PRIORITY_SCHEDULING + struct sched_param param; + + param.sched_priority = sched_get_priority_max(SCHED_RR); + if (sched_setscheduler(0, SCHED_RR, ¶m) != 0) { + log_error("sched_setscheduler() - %m"); + return -1; + } +#else + nice(-20); +#endif + + return 0; +} + +/** + * uvrrpd_sched_unset() - unset SCHED_RR scheduler + */ +int uvrrpd_sched_unset() +{ +#ifdef _POSIX_PRIORITY_SCHEDULING + struct sched_param param; + + param.sched_priority = sched_get_priority_max(SCHED_OTHER); + if (sched_setscheduler(0, SCHED_OTHER, ¶m) != 0) { + log_error("sched_setscheduler() - %m"); + return -1; + } +#endif + return 0; +} diff --git a/uvrrpd.h b/uvrrpd.h index 42874df..6f2cde7 100644 --- a/uvrrpd.h +++ b/uvrrpd.h @@ -42,4 +42,7 @@ enum uvrrpd_control { UVRRPD_RELOAD = BIT_MASK(3), }; +int uvrrpd_sched_set(void); +int uvrrpd_sched_unset(void); + #endif /* _UVRRPD_ */ diff --git a/vrrp_exec.c b/vrrp_exec.c index 656fb41..669f1aa 100644 --- a/vrrp_exec.c +++ b/vrrp_exec.c @@ -31,6 +31,7 @@ #include "vrrp.h" #include "vrrp_exec.h" +#include "uvrrpd.h" #include "common.h" #include "log.h" @@ -137,6 +138,7 @@ int vrrp_exec(struct vrrp *vrrp, const struct vrrp_net *vnet, vrrp_state state) sigaction(SIGQUIT, &sa_ignore, &sa_origquit); /* fork */ + uvrrpd_sched_unset(); /* remove SCHED_RR */ pid_t child = fork(); int status, savedErrno; @@ -167,7 +169,8 @@ int vrrp_exec(struct vrrp *vrrp, const struct vrrp_net *vnet, vrrp_state state) /* parent */ if (child > 0) { - + + uvrrpd_sched_set(); /* restore SCHED_RR */ while (waitpid(child, &status, 0) == -1) { if (errno != EINTR) { /* Error other than EINTR */ log_error("vrid %d :: waitpid - %m", vrrp->vrid);