]> err.no Git - util-linux/commitdiff
ionice: let -p handle multiple PIDs
authorStephan Maka <stephan@spaceboyz.net>
Wed, 20 Aug 2008 21:51:55 +0000 (23:51 +0200)
committerKarel Zak <kzak@redhat.com>
Fri, 5 Sep 2008 14:18:14 +0000 (16:18 +0200)
Makes ionice -p usable like renice, this time backwards compatible

[kzak@redhat.com: - fix coding style
                  - add ioprio_setpid()]

Signed-off-by: Stephan Maka <stephan@spaceboyz.net>
Signed-off-by: Karel Zak <kzak@redhat.com>
schedutils/ionice.1
schedutils/ionice.c

index a434572d5dea2fe876b1ef37ec73332a8a9301e9..67fbc1d044c1a8f7644d1b4aad88ff42b14f4627 100644 (file)
@@ -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
index 395509bd09002458f2b1a5de0dfe868032037d1d..2331bec4f8c57a68de76401cad88c446a4b14be5 100644 (file)
@@ -18,6 +18,8 @@
 
 #include "nls.h"
 
+static int tolerant;
+
 static inline int ioprio_set(int which, int who, int ioprio)
 {
        return syscall(SYS_ioprio_set, which, who, ioprio);
@@ -45,6 +47,34 @@ enum {
 
 const char *to_prio[] = { "none", "realtime", "best-effort", "idle", };
 
+static void ioprio_print(int pid)
+{
+       int ioprio, ioclass;
+
+       ioprio = ioprio_get(IOPRIO_WHO_PROCESS, pid);
+
+       if (ioprio == -1)
+               err(EXIT_FAILURE, _("ioprio_get failed"));
+       else {
+               ioclass = ioprio >> IOPRIO_CLASS_SHIFT;
+               if (ioclass != IOPRIO_CLASS_IDLE) {
+                       ioprio = ioprio & 0xff;
+                       printf("%s: prio %d\n", to_prio[ioclass], ioprio);
+               } else
+                       printf("%s\n", to_prio[ioclass]);
+       }
+}
+
+
+static void ioprio_setpid(pid_t pid, int ioprio, int ioclass)
+{
+       int rc = ioprio_set(IOPRIO_WHO_PROCESS, pid,
+                       ioprio | ioclass << IOPRIO_CLASS_SHIFT);
+
+       if (rc == -1 && !tolerant)
+               err(EXIT_FAILURE, _("ioprio_set failed"));
+}
+
 static void usage(int rc)
 {
        fprintf(stdout, _(
@@ -62,7 +92,7 @@ static void usage(int rc)
 
 int main(int argc, char *argv[])
 {
-       int ioprio = 4, set = 0, tolerant = 0, ioprio_class = IOPRIO_CLASS_BE;
+       int ioprio = 4, set = 0, ioclass = IOPRIO_CLASS_BE;
        int c, pid = 0;
 
        setlocale(LC_ALL, "");
@@ -76,7 +106,7 @@ int main(int argc, char *argv[])
                        set |= 1;
                        break;
                case 'c':
-                       ioprio_class = strtol(optarg, NULL, 10);
+                       ioclass = strtol(optarg, NULL, 10);
                        set |= 2;
                        break;
                case 'p':
@@ -92,9 +122,9 @@ int main(int argc, char *argv[])
                }
        }
 
-       switch (ioprio_class) {
+       switch (ioclass) {
                case IOPRIO_CLASS_NONE:
-                       ioprio_class = IOPRIO_CLASS_BE;
+                       ioclass = IOPRIO_CLASS_BE;
                        break;
                case IOPRIO_CLASS_RT:
                case IOPRIO_CLASS_BE:
@@ -105,35 +135,32 @@ int main(int argc, char *argv[])
                        ioprio = 7;
                        break;
                default:
-                       errx(EXIT_FAILURE, _("bad prio class %d"), ioprio_class);
+                       errx(EXIT_FAILURE, _("bad prio class %d"), ioclass);
        }
 
        if (!set) {
-               if (!pid && argv[optind])
-                       pid = strtol(argv[optind], NULL, 10);
+               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) {
+                       ioprio_setpid(pid, ioprio, ioclass);
+
+                       for(; argv[optind]; ++optind)
+                       {
+                               pid = strtol(argv[optind], NULL, 10);
+                               ioprio_setpid(pid, ioprio, ioclass);
+                       }
+               } else {
+                       ioprio_setpid(0, ioprio, ioclass);
+                       if (argv[optind]) {
+                               execvp(argv[optind], &argv[optind]);
+                               /* execvp should never return */
+                               err(EXIT_FAILURE, _("execvp failed"));
+                       }
                }
        }