Set SCHED_RR

This commit is contained in:
Arnaud ANDRE 2016-01-24 21:45:18 +01:00
parent 96a61cbac3
commit 53c9a57116
3 changed files with 51 additions and 1 deletions

View File

@ -25,6 +25,11 @@
#include <signal.h>
#include <sys/file.h>
#include <sys/mman.h>
#ifdef _POSIX_PRIORITY_SCHEDULING
#include <sched.h>
#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, &reg);
@ -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, &param) != 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, &param) != 0) {
log_error("sched_setscheduler() - %m");
return -1;
}
#endif
return 0;
}

View File

@ -42,4 +42,7 @@ enum uvrrpd_control {
UVRRPD_RELOAD = BIT_MASK(3),
};
int uvrrpd_sched_set(void);
int uvrrpd_sched_unset(void);
#endif /* _UVRRPD_ */

View File

@ -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);