diff options
Diffstat (limited to 'miscutils')
| -rw-r--r-- | miscutils/Config.in | 7 | ||||
| -rw-r--r-- | miscutils/Kbuild | 1 | ||||
| -rw-r--r-- | miscutils/ionice.c | 99 | 
3 files changed, 107 insertions, 0 deletions
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  <u173034@informatik.uni-oldenburg.de> + * + * Licensed under GPLv2 or later, see file LICENSE in this tarball for details. + */ + +#include <sys/syscall.h> +#include <asm/unistd.h> +#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; +}  | 
