From 4acdb46ff17a3dd966ddccdc149cda5a18d51a48 Mon Sep 17 00:00:00 2001 From: Denis Vlasenko Date: Sat, 31 Jan 2009 21:45:57 +0000 Subject: ionice: new applet, adapted from Linux kernel' example by Walter Harms text data bss dec hex filename 1050316 924 10952 1062192 103530 busybox_old 1050758 924 10952 1062634 1036ea busybox_unstripped --- miscutils/Config.in | 7 ++++ miscutils/Kbuild | 1 + miscutils/ionice.c | 99 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 107 insertions(+) create mode 100644 miscutils/ionice.c (limited to 'miscutils') diff --git a/miscutils/Config.in b/miscutils/Config.in index 68732e682..94174de3e 100644 --- a/miscutils/Config.in +++ b/miscutils/Config.in @@ -238,6 +238,13 @@ config FBSPLASH "NN" (ASCII decimal number) - percentage to show on progress bar "exit" - well you guessed it +config IONICE + bool "ionice" + default n + help + Set/set program io scheduling class and priority + Requires kernel >= 2.6.13 + config INOTIFYD bool "inotifyd" default n diff --git a/miscutils/Kbuild b/miscutils/Kbuild index e6e434755..7665130e5 100644 --- a/miscutils/Kbuild +++ b/miscutils/Kbuild @@ -16,6 +16,7 @@ lib-$(CONFIG_DEVFSD) += devfsd.o lib-$(CONFIG_DEVMEM) += devmem.o lib-$(CONFIG_EJECT) += eject.o lib-$(CONFIG_FBSPLASH) += fbsplash.o +lib-$(CONFIG_IONICE) += ionice.o lib-$(CONFIG_HDPARM) += hdparm.o lib-$(CONFIG_INOTIFYD) += inotifyd.o lib-$(CONFIG_FEATURE_LAST_SMALL)+= last.o diff --git a/miscutils/ionice.c b/miscutils/ionice.c new file mode 100644 index 000000000..88d771c30 --- /dev/null +++ b/miscutils/ionice.c @@ -0,0 +1,99 @@ +/* vi: set sw=4 ts=4: */ +/* + * ionice implementation for busybox based on linux-utils-ng 2.14 + * + * Copyright (C) 2008 by + * + * Licensed under GPLv2 or later, see file LICENSE in this tarball for details. + */ + +#include +#include +#include "libbb.h" + +static int ioprio_set(int which, int who, int ioprio) +{ + return syscall(SYS_ioprio_set, which, who, ioprio); +} + +static int ioprio_get(int which, int who) +{ + return syscall(SYS_ioprio_get, which, who); +} + +enum { + IOPRIO_WHO_PROCESS = 1, + IOPRIO_WHO_PGRP, + IOPRIO_WHO_USER +}; + +enum { + IOPRIO_CLASS_NONE, + IOPRIO_CLASS_RT, + IOPRIO_CLASS_BE, + IOPRIO_CLASS_IDLE +}; + +static const char to_prio[] = "none\0realtime\0best-effort\0idle"; + +#define IOPRIO_CLASS_SHIFT 13 + +int ionice_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE; +int ionice_main(int argc UNUSED_PARAM, char **argv) +{ + /* Defaults */ + int ioclass = 0; + int pri = 0; + int pid = 0; /* affect own porcess */ + int opt; + enum { + OPT_n = 1, + OPT_c = 2, + OPT_p = 4, + }; + + /* Numeric params */ + opt_complementary = "n+:c+:p+"; + /* '+': stop at first non-option */ + opt = getopt32(argv, "+n:c:p:", &pri, &ioclass, &pid); + argv += optind; + + if (opt & OPT_c) { + if (ioclass > 3) + bb_error_msg_and_die("bad class %d", ioclass); +// Do we need this (compat?)? +// if (ioclass == IOPRIO_CLASS_NONE) +// ioclass = IOPRIO_CLASS_BE; +// if (ioclass == IOPRIO_CLASS_IDLE) { +// //if (opt & OPT_n) +// // bb_error_msg("ignoring priority for idle class"); +// pri = 7; +// } + } + + if (!(opt & (OPT_n|OPT_c))) { + if (!(opt & OPT_p) && *argv) + pid = xatoi_u(*argv); + + pri = ioprio_get(IOPRIO_WHO_PROCESS, pid); + if (pri == -1) + bb_perror_msg_and_die("ioprio_%cet", 'g'); + + ioclass = (pri >> IOPRIO_CLASS_SHIFT) & 0x3; + pri &= 0xff; + printf((ioclass == IOPRIO_CLASS_IDLE) ? "%s\n" : "%s: prio %d\n", + nth_string(to_prio, ioclass), pri); + } else { +//printf("pri=%d class=%d val=%x\n", +//pri, ioclass, pri | (ioclass << IOPRIO_CLASS_SHIFT)); + pri |= (ioclass << IOPRIO_CLASS_SHIFT); + if (ioprio_set(IOPRIO_WHO_PROCESS, pid, pri) == -1) + bb_perror_msg_and_die("ioprio_%cet", 's'); + if (*argv) { + BB_EXECVP(*argv, argv); + bb_simple_perror_msg_and_die(*argv); + } + } + + return EXIT_SUCCESS; +} -- cgit v1.2.3