[PATCH] Let ionice -p handle multiple PIDs

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



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

[Index of Archives]     [Netdev]     [Ethernet Bridging]     [Linux Wireless]     [Kernel Newbies]     [Security]     [Linux for Hams]     [Netfilter]     [Bugtraq]     [Yosemite News]     [MIPS Linux]     [ARM Linux]     [Linux RAID]     [Linux Admin]     [Samba]

  Powered by Linux