Mercurial > hg > toybox
annotate toys/taskset.c @ 628:3041521db5d0
Largely cosmetic code cleanups.
author | Rob Landley <rob@landley.net> |
---|---|
date | Tue, 17 Jul 2012 23:11:06 -0500 |
parents | c8330ef95d13 |
children | 8f22dbddf1e6 |
rev | line source |
---|---|
627
c8330ef95d13
Adding initial implementation of taskset
Elie De Brauwer <eliedebrauwer@gmail.com>
parents:
diff
changeset
|
1 /* vi: set sw=4 ts=4: |
c8330ef95d13
Adding initial implementation of taskset
Elie De Brauwer <eliedebrauwer@gmail.com>
parents:
diff
changeset
|
2 * |
c8330ef95d13
Adding initial implementation of taskset
Elie De Brauwer <eliedebrauwer@gmail.com>
parents:
diff
changeset
|
3 * taskset.c - Retrieve or set the CPU affinity of a process. |
c8330ef95d13
Adding initial implementation of taskset
Elie De Brauwer <eliedebrauwer@gmail.com>
parents:
diff
changeset
|
4 * |
c8330ef95d13
Adding initial implementation of taskset
Elie De Brauwer <eliedebrauwer@gmail.com>
parents:
diff
changeset
|
5 * Copyright 2012 Elie De Brauwer <eliedebrauwer@gmail.com> |
c8330ef95d13
Adding initial implementation of taskset
Elie De Brauwer <eliedebrauwer@gmail.com>
parents:
diff
changeset
|
6 * |
c8330ef95d13
Adding initial implementation of taskset
Elie De Brauwer <eliedebrauwer@gmail.com>
parents:
diff
changeset
|
7 * Not in SUSv4. |
c8330ef95d13
Adding initial implementation of taskset
Elie De Brauwer <eliedebrauwer@gmail.com>
parents:
diff
changeset
|
8 |
c8330ef95d13
Adding initial implementation of taskset
Elie De Brauwer <eliedebrauwer@gmail.com>
parents:
diff
changeset
|
9 USE_TASKSET(NEWTOY(taskset, "<1>2a", TOYFLAG_BIN|TOYFLAG_NEEDROOT)) |
c8330ef95d13
Adding initial implementation of taskset
Elie De Brauwer <eliedebrauwer@gmail.com>
parents:
diff
changeset
|
10 |
c8330ef95d13
Adding initial implementation of taskset
Elie De Brauwer <eliedebrauwer@gmail.com>
parents:
diff
changeset
|
11 config TASKSET |
c8330ef95d13
Adding initial implementation of taskset
Elie De Brauwer <eliedebrauwer@gmail.com>
parents:
diff
changeset
|
12 bool "taskset" |
c8330ef95d13
Adding initial implementation of taskset
Elie De Brauwer <eliedebrauwer@gmail.com>
parents:
diff
changeset
|
13 default y |
c8330ef95d13
Adding initial implementation of taskset
Elie De Brauwer <eliedebrauwer@gmail.com>
parents:
diff
changeset
|
14 help |
c8330ef95d13
Adding initial implementation of taskset
Elie De Brauwer <eliedebrauwer@gmail.com>
parents:
diff
changeset
|
15 usage: taskset [-a] [mask] PID |
c8330ef95d13
Adding initial implementation of taskset
Elie De Brauwer <eliedebrauwer@gmail.com>
parents:
diff
changeset
|
16 |
c8330ef95d13
Adding initial implementation of taskset
Elie De Brauwer <eliedebrauwer@gmail.com>
parents:
diff
changeset
|
17 When mask is present the CPU affinity mask of a given PID will |
c8330ef95d13
Adding initial implementation of taskset
Elie De Brauwer <eliedebrauwer@gmail.com>
parents:
diff
changeset
|
18 be set to this mask. When a mask is not given, the mask will |
c8330ef95d13
Adding initial implementation of taskset
Elie De Brauwer <eliedebrauwer@gmail.com>
parents:
diff
changeset
|
19 be printed. A mask is a hexadecimal string where the bit position |
628
3041521db5d0
Largely cosmetic code cleanups.
Rob Landley <rob@landley.net>
parents:
627
diff
changeset
|
20 matches the cpu number. |
627
c8330ef95d13
Adding initial implementation of taskset
Elie De Brauwer <eliedebrauwer@gmail.com>
parents:
diff
changeset
|
21 -a Set/get the affinity of all tasks of a PID. |
c8330ef95d13
Adding initial implementation of taskset
Elie De Brauwer <eliedebrauwer@gmail.com>
parents:
diff
changeset
|
22 */ |
c8330ef95d13
Adding initial implementation of taskset
Elie De Brauwer <eliedebrauwer@gmail.com>
parents:
diff
changeset
|
23 |
c8330ef95d13
Adding initial implementation of taskset
Elie De Brauwer <eliedebrauwer@gmail.com>
parents:
diff
changeset
|
24 #define _GNU_SOURCE |
c8330ef95d13
Adding initial implementation of taskset
Elie De Brauwer <eliedebrauwer@gmail.com>
parents:
diff
changeset
|
25 #include "toys.h" |
c8330ef95d13
Adding initial implementation of taskset
Elie De Brauwer <eliedebrauwer@gmail.com>
parents:
diff
changeset
|
26 |
c8330ef95d13
Adding initial implementation of taskset
Elie De Brauwer <eliedebrauwer@gmail.com>
parents:
diff
changeset
|
27 static int str_to_cpu_set(char * mask, cpu_set_t *set) |
c8330ef95d13
Adding initial implementation of taskset
Elie De Brauwer <eliedebrauwer@gmail.com>
parents:
diff
changeset
|
28 { |
c8330ef95d13
Adding initial implementation of taskset
Elie De Brauwer <eliedebrauwer@gmail.com>
parents:
diff
changeset
|
29 int size = strlen(mask); |
c8330ef95d13
Adding initial implementation of taskset
Elie De Brauwer <eliedebrauwer@gmail.com>
parents:
diff
changeset
|
30 char *ptr = mask + size - 1; |
c8330ef95d13
Adding initial implementation of taskset
Elie De Brauwer <eliedebrauwer@gmail.com>
parents:
diff
changeset
|
31 int cpu = 0; |
c8330ef95d13
Adding initial implementation of taskset
Elie De Brauwer <eliedebrauwer@gmail.com>
parents:
diff
changeset
|
32 |
c8330ef95d13
Adding initial implementation of taskset
Elie De Brauwer <eliedebrauwer@gmail.com>
parents:
diff
changeset
|
33 CPU_ZERO(set); |
628
3041521db5d0
Largely cosmetic code cleanups.
Rob Landley <rob@landley.net>
parents:
627
diff
changeset
|
34 if (size > 1 && mask[0] == '0' && mask[1] == 'x') mask += 2; |
627
c8330ef95d13
Adding initial implementation of taskset
Elie De Brauwer <eliedebrauwer@gmail.com>
parents:
diff
changeset
|
35 |
c8330ef95d13
Adding initial implementation of taskset
Elie De Brauwer <eliedebrauwer@gmail.com>
parents:
diff
changeset
|
36 while(ptr >= mask) |
c8330ef95d13
Adding initial implementation of taskset
Elie De Brauwer <eliedebrauwer@gmail.com>
parents:
diff
changeset
|
37 { |
c8330ef95d13
Adding initial implementation of taskset
Elie De Brauwer <eliedebrauwer@gmail.com>
parents:
diff
changeset
|
38 char val = 0; |
628
3041521db5d0
Largely cosmetic code cleanups.
Rob Landley <rob@landley.net>
parents:
627
diff
changeset
|
39 if ( *ptr >= '0' && *ptr <= '9') val = *ptr - '0'; |
3041521db5d0
Largely cosmetic code cleanups.
Rob Landley <rob@landley.net>
parents:
627
diff
changeset
|
40 else if (*ptr >= 'a' && *ptr <= 'f') val = 10 + (*ptr - 'a'); |
3041521db5d0
Largely cosmetic code cleanups.
Rob Landley <rob@landley.net>
parents:
627
diff
changeset
|
41 else return -1; |
627
c8330ef95d13
Adding initial implementation of taskset
Elie De Brauwer <eliedebrauwer@gmail.com>
parents:
diff
changeset
|
42 |
c8330ef95d13
Adding initial implementation of taskset
Elie De Brauwer <eliedebrauwer@gmail.com>
parents:
diff
changeset
|
43 if (val & 1) CPU_SET(cpu, set); |
c8330ef95d13
Adding initial implementation of taskset
Elie De Brauwer <eliedebrauwer@gmail.com>
parents:
diff
changeset
|
44 if (val & 2) CPU_SET(cpu + 1, set); |
c8330ef95d13
Adding initial implementation of taskset
Elie De Brauwer <eliedebrauwer@gmail.com>
parents:
diff
changeset
|
45 if (val & 4) CPU_SET(cpu + 2, set); |
c8330ef95d13
Adding initial implementation of taskset
Elie De Brauwer <eliedebrauwer@gmail.com>
parents:
diff
changeset
|
46 if (val & 8) CPU_SET(cpu + 3, set); |
c8330ef95d13
Adding initial implementation of taskset
Elie De Brauwer <eliedebrauwer@gmail.com>
parents:
diff
changeset
|
47 |
c8330ef95d13
Adding initial implementation of taskset
Elie De Brauwer <eliedebrauwer@gmail.com>
parents:
diff
changeset
|
48 ptr--; |
c8330ef95d13
Adding initial implementation of taskset
Elie De Brauwer <eliedebrauwer@gmail.com>
parents:
diff
changeset
|
49 cpu += 4; |
c8330ef95d13
Adding initial implementation of taskset
Elie De Brauwer <eliedebrauwer@gmail.com>
parents:
diff
changeset
|
50 } |
c8330ef95d13
Adding initial implementation of taskset
Elie De Brauwer <eliedebrauwer@gmail.com>
parents:
diff
changeset
|
51 return 0; |
c8330ef95d13
Adding initial implementation of taskset
Elie De Brauwer <eliedebrauwer@gmail.com>
parents:
diff
changeset
|
52 } |
c8330ef95d13
Adding initial implementation of taskset
Elie De Brauwer <eliedebrauwer@gmail.com>
parents:
diff
changeset
|
53 |
c8330ef95d13
Adding initial implementation of taskset
Elie De Brauwer <eliedebrauwer@gmail.com>
parents:
diff
changeset
|
54 static char * cpu_set_to_str(cpu_set_t *set) |
c8330ef95d13
Adding initial implementation of taskset
Elie De Brauwer <eliedebrauwer@gmail.com>
parents:
diff
changeset
|
55 { |
c8330ef95d13
Adding initial implementation of taskset
Elie De Brauwer <eliedebrauwer@gmail.com>
parents:
diff
changeset
|
56 int cpu; |
c8330ef95d13
Adding initial implementation of taskset
Elie De Brauwer <eliedebrauwer@gmail.com>
parents:
diff
changeset
|
57 char * ptr = toybuf; |
c8330ef95d13
Adding initial implementation of taskset
Elie De Brauwer <eliedebrauwer@gmail.com>
parents:
diff
changeset
|
58 for (cpu=(8*sizeof(cpu_set_t) - 4); cpu >= 0; cpu -= 4) |
c8330ef95d13
Adding initial implementation of taskset
Elie De Brauwer <eliedebrauwer@gmail.com>
parents:
diff
changeset
|
59 { |
c8330ef95d13
Adding initial implementation of taskset
Elie De Brauwer <eliedebrauwer@gmail.com>
parents:
diff
changeset
|
60 char val = 0; |
c8330ef95d13
Adding initial implementation of taskset
Elie De Brauwer <eliedebrauwer@gmail.com>
parents:
diff
changeset
|
61 if (CPU_ISSET(cpu, set)) val |= 1; |
c8330ef95d13
Adding initial implementation of taskset
Elie De Brauwer <eliedebrauwer@gmail.com>
parents:
diff
changeset
|
62 if (CPU_ISSET(cpu + 1, set)) val |= 2; |
c8330ef95d13
Adding initial implementation of taskset
Elie De Brauwer <eliedebrauwer@gmail.com>
parents:
diff
changeset
|
63 if (CPU_ISSET(cpu + 2, set)) val |= 4; |
c8330ef95d13
Adding initial implementation of taskset
Elie De Brauwer <eliedebrauwer@gmail.com>
parents:
diff
changeset
|
64 if (CPU_ISSET(cpu + 3, set)) val |= 8; |
c8330ef95d13
Adding initial implementation of taskset
Elie De Brauwer <eliedebrauwer@gmail.com>
parents:
diff
changeset
|
65 if (ptr != toybuf || val != 0) |
c8330ef95d13
Adding initial implementation of taskset
Elie De Brauwer <eliedebrauwer@gmail.com>
parents:
diff
changeset
|
66 { |
628
3041521db5d0
Largely cosmetic code cleanups.
Rob Landley <rob@landley.net>
parents:
627
diff
changeset
|
67 if (val < 10) *ptr = '0' + val; |
3041521db5d0
Largely cosmetic code cleanups.
Rob Landley <rob@landley.net>
parents:
627
diff
changeset
|
68 else *ptr = 'a' + (val - 10); |
627
c8330ef95d13
Adding initial implementation of taskset
Elie De Brauwer <eliedebrauwer@gmail.com>
parents:
diff
changeset
|
69 ptr++; |
c8330ef95d13
Adding initial implementation of taskset
Elie De Brauwer <eliedebrauwer@gmail.com>
parents:
diff
changeset
|
70 } |
c8330ef95d13
Adding initial implementation of taskset
Elie De Brauwer <eliedebrauwer@gmail.com>
parents:
diff
changeset
|
71 } |
c8330ef95d13
Adding initial implementation of taskset
Elie De Brauwer <eliedebrauwer@gmail.com>
parents:
diff
changeset
|
72 *ptr = 0; |
c8330ef95d13
Adding initial implementation of taskset
Elie De Brauwer <eliedebrauwer@gmail.com>
parents:
diff
changeset
|
73 return toybuf; |
c8330ef95d13
Adding initial implementation of taskset
Elie De Brauwer <eliedebrauwer@gmail.com>
parents:
diff
changeset
|
74 } |
c8330ef95d13
Adding initial implementation of taskset
Elie De Brauwer <eliedebrauwer@gmail.com>
parents:
diff
changeset
|
75 |
c8330ef95d13
Adding initial implementation of taskset
Elie De Brauwer <eliedebrauwer@gmail.com>
parents:
diff
changeset
|
76 static void do_taskset(pid_t pid) |
c8330ef95d13
Adding initial implementation of taskset
Elie De Brauwer <eliedebrauwer@gmail.com>
parents:
diff
changeset
|
77 { |
c8330ef95d13
Adding initial implementation of taskset
Elie De Brauwer <eliedebrauwer@gmail.com>
parents:
diff
changeset
|
78 cpu_set_t mask; |
628
3041521db5d0
Largely cosmetic code cleanups.
Rob Landley <rob@landley.net>
parents:
627
diff
changeset
|
79 |
3041521db5d0
Largely cosmetic code cleanups.
Rob Landley <rob@landley.net>
parents:
627
diff
changeset
|
80 if (!pid) return; |
627
c8330ef95d13
Adding initial implementation of taskset
Elie De Brauwer <eliedebrauwer@gmail.com>
parents:
diff
changeset
|
81 if (sched_getaffinity(pid, sizeof(mask), &mask)) |
c8330ef95d13
Adding initial implementation of taskset
Elie De Brauwer <eliedebrauwer@gmail.com>
parents:
diff
changeset
|
82 perror_exit("failed to get %d's affinity", pid); |
c8330ef95d13
Adding initial implementation of taskset
Elie De Brauwer <eliedebrauwer@gmail.com>
parents:
diff
changeset
|
83 |
c8330ef95d13
Adding initial implementation of taskset
Elie De Brauwer <eliedebrauwer@gmail.com>
parents:
diff
changeset
|
84 printf("pid %d's current affinity mask: %s\n", pid, cpu_set_to_str(&mask)); |
c8330ef95d13
Adding initial implementation of taskset
Elie De Brauwer <eliedebrauwer@gmail.com>
parents:
diff
changeset
|
85 |
c8330ef95d13
Adding initial implementation of taskset
Elie De Brauwer <eliedebrauwer@gmail.com>
parents:
diff
changeset
|
86 if (toys.optc == 2) |
c8330ef95d13
Adding initial implementation of taskset
Elie De Brauwer <eliedebrauwer@gmail.com>
parents:
diff
changeset
|
87 { |
c8330ef95d13
Adding initial implementation of taskset
Elie De Brauwer <eliedebrauwer@gmail.com>
parents:
diff
changeset
|
88 if (str_to_cpu_set(toys.optargs[0], &mask)) |
628
3041521db5d0
Largely cosmetic code cleanups.
Rob Landley <rob@landley.net>
parents:
627
diff
changeset
|
89 perror_exit("bad mask: %s", toys.optargs[0]); |
627
c8330ef95d13
Adding initial implementation of taskset
Elie De Brauwer <eliedebrauwer@gmail.com>
parents:
diff
changeset
|
90 |
c8330ef95d13
Adding initial implementation of taskset
Elie De Brauwer <eliedebrauwer@gmail.com>
parents:
diff
changeset
|
91 if (sched_setaffinity(pid, sizeof(mask), &mask)) |
c8330ef95d13
Adding initial implementation of taskset
Elie De Brauwer <eliedebrauwer@gmail.com>
parents:
diff
changeset
|
92 perror_exit("failed to set %d's affinity", pid); |
c8330ef95d13
Adding initial implementation of taskset
Elie De Brauwer <eliedebrauwer@gmail.com>
parents:
diff
changeset
|
93 |
c8330ef95d13
Adding initial implementation of taskset
Elie De Brauwer <eliedebrauwer@gmail.com>
parents:
diff
changeset
|
94 if (sched_getaffinity(pid, sizeof(mask), &mask)) |
c8330ef95d13
Adding initial implementation of taskset
Elie De Brauwer <eliedebrauwer@gmail.com>
parents:
diff
changeset
|
95 perror_exit("failed to get %d's affinity", pid); |
c8330ef95d13
Adding initial implementation of taskset
Elie De Brauwer <eliedebrauwer@gmail.com>
parents:
diff
changeset
|
96 |
c8330ef95d13
Adding initial implementation of taskset
Elie De Brauwer <eliedebrauwer@gmail.com>
parents:
diff
changeset
|
97 printf("pid %d's new affinity mask: %s\n", pid, cpu_set_to_str(&mask)); |
c8330ef95d13
Adding initial implementation of taskset
Elie De Brauwer <eliedebrauwer@gmail.com>
parents:
diff
changeset
|
98 } |
c8330ef95d13
Adding initial implementation of taskset
Elie De Brauwer <eliedebrauwer@gmail.com>
parents:
diff
changeset
|
99 } |
c8330ef95d13
Adding initial implementation of taskset
Elie De Brauwer <eliedebrauwer@gmail.com>
parents:
diff
changeset
|
100 |
c8330ef95d13
Adding initial implementation of taskset
Elie De Brauwer <eliedebrauwer@gmail.com>
parents:
diff
changeset
|
101 static int task_cb(struct dirtree *new) |
c8330ef95d13
Adding initial implementation of taskset
Elie De Brauwer <eliedebrauwer@gmail.com>
parents:
diff
changeset
|
102 { |
628
3041521db5d0
Largely cosmetic code cleanups.
Rob Landley <rob@landley.net>
parents:
627
diff
changeset
|
103 if (!new->parent) return DIRTREE_RECURSE; |
3041521db5d0
Largely cosmetic code cleanups.
Rob Landley <rob@landley.net>
parents:
627
diff
changeset
|
104 if (S_ISDIR(new->st.st_mode) && *new->name != '.') |
3041521db5d0
Largely cosmetic code cleanups.
Rob Landley <rob@landley.net>
parents:
627
diff
changeset
|
105 do_taskset(atoi(new->name)); |
627
c8330ef95d13
Adding initial implementation of taskset
Elie De Brauwer <eliedebrauwer@gmail.com>
parents:
diff
changeset
|
106 |
c8330ef95d13
Adding initial implementation of taskset
Elie De Brauwer <eliedebrauwer@gmail.com>
parents:
diff
changeset
|
107 return 0; |
c8330ef95d13
Adding initial implementation of taskset
Elie De Brauwer <eliedebrauwer@gmail.com>
parents:
diff
changeset
|
108 } |
c8330ef95d13
Adding initial implementation of taskset
Elie De Brauwer <eliedebrauwer@gmail.com>
parents:
diff
changeset
|
109 |
c8330ef95d13
Adding initial implementation of taskset
Elie De Brauwer <eliedebrauwer@gmail.com>
parents:
diff
changeset
|
110 void taskset_main(void) |
c8330ef95d13
Adding initial implementation of taskset
Elie De Brauwer <eliedebrauwer@gmail.com>
parents:
diff
changeset
|
111 { |
c8330ef95d13
Adding initial implementation of taskset
Elie De Brauwer <eliedebrauwer@gmail.com>
parents:
diff
changeset
|
112 char * pidstr = (toys.optc==1)?toys.optargs[0]:toys.optargs[1]; |
c8330ef95d13
Adding initial implementation of taskset
Elie De Brauwer <eliedebrauwer@gmail.com>
parents:
diff
changeset
|
113 |
628
3041521db5d0
Largely cosmetic code cleanups.
Rob Landley <rob@landley.net>
parents:
627
diff
changeset
|
114 if (toys.optflags & 0x1) |
627
c8330ef95d13
Adding initial implementation of taskset
Elie De Brauwer <eliedebrauwer@gmail.com>
parents:
diff
changeset
|
115 { |
c8330ef95d13
Adding initial implementation of taskset
Elie De Brauwer <eliedebrauwer@gmail.com>
parents:
diff
changeset
|
116 sprintf(toybuf, "/proc/%s/task/", pidstr); |
c8330ef95d13
Adding initial implementation of taskset
Elie De Brauwer <eliedebrauwer@gmail.com>
parents:
diff
changeset
|
117 dirtree_read(toybuf, task_cb); |
628
3041521db5d0
Largely cosmetic code cleanups.
Rob Landley <rob@landley.net>
parents:
627
diff
changeset
|
118 } else do_taskset(atoi(pidstr)); |
627
c8330ef95d13
Adding initial implementation of taskset
Elie De Brauwer <eliedebrauwer@gmail.com>
parents:
diff
changeset
|
119 } |