From 0b65b09f15783b067343f7a2dcf67ae1f1e27dc7 Mon Sep 17 00:00:00 2001 From: Daniel Borkmann Date: Tue, 4 Jun 2013 11:02:20 +0200 Subject: proc: move out process specific management functions Move them out of xutils, so that we can maintain them separately. Also simplify things a bit. Signed-off-by: Daniel Borkmann --- netsniff-ng.c | 5 ++-- netsniff-ng/Makefile | 1 + proc.c | 66 ++++++++++++++++++++++++++++++++++++++++++++++++ proc.h | 8 ++++++ trafgen.c | 1 + trafgen/Makefile | 1 + xutils.c | 71 ---------------------------------------------------- xutils.h | 6 ----- 8 files changed, 80 insertions(+), 79 deletions(-) create mode 100644 proc.c create mode 100644 proc.h diff --git a/netsniff-ng.c b/netsniff-ng.c index f20ebe0..234d781 100644 --- a/netsniff-ng.c +++ b/netsniff-ng.c @@ -31,6 +31,7 @@ #include "built_in.h" #include "pcap_io.h" #include "privs.h" +#include "proc.h" #include "bpf.h" #include "ioops.h" #include "die.h" @@ -1354,8 +1355,8 @@ int main(int argc, char **argv) tprintf_init(); if (prio_high) { - set_proc_prio(get_default_proc_prio()); - set_sched_status(get_default_sched_policy(), get_default_sched_prio()); + set_proc_prio(-20); + set_sched_status(SCHED_FIFO, sched_get_priority_max(SCHED_FIFO)); } if (ctx.device_in && (device_mtu(ctx.device_in) || diff --git a/netsniff-ng/Makefile b/netsniff-ng/Makefile index 23d7b5d..104a42f 100644 --- a/netsniff-ng/Makefile +++ b/netsniff-ng/Makefile @@ -34,6 +34,7 @@ netsniff-ng-objs = dissector.o \ proto_80211_mac_hdr.o \ promisc.o \ privs.o \ + proc.o \ dev.o \ str.o \ irq.o \ diff --git a/proc.c b/proc.c new file mode 100644 index 0000000..39d661e --- /dev/null +++ b/proc.c @@ -0,0 +1,66 @@ +#define _GNU_SOURCE +#include +#include +#include +#include +#include +#include + +#include "proc.h" +#include "die.h" + +void cpu_affinity(int cpu) +{ + int ret; + cpu_set_t cpu_bitmask; + + CPU_ZERO(&cpu_bitmask); + CPU_SET(cpu, &cpu_bitmask); + + ret = sched_setaffinity(getpid(), sizeof(cpu_bitmask), + &cpu_bitmask); + if (ret) + panic("Can't set this cpu affinity!\n"); +} + +int set_proc_prio(int priority) +{ + int ret = setpriority(PRIO_PROCESS, getpid(), priority); + if (ret) + panic("Can't set nice val to %i!\n", priority); + + return 0; +} + +int set_sched_status(int policy, int priority) +{ + int ret, min_prio, max_prio; + struct sched_param sp; + + max_prio = sched_get_priority_max(policy); + min_prio = sched_get_priority_min(policy); + + if (max_prio == -1 || min_prio == -1) + printf("Cannot determine scheduler prio limits!\n"); + else if (priority < min_prio) + priority = min_prio; + else if (priority > max_prio) + priority = max_prio; + + memset(&sp, 0, sizeof(sp)); + sp.sched_priority = priority; + + ret = sched_setscheduler(getpid(), policy, &sp); + if (ret) { + printf("Cannot set scheduler policy!\n"); + return -EINVAL; + } + + ret = sched_setparam(getpid(), &sp); + if (ret) { + printf("Cannot set scheduler prio!\n"); + return -EINVAL; + } + + return 0; +} diff --git a/proc.h b/proc.h new file mode 100644 index 0000000..0a31f36 --- /dev/null +++ b/proc.h @@ -0,0 +1,8 @@ +#ifndef PROC_H +#define PROC_H + +extern void cpu_affinity(int cpu); +extern int set_proc_prio(int prio); +extern int set_sched_status(int policy, int priority); + +#endif /* PROC_H */ diff --git a/trafgen.c b/trafgen.c index 628e3be..e725af8 100644 --- a/trafgen.c +++ b/trafgen.c @@ -38,6 +38,7 @@ #include "cpus.h" #include "lockme.h" #include "privs.h" +#include "proc.h" #include "mac80211.h" #include "xutils.h" #include "ioops.h" diff --git a/trafgen/Makefile b/trafgen/Makefile index 2df9dbf..c6e8591 100644 --- a/trafgen/Makefile +++ b/trafgen/Makefile @@ -6,6 +6,7 @@ trafgen-objs = xmalloc.o \ ioops.o \ xutils.o \ privs.o \ + proc.o \ dev.o \ irq.o \ str.o \ diff --git a/xutils.c b/xutils.c index b1f73a4..e07ce9e 100644 --- a/xutils.c +++ b/xutils.c @@ -405,77 +405,6 @@ void register_signal_f(int signal, void (*handler)(int), int flags) sigaction(signal, &saction, NULL); } -void cpu_affinity(int cpu) -{ - int ret; - cpu_set_t cpu_bitmask; - - CPU_ZERO(&cpu_bitmask); - CPU_SET(cpu, &cpu_bitmask); - - ret = sched_setaffinity(getpid(), sizeof(cpu_bitmask), - &cpu_bitmask); - if (ret) - panic("Can't set this cpu affinity!\n"); -} - -int set_proc_prio(int priority) -{ - int ret = setpriority(PRIO_PROCESS, getpid(), priority); - if (ret) - panic("Can't set nice val to %i!\n", priority); - - return 0; -} - -int set_sched_status(int policy, int priority) -{ - int ret, min_prio, max_prio; - struct sched_param sp; - - max_prio = sched_get_priority_max(policy); - min_prio = sched_get_priority_min(policy); - - if (max_prio == -1 || min_prio == -1) - printf("Cannot determine scheduler prio limits!\n"); - else if (priority < min_prio) - priority = min_prio; - else if (priority > max_prio) - priority = max_prio; - - memset(&sp, 0, sizeof(sp)); - sp.sched_priority = priority; - - ret = sched_setscheduler(getpid(), policy, &sp); - if (ret) { - printf("Cannot set scheduler policy!\n"); - return -EINVAL; - } - - ret = sched_setparam(getpid(), &sp); - if (ret) { - printf("Cannot set scheduler prio!\n"); - return -EINVAL; - } - - return 0; -} - -int get_default_sched_policy(void) -{ - return SCHED_FIFO; -} - -int get_default_sched_prio(void) -{ - return sched_get_priority_max(get_default_sched_policy()); -} - -int get_default_proc_prio(void) -{ - return -20; -} - void set_system_socket_memory(int *vals, size_t len) { bug_on(len != 4); diff --git a/xutils.h b/xutils.h index 53bdca3..83d710a 100644 --- a/xutils.h +++ b/xutils.h @@ -47,12 +47,6 @@ extern void register_signal(int signal, void (*handler)(int)); extern void register_signal_f(int signal, void (*handler)(int), int flags); extern void set_epoll_descriptor(int fd_epoll, int action, int fd_toadd, int events); extern int set_epoll_descriptor2(int fd_epoll, int action, int fd_toadd, int events); -extern void cpu_affinity(int cpu); -extern int set_proc_prio(int prio); -extern int set_sched_status(int policy, int priority); -extern int get_default_sched_policy(void); -extern int get_default_sched_prio(void); -extern int get_default_proc_prio(void); extern void set_system_socket_memory(int *vals, size_t len); extern void reset_system_socket_memory(int *vals, size_t len); extern void set_itimer_interval_value(struct itimerval *itimer, unsigned long sec, -- cgit v1.2.3-54-g00ecf