aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authoraldot <aldot@69ca8d6d-28ef-0310-b511-8ec308f3f277>2006-06-07 15:44:59 +0000
committeraldot <aldot@69ca8d6d-28ef-0310-b511-8ec308f3f277>2006-06-07 15:44:59 +0000
commitf1d53c622940ffd7e4ee59e2a4de0e715568c733 (patch)
tree3945b0f4e0293206ac4969a79b73112b9ce29e85
parent09a778622a30cd90a7065c4c352ebecb334761cd (diff)
downloadbusybox-w32-f1d53c622940ffd7e4ee59e2a4de0e715568c733.tar.gz
busybox-w32-f1d53c622940ffd7e4ee59e2a4de0e715568c733.tar.bz2
busybox-w32-f1d53c622940ffd7e4ee59e2a4de0e715568c733.zip
- add applet taskset to set/retrieve the CPU affinity of a process
text data bss dec hex filename 584 0 0 584 248 taskset.o.gcc-2.95 509 0 0 509 1fd taskset.o.gcc-3.3 505 0 0 505 1f9 taskset.o.gcc-3.4 506 0 0 506 1fa taskset.o.gcc-4.0 498 0 0 498 1f2 taskset.o.gcc-4.1 495 0 0 495 1ef taskset.o.gcc-4.2-HEAD git-svn-id: svn://busybox.net/trunk/busybox@15315 69ca8d6d-28ef-0310-b511-8ec308f3f277
-rw-r--r--include/applets.h1
-rw-r--r--include/usage.h17
-rw-r--r--miscutils/Config.in6
-rw-r--r--miscutils/Makefile.in1
-rw-r--r--miscutils/taskset.c67
-rwxr-xr-xtestsuite/taskset.tests17
6 files changed, 109 insertions, 0 deletions
diff --git a/include/applets.h b/include/applets.h
index d020c5f89..c9d5ac162 100644
--- a/include/applets.h
+++ b/include/applets.h
@@ -262,6 +262,7 @@ USE_BB_SYSCTL(APPLET(sysctl, _BB_DIR_SBIN, _BB_SUID_NEVER))
262USE_SYSLOGD(APPLET(syslogd, _BB_DIR_SBIN, _BB_SUID_NEVER)) 262USE_SYSLOGD(APPLET(syslogd, _BB_DIR_SBIN, _BB_SUID_NEVER))
263USE_TAIL(APPLET(tail, _BB_DIR_USR_BIN, _BB_SUID_NEVER)) 263USE_TAIL(APPLET(tail, _BB_DIR_USR_BIN, _BB_SUID_NEVER))
264USE_TAR(APPLET(tar, _BB_DIR_BIN, _BB_SUID_NEVER)) 264USE_TAR(APPLET(tar, _BB_DIR_BIN, _BB_SUID_NEVER))
265USE_TASKSET(APPLET(taskset, _BB_DIR_USR_BIN, _BB_SUID_NEVER))
265USE_TEE(APPLET(tee, _BB_DIR_USR_BIN, _BB_SUID_NEVER)) 266USE_TEE(APPLET(tee, _BB_DIR_USR_BIN, _BB_SUID_NEVER))
266USE_TELNET(APPLET(telnet, _BB_DIR_USR_BIN, _BB_SUID_NEVER)) 267USE_TELNET(APPLET(telnet, _BB_DIR_USR_BIN, _BB_SUID_NEVER))
267USE_TELNETD(APPLET(telnetd, _BB_DIR_USR_SBIN, _BB_SUID_NEVER)) 268USE_TELNETD(APPLET(telnetd, _BB_DIR_USR_SBIN, _BB_SUID_NEVER))
diff --git a/include/usage.h b/include/usage.h
index 239bbb373..9bdfb3fe0 100644
--- a/include/usage.h
+++ b/include/usage.h
@@ -2955,6 +2955,23 @@ USE_FEATURE_DATE_ISOFMT( \
2955 "$ zcat /tmp/tarball.tar.gz | tar -xf -\n" \ 2955 "$ zcat /tmp/tarball.tar.gz | tar -xf -\n" \
2956 "$ tar -cf /tmp/tarball.tar /usr/local\n" 2956 "$ tar -cf /tmp/tarball.tar /usr/local\n"
2957 2957
2958#define taskset_trivial_usage \
2959 "[OPTIONS] [mask] [pid | command [arg]...]"
2960#define taskset_full_usage \
2961 "Set or get CPU affinity.\n\n" \
2962 "Options:\n" \
2963 "\t-p\toperate on an existing PID"
2964#define taskset_example_usage \
2965 "$ taskset 0x7 ./dgemm_test&\n" \
2966 "$ taskset -p 0x1 $!\n" \
2967 "pid 4790's current affinity mask: 7\n" \
2968 "pid 4790's new affinity mask: 1\n" \
2969 "$ taskset 0x7 /bin/sh -c './taskset -p 0x1 $$'\n" \
2970 "pid 6671's current affinity mask: 1\n" \
2971 "pid 6671's new affinity mask: 1\n" \
2972 "$ taskset -p 1\n"
2973 "pid 1's current affinity mask: 3\n"
2974
2958#define tee_trivial_usage \ 2975#define tee_trivial_usage \
2959 "[OPTION]... [FILE]..." 2976 "[OPTION]... [FILE]..."
2960#define tee_full_usage \ 2977#define tee_full_usage \
diff --git a/miscutils/Config.in b/miscutils/Config.in
index fc90b5447..37c1de8b9 100644
--- a/miscutils/Config.in
+++ b/miscutils/Config.in
@@ -291,6 +291,12 @@ config CONFIG_SETSID
291 help 291 help
292 setsid runs a program in a new session 292 setsid runs a program in a new session
293 293
294config CONFIG_TASKSET
295 bool "taskset"
296 default n
297 help
298 Retrieve or set a processes's CPU affinity (on linux)
299
294config CONFIG_TIME 300config CONFIG_TIME
295 bool "time" 301 bool "time"
296 default n 302 default n
diff --git a/miscutils/Makefile.in b/miscutils/Makefile.in
index a0b6b7233..d60d687b0 100644
--- a/miscutils/Makefile.in
+++ b/miscutils/Makefile.in
@@ -28,6 +28,7 @@ MISCUTILS-$(CONFIG_RUNLEVEL) += runlevel.o
28MISCUTILS-$(CONFIG_RX) += rx.o 28MISCUTILS-$(CONFIG_RX) += rx.o
29MISCUTILS-$(CONFIG_SETSID) += setsid.o 29MISCUTILS-$(CONFIG_SETSID) += setsid.o
30MISCUTILS-$(CONFIG_STRINGS) += strings.o 30MISCUTILS-$(CONFIG_STRINGS) += strings.o
31MISCUTILS-$(CONFIG_TASKSET) += taskset.o
31MISCUTILS-$(CONFIG_TIME) += time.o 32MISCUTILS-$(CONFIG_TIME) += time.o
32MISCUTILS-$(CONFIG_WATCHDOG) += watchdog.o 33MISCUTILS-$(CONFIG_WATCHDOG) += watchdog.o
33 34
diff --git a/miscutils/taskset.c b/miscutils/taskset.c
new file mode 100644
index 000000000..a72f3ff53
--- /dev/null
+++ b/miscutils/taskset.c
@@ -0,0 +1,67 @@
1/* vi: set sw=4 ts=4: */
2/*
3 * taskset - retrieve or set a processes's CPU affinity
4 * Copyright (c) 2006 Bernhard Fischer
5 *
6 * Licensed under GPLv2 or later, see file LICENSE in this tarball for details.
7 */
8
9#include "busybox.h"
10#include <sched.h>
11#include <unistd.h>
12#include <getopt.h> /* optind */
13
14int taskset_main(int argc, char** argv)
15{
16 cpu_set_t mask, new_mask;
17 pid_t pid = 0;
18 unsigned long ul;
19 const char *state = "current\0new";
20 char *p_opt = NULL, *aff = NULL;
21
22 ul = bb_getopt_ulflags(argc, argv, "+p:", &p_opt);
23#define TASKSET_OPT_p (1)
24
25 if (ul & TASKSET_OPT_p) {
26 if (argc == optind+1) { /* -p <aff> <pid> */
27 aff = p_opt;
28 p_opt = argv[optind];
29 }
30 argv += optind; /* me -p <arg> */
31 pid = bb_xgetularg10_bnd(p_opt, 1, ULONG_MAX); /* -p <pid> */
32 } else
33 aff = *++argv; /* <aff> <cmd...> */
34 if (aff) {
35/* to_cpuset(bb_xgetularg_bnd(aff, 16, 1, ULONG_MAX), &new_mask); */
36 unsigned i = 0;
37 unsigned long l = bb_xgetularg_bnd(aff, 16, 1, ULONG_MAX);
38
39 CPU_ZERO(&new_mask);
40 while (i < CPU_SETSIZE && l >= (1<<i)) {
41 if ((1<<i) & l)
42 CPU_SET(i, &new_mask);
43 ++i;
44 }
45 }
46
47 if (ul & TASKSET_OPT_p) {
48print_aff:
49 if (sched_getaffinity(pid, sizeof (mask), &mask) < 0)
50 bb_perror_msg_and_die("Failed to %cet pid %d's affinity", 'g', pid);
51 bb_printf("pid %d's %s affinity mask: %x\n", /* %x .. perhaps _FANCY */
52 pid, state, mask);
53 if (!*argv) /* no new affinity given or we did print already, done. */
54 return EXIT_SUCCESS;
55 }
56
57 if (sched_setaffinity(pid, sizeof (new_mask), &new_mask))
58 bb_perror_msg_and_die("Failed to %cet pid %d's affinity", 's', pid);
59 if (ul & TASKSET_OPT_p) {
60 state += 8;
61 ++argv;
62 goto print_aff;
63 }
64 ++argv;
65 execvp(*argv, argv);
66 bb_perror_msg_and_die("%s", *argv);
67}
diff --git a/testsuite/taskset.tests b/testsuite/taskset.tests
new file mode 100755
index 000000000..6001c3e32
--- /dev/null
+++ b/testsuite/taskset.tests
@@ -0,0 +1,17 @@
1#!/bin/sh
2
3# Copyright 2006 Bernhard Fischer
4# Licensed under GPL v2 or later, see file LICENSE for details.
5
6. testing.sh
7a="taskset"
8
9# testing "test name" "opts" "expected result" "file inp" "stdin"
10testing "taskset (get from pid 1)" "$a -p1 >/dev/null;echo \$?" "0\n" "" ""
11testing "taskset (invalid pid)" "$a -p0 >/dev/null 2>&1;echo \$?" "1\n" "" ""
12testing "taskset (set_aff, needs CAP_SYS_NICE)" \
13 "$a 0x1 $SHELL -c $a\ -p\ \$$\|grep\ \"current\ affinity\ mask:\ 1\" >/dev/null;echo \$?" \
14 "0\n" "" ""
15
16unset a
17exit $FAILCOUNT