diff options
author | Daniel Borkmann <dborkman@redhat.com> | 2013-06-03 23:36:14 +0200 |
---|---|---|
committer | Daniel Borkmann <dborkman@redhat.com> | 2013-06-03 23:37:11 +0200 |
commit | 8bb67e4e60d1c0d9fba66c1b28e62e4d92d8d4ce (patch) | |
tree | 7237b73c834ed7d27dec252253e44856e5b615cf /iosched.c | |
parent | 3e071a78f2a5c7424340b4c8b446d51e82413c13 (diff) |
iosched: break out io scheduling functions from xutils
Break this stuff out, for better maintainability and readability.
Signed-off-by: Daniel Borkmann <dborkman@redhat.com>
Diffstat (limited to 'iosched.c')
-rw-r--r-- | iosched.c | 76 |
1 files changed, 76 insertions, 0 deletions
diff --git a/iosched.c b/iosched.c new file mode 100644 index 0000000..7417973 --- /dev/null +++ b/iosched.c @@ -0,0 +1,76 @@ +/* + * netsniff-ng - the packet sniffing beast + * Copyright 2009, 2010 Daniel Borkmann. + * Copyright 2010 Marek Polacek. + * Subject to the GPL, version 2. + */ + +#include <sys/syscall.h> + +#include "iosched.h" +#include "die.h" + +#define IOPRIO_CLASS_SHIFT 13 + +enum { + ioprio_class_none, + ioprio_class_rt, + ioprio_class_be, + ioprio_class_idle, +}; + +enum { + ioprio_who_process = 1, + ioprio_who_pgrp, + ioprio_who_user, +}; + +static const char *const to_prio[] = { + "none", + "realtime", + "best-effort", + "idle", +}; + +static inline int ioprio_set(int which, int who, int ioprio) +{ + return syscall(SYS_ioprio_set, which, who, ioprio); +} + +static inline int ioprio_get(int which, int who) +{ + return syscall(SYS_ioprio_get, which, who); +} + +static void ioprio_setpid(pid_t pid, int ioprio, int ioclass) +{ + int ret = ioprio_set(ioprio_who_process, pid, + ioprio | ioclass << IOPRIO_CLASS_SHIFT); + if (ret < 0) + panic("Failed to set io prio for pid!\n"); +} + +void ioprio_print(void) +{ + int ioprio = ioprio_get(ioprio_who_process, getpid()); + if (ioprio < 0) + panic("Failed to fetch io prio for pid!\n"); + else { + int ioclass = ioprio >> IOPRIO_CLASS_SHIFT; + if (ioclass != ioprio_class_idle) { + ioprio &= 0xff; + printf("%s: prio %d\n", to_prio[ioclass], ioprio); + } else + printf("%s\n", to_prio[ioclass]); + } +} + +void set_ioprio_rt(void) +{ + ioprio_setpid(getpid(), 4, ioprio_class_rt); +} + +void set_ioprio_be(void) +{ + ioprio_setpid(getpid(), 4, ioprio_class_be); +} |