Makes ionice -p usable like renice, this time backwards compatible Signed-off-by: Stephan Maka <stephan@xxxxxxxxxxxxx> --- schedutils/ionice.1 | 6 ++-- schedutils/ionice.c | 76 +++++++++++++++++++++++++++++++++++---------------- 2 files changed, 55 insertions(+), 27 deletions(-) diff --git a/schedutils/ionice.1 b/schedutils/ionice.1 index a434572..67fbc1d 100644 --- a/schedutils/ionice.1 +++ b/schedutils/ionice.1 @@ -41,7 +41,7 @@ The scheduling class data. This defines the class data, if the class accepts an argument. For real time and best-effort, \fI0-7\fR is valid data. .IP "\fB-p \fIpid\fP" -Pass in a process pid to change an already running process. If this argument +Pass in process PIDs to view or change already running processes. If this argument is not given, \fBionice\fP will run the listed program with the given parameters. .IP "\fB-t\fP" @@ -60,9 +60,9 @@ Sets process with PID 89 as an idle io process. .TP 7 Runs 'bash' as a best-effort program with highest priority. .TP 7 -# \fBionice\fP -p 89 +# \fBionice\fP -p 89 91 .TP 7 -Returns the class and priority of the process with PID 89. +Prints the class and priority of the processes with PID 89 and 91. .SH NOTES Linux supports io scheduling priorities and classes since 2.6.13 with the CFQ diff --git a/schedutils/ionice.c b/schedutils/ionice.c index 395509b..71cdec0 100644 --- a/schedutils/ionice.c +++ b/schedutils/ionice.c @@ -45,6 +45,23 @@ enum { const char *to_prio[] = { "none", "realtime", "best-effort", "idle", }; +static void ioprio_print(int pid) +{ + int ioprio, ioprio_class; + ioprio = ioprio_get(IOPRIO_WHO_PROCESS, pid); + + if (ioprio == -1) + err(EXIT_FAILURE, _("ioprio_get failed")); + else { + ioprio_class = ioprio >> IOPRIO_CLASS_SHIFT; + if (ioprio_class != IOPRIO_CLASS_IDLE) { + ioprio = ioprio & 0xff; + printf("%s: prio %d\n", to_prio[ioprio_class], ioprio); + } else + printf("%s\n", to_prio[ioprio_class]); + } +} + static void usage(int rc) { fprintf(stdout, _( @@ -109,32 +126,43 @@ int main(int argc, char *argv[]) } if (!set) { - if (!pid && argv[optind]) - pid = strtol(argv[optind], NULL, 10); + if (pid) + ioprio_print(pid); - ioprio = ioprio_get(IOPRIO_WHO_PROCESS, pid); - - if (ioprio == -1) - err(EXIT_FAILURE, _("ioprio_get failed")); - else { - ioprio_class = ioprio >> IOPRIO_CLASS_SHIFT; - if (ioprio_class != IOPRIO_CLASS_IDLE) { - ioprio = ioprio & 0xff; - printf("%s: prio %d\n", to_prio[ioprio_class], ioprio); - } else - printf("%s\n", to_prio[ioprio_class]); - } + for(; argv[optind]; ++optind) + { + pid = strtol(argv[optind], NULL, 10); + ioprio_print(pid); + } } else { - if (ioprio_set(IOPRIO_WHO_PROCESS, pid, ioprio | ioprio_class << IOPRIO_CLASS_SHIFT) == -1) { - if (!tolerant) - err(EXIT_FAILURE, _("ioprio_set failed")); - } - - if (argv[optind]) { - execvp(argv[optind], &argv[optind]); - /* execvp should never return */ - err(EXIT_FAILURE, _("execvp failed")); - } + if (pid) + { + if (ioprio_set(IOPRIO_WHO_PROCESS, pid, ioprio | ioprio_class << IOPRIO_CLASS_SHIFT) == -1) { + if (!tolerant) + err(EXIT_FAILURE, _("ioprio_set failed")); + } + for(; argv[optind]; ++optind) + { + pid = strtol(argv[optind], NULL, 10); + if (ioprio_set(IOPRIO_WHO_PROCESS, pid, ioprio | ioprio_class << IOPRIO_CLASS_SHIFT) == -1) { + if (!tolerant) + err(EXIT_FAILURE, _("ioprio_set failed")); + } + } + } + else + { + if (ioprio_set(IOPRIO_WHO_PROCESS, 0, ioprio | ioprio_class << IOPRIO_CLASS_SHIFT) == -1) { + if (!tolerant) + err(EXIT_FAILURE, _("ioprio_set failed")); + } + + if (argv[optind]) { + execvp(argv[optind], &argv[optind]); + /* execvp should never return */ + err(EXIT_FAILURE, _("execvp failed")); + } + } } exit(EXIT_SUCCESS); -- 1.5.6.3 -- To unsubscribe from this list: send the line "unsubscribe util-linux-ng" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html