1*cf5a6c84SAndroid Build Coastguard Worker /* ionice.c - set or get process I/O scheduling class and priority
2*cf5a6c84SAndroid Build Coastguard Worker *
3*cf5a6c84SAndroid Build Coastguard Worker * Copyright 2015 Rob Landley <[email protected]>
4*cf5a6c84SAndroid Build Coastguard Worker *
5*cf5a6c84SAndroid Build Coastguard Worker * It would be really nice if there was a standard, but no. There is
6*cf5a6c84SAndroid Build Coastguard Worker * Documentation/block/ioprio.txt in the linux source.
7*cf5a6c84SAndroid Build Coastguard Worker
8*cf5a6c84SAndroid Build Coastguard Worker USE_IONICE(NEWTOY(ionice, "^tc#<0>3=2n#<0>7=5p#", TOYFLAG_USR|TOYFLAG_BIN))
9*cf5a6c84SAndroid Build Coastguard Worker USE_IORENICE(NEWTOY(iorenice, "<1>3", TOYFLAG_USR|TOYFLAG_BIN))
10*cf5a6c84SAndroid Build Coastguard Worker
11*cf5a6c84SAndroid Build Coastguard Worker config IONICE
12*cf5a6c84SAndroid Build Coastguard Worker bool "ionice"
13*cf5a6c84SAndroid Build Coastguard Worker default y
14*cf5a6c84SAndroid Build Coastguard Worker help
15*cf5a6c84SAndroid Build Coastguard Worker usage: ionice [-t] [-c CLASS] [-n LEVEL] [COMMAND...|-p PID]
16*cf5a6c84SAndroid Build Coastguard Worker
17*cf5a6c84SAndroid Build Coastguard Worker Change the I/O scheduling priority of a process. With no arguments
18*cf5a6c84SAndroid Build Coastguard Worker (or just -p), display process' existing I/O class/priority.
19*cf5a6c84SAndroid Build Coastguard Worker
20*cf5a6c84SAndroid Build Coastguard Worker -c CLASS = 1-3: 1(realtime), 2(best-effort, default), 3(when-idle)
21*cf5a6c84SAndroid Build Coastguard Worker -n LEVEL = 0-7: (0 is highest priority, default = 5)
22*cf5a6c84SAndroid Build Coastguard Worker -p Affect existing PID instead of spawning new child
23*cf5a6c84SAndroid Build Coastguard Worker -t Ignore failure to set I/O priority
24*cf5a6c84SAndroid Build Coastguard Worker
25*cf5a6c84SAndroid Build Coastguard Worker System default iopriority is generally -c 2 -n 4.
26*cf5a6c84SAndroid Build Coastguard Worker
27*cf5a6c84SAndroid Build Coastguard Worker config IORENICE
28*cf5a6c84SAndroid Build Coastguard Worker bool "iorenice"
29*cf5a6c84SAndroid Build Coastguard Worker default y
30*cf5a6c84SAndroid Build Coastguard Worker help
31*cf5a6c84SAndroid Build Coastguard Worker usage: iorenice PID [CLASS] [PRIORITY]
32*cf5a6c84SAndroid Build Coastguard Worker
33*cf5a6c84SAndroid Build Coastguard Worker Display or change I/O priority of existing process. CLASS can be
34*cf5a6c84SAndroid Build Coastguard Worker "rt" for realtime, "be" for best effort, "idle" for only when idle, or
35*cf5a6c84SAndroid Build Coastguard Worker "none" to leave it alone. PRIORITY can be 0-7 (0 is highest, default 4).
36*cf5a6c84SAndroid Build Coastguard Worker */
37*cf5a6c84SAndroid Build Coastguard Worker
38*cf5a6c84SAndroid Build Coastguard Worker #define FOR_ionice
39*cf5a6c84SAndroid Build Coastguard Worker #include "toys.h"
40*cf5a6c84SAndroid Build Coastguard Worker
GLOBALS(long p,n,c;)41*cf5a6c84SAndroid Build Coastguard Worker GLOBALS(
42*cf5a6c84SAndroid Build Coastguard Worker long p, n, c;
43*cf5a6c84SAndroid Build Coastguard Worker )
44*cf5a6c84SAndroid Build Coastguard Worker
45*cf5a6c84SAndroid Build Coastguard Worker static int xioprio_get(void)
46*cf5a6c84SAndroid Build Coastguard Worker {
47*cf5a6c84SAndroid Build Coastguard Worker int p = syscall(__NR_ioprio_get, 1, (int)TT.p);
48*cf5a6c84SAndroid Build Coastguard Worker
49*cf5a6c84SAndroid Build Coastguard Worker if (p==-1) perror_exit("read priority");
50*cf5a6c84SAndroid Build Coastguard Worker
51*cf5a6c84SAndroid Build Coastguard Worker return p;
52*cf5a6c84SAndroid Build Coastguard Worker }
53*cf5a6c84SAndroid Build Coastguard Worker
xioprio_set(void)54*cf5a6c84SAndroid Build Coastguard Worker static void xioprio_set(void)
55*cf5a6c84SAndroid Build Coastguard Worker {
56*cf5a6c84SAndroid Build Coastguard Worker if (-1 == syscall(__NR_ioprio_set, 1, (int)TT.p, (int)((TT.c<<13)|TT.n)))
57*cf5a6c84SAndroid Build Coastguard Worker if (!FLAG(t)) perror_exit("set priority");
58*cf5a6c84SAndroid Build Coastguard Worker }
59*cf5a6c84SAndroid Build Coastguard Worker
ionice_main(void)60*cf5a6c84SAndroid Build Coastguard Worker void ionice_main(void)
61*cf5a6c84SAndroid Build Coastguard Worker {
62*cf5a6c84SAndroid Build Coastguard Worker if (!TT.p && !toys.optc) error_exit("Need -p or COMMAND");
63*cf5a6c84SAndroid Build Coastguard Worker if (toys.optflags == FLAG_p) {
64*cf5a6c84SAndroid Build Coastguard Worker int p = xioprio_get();
65*cf5a6c84SAndroid Build Coastguard Worker
66*cf5a6c84SAndroid Build Coastguard Worker xprintf("%s: prio %d\n",
67*cf5a6c84SAndroid Build Coastguard Worker (char *[]){"unknown", "Realtime", "Best-effort", "Idle"}[(p>>13)&3], p&7);
68*cf5a6c84SAndroid Build Coastguard Worker } else {
69*cf5a6c84SAndroid Build Coastguard Worker xioprio_set();
70*cf5a6c84SAndroid Build Coastguard Worker if (!TT.p) xexec(toys.optargs);
71*cf5a6c84SAndroid Build Coastguard Worker }
72*cf5a6c84SAndroid Build Coastguard Worker }
73*cf5a6c84SAndroid Build Coastguard Worker
iorenice_main(void)74*cf5a6c84SAndroid Build Coastguard Worker void iorenice_main(void)
75*cf5a6c84SAndroid Build Coastguard Worker {
76*cf5a6c84SAndroid Build Coastguard Worker char *classes[] = {"none", "rt", "be", "idle"};
77*cf5a6c84SAndroid Build Coastguard Worker
78*cf5a6c84SAndroid Build Coastguard Worker TT.p = atolx(*toys.optargs);
79*cf5a6c84SAndroid Build Coastguard Worker if (toys.optc == 1) {
80*cf5a6c84SAndroid Build Coastguard Worker int p = xioprio_get();
81*cf5a6c84SAndroid Build Coastguard Worker
82*cf5a6c84SAndroid Build Coastguard Worker xprintf("Pid %ld, class %s (%d), prio %d\n", TT.p, classes[(p>>13)&3],
83*cf5a6c84SAndroid Build Coastguard Worker (p>>13)&3, p&7);
84*cf5a6c84SAndroid Build Coastguard Worker return;
85*cf5a6c84SAndroid Build Coastguard Worker }
86*cf5a6c84SAndroid Build Coastguard Worker
87*cf5a6c84SAndroid Build Coastguard Worker for (TT.c = 0; TT.c<4; TT.c++)
88*cf5a6c84SAndroid Build Coastguard Worker if (!strcmp(toys.optargs[toys.optc-1], classes[TT.c])) break;
89*cf5a6c84SAndroid Build Coastguard Worker if (toys.optc == 3 || TT.c == 4) TT.n = atolx(toys.optargs[1]);
90*cf5a6c84SAndroid Build Coastguard Worker else TT.n = 4;
91*cf5a6c84SAndroid Build Coastguard Worker TT.c &= 3;
92*cf5a6c84SAndroid Build Coastguard Worker
93*cf5a6c84SAndroid Build Coastguard Worker xioprio_set();
94*cf5a6c84SAndroid Build Coastguard Worker }
95