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
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
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 }