diff options
-rw-r--r-- | man/start-stop-daemon.8 | 6 | ||||
-rw-r--r-- | src/rc/start-stop-daemon.c | 36 |
2 files changed, 39 insertions, 3 deletions
diff --git a/man/start-stop-daemon.8 b/man/start-stop-daemon.8 index be511521..628807d2 100644 --- a/man/start-stop-daemon.8 +++ b/man/start-stop-daemon.8 @@ -22,7 +22,7 @@ .\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF .\" SUCH DAMAGE. .\" -.Dd October 14, 2009 +.Dd December 14, 2009 .Dt START-STOP-DAEMON 8 SMM .Os OpenRC .Sh NAME @@ -136,6 +136,10 @@ option. Only useful when used with daemons that run in the foreground and forced into the background with the .Fl -b , -background option. +.It Fl I , -ionice Ar class Ns Op : Ns Ar data +Modifies the IO scheduling priority of the daemon. +Class can be 0 for none, 1 for real time, 2 for best effort and 3 for idle. +Data can be from 0 to 7 inclusive. .It Fl N , -nice Ar level Modifies the scheduling priority of the daemon. .It Fl 1 , -stdout Ar logfile diff --git a/src/rc/start-stop-daemon.c b/src/rc/start-stop-daemon.c index 9f7af9b8..bd6c7bfe 100644 --- a/src/rc/start-stop-daemon.c +++ b/src/rc/start-stop-daemon.c @@ -47,6 +47,10 @@ #include <sys/time.h> #include <sys/wait.h> +#ifdef __linux__ +#include <sys/syscall.h> /* For io priority */ +#endif + #include <ctype.h> #include <errno.h> #include <fcntl.h> @@ -104,6 +108,13 @@ static char *changeuser, *ch_root, *ch_dir; extern char **environ; +#ifdef __linux__ +static inline int ioprio_set(int which, int who, int ioprio) +{ + return syscall(SYS_ioprio_set, which, who, ioprio); +} +#endif + static void free_schedulelist(void) { @@ -589,8 +600,9 @@ expand_home(const char *home, const char *path) } #include "_usage.h" -#define getoptstring "KN:PR:Sbc:d:e:g:ik:mn:op:s:tu:r:w:x:1:2:" getoptstring_COMMON +#define getoptstring "I:KN:PR:Sbc:d:e:g:ik:mn:op:s:tu:r:w:x:1:2:" getoptstring_COMMON static const struct option longopts[] = { + { "ionice", 1, NULL, 'I'}, { "stop", 0, NULL, 'K'}, { "nicelevel", 1, NULL, 'N'}, { "retry", 1, NULL, 'R'}, @@ -619,6 +631,7 @@ static const struct option longopts[] = { longopts_COMMON }; static const char * const longopts_help[] = { + "Set an ionice class:data when starting", "Stop daemon", "Set a nicelevel when starting", "Retry schedule to use when stopping", @@ -675,7 +688,7 @@ start_stop_daemon(int argc, char **argv) char *pidfile = NULL; char *retry = NULL; int sig = -1; - int nicelevel = 0; + int nicelevel = 0, ionicec = -1, ioniced = 0; bool background = false; bool makepidfile = false; bool interpreted = false; @@ -738,6 +751,17 @@ start_stop_daemon(int argc, char **argv) while ((opt = getopt_long(argc, argv, getoptstring, longopts, (int *) 0)) != -1) switch (opt) { + case 'I': /* --ionice */ + if (sscanf(optarg, "%d:%d", &ionicec, &ioniced) == 0) + eerrorx("%s: invalid ionice `%s'", + applet, optarg); + if (ionicec == 0) + ioniced = 0; + else if (ionicec == 3) + ioniced = 7; + ionicec <<= 13; /* class shift */ + break; + case 'K': /* --stop */ stop = true; break; @@ -1121,6 +1145,14 @@ start_stop_daemon(int argc, char **argv) strerror(errno)); } +/* Only linux suports setting an IO priority */ +#ifdef __linux__ + if (ionicec != -1 && + ioprio_set(1, mypid, ionicec | ioniced) == -1) + eerrorx("%s: ioprio_set %d %d: %s", applet, + ionicec, ioniced, strerror(errno)); +#endif + if (ch_root && chroot(ch_root) < 0) eerrorx("%s: chroot `%s': %s", applet, ch_root, strerror(errno)); |