diff options
-rw-r--r-- | usr.bin/cpuset/Makefile | 1 | ||||
-rw-r--r-- | usr.bin/cpuset/cpuset.1 | 171 | ||||
-rw-r--r-- | usr.bin/cpuset/cpuset.c | 19 |
3 files changed, 177 insertions, 14 deletions
diff --git a/usr.bin/cpuset/Makefile b/usr.bin/cpuset/Makefile index 911400a..85a5148 100644 --- a/usr.bin/cpuset/Makefile +++ b/usr.bin/cpuset/Makefile @@ -1,7 +1,6 @@ # $FreeBSD$ PROG= cpuset -NO_MAN= true WARNS?= 6 .include <bsd.prog.mk> diff --git a/usr.bin/cpuset/cpuset.1 b/usr.bin/cpuset/cpuset.1 new file mode 100644 index 0000000..36b4dca --- /dev/null +++ b/usr.bin/cpuset/cpuset.1 @@ -0,0 +1,171 @@ +.\" Copyright (c) 2008 Christian Brueffer +.\" Copyright (c) 2008 Jeffrey Roberson +.\" All rights reserved. +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in the +.\" documentation and/or other materials provided with the distribution. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND +.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE +.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +.\" SUCH DAMAGE. +.\" +.\" $FreeBSD$ +.\" +.Dd March 2, 2008 +.Dt CPUSET 1 +.Os +.Sh NAME +.Nm cpuset +.Nd "configure processor sets" +.Sh SYNOPSIS +.Nm +.Op Fl l Ar cpu-list +.Op Fl s Ar setid +.Ar cmd +.Nm +.Op Fl l Ar cpu-list +.Op Fl s Ar setid +.Fl p Ar pid +.Nm +.Op Fl cr +.Op Fl l Ar cpu-list +.Op Fl p Ar pid | Fl r Ar tid | Fl s Ar setid +.Nm +.Op Fl cgir +.Op Fl p Ar pid | Fl r Ar tid | Fl s Ar setid +.Sh DESCRIPTION +The +.Nm +command can be used to assign processor sets to processes, run commands +constrained to a given set or list of processors, and query information +about processor binding, sets, and available processors in the system. +.Pp +.Nm +requires a target to modify or query. +The target may be specified as a command, process id, thread id, or a +cpuset id. +Using +.Fl g +the target's set id or mask may be queried. +Using +.Fl l +or +.Fl s +the target's CPU mask or set id may be set. +If no target is specified, +.Nm +operates on itself. +Not all combinations of operations and targets are supported. +For example, +you may not set the id of an existing set or query and launch a command +at the same time. +.Pp +There are two sets applicable to each process and one private mask per thread. +Every process in the system belongs to a cpuset. +By default processes are started in set 1. +The mask or id may be queried using +.Fl c . +Each thread also has a private mask of CPUs it is allowed to run +on that must be a subset of the assigned set. +And finally, there is a root set, numbered 0, that is immutable. +This last set is the list of all possible CPUs in the system and is +queried using +.Fl r . +.Pp +When running a command it may join a set specified with +.Fl s +otherwise a new set is created. +In addition, a mask for the set may be specified using +.Fl l . +.Pp +The options are as follows: +.Bl -tag -width ".Fl l Ar cpu-list" +.It Fl c +The requested operation should reference the cpuset available via the +target specifier. +.It Fl g +Causes +.Nm +to print either a list of valid CPUs or, using +.Fl i , +the id of the target. +.It Fl i +When used with the +.Fl g +option print the id rather than the valid mask of the target. +.It Fl l Ar cpu-list +Specifies a list of CPUs to apply to a target. +Specification may include +numbers seperated by '-' for ranges and commas separating individual numbers. +.It Fl p Ar pid +Specifies a pid as the target of the operation. +.It Fl s Ar setid +Specifies a set id as the target of the operation. +.It Fl r +The requested operation should reference the root set available via the +target specifier. +.It Fl t Ar tid +Specifies a thread id as the target of the operation. +.El +.Sh EXIT STATUS +.Ex -std +.Sh EXAMPLES +Create a new group with CPUs 0-4 inclusive and run +.Pa /bin/sh +on it: +.Dl cpuset -l 0-4 /bin/sh +.Pp +Query the mask of CPUs the +.Aq sh pid +is allowed to run on: +.Dl cpuset -g -p <sh pid> +.Pp +Restrict +.Pa /bin/sh +to run on CPUs 0 and 2 while its group is still allowed to run on +CPUs 0-4: +.Dl cpuset -l 0,2 -p <sh pid> +.Pp +Modify the cpuset +.Pa /bin/sh +belongs to restricting it to CPUs 0 and 2: +.Dl cpuset -l 0,2 -c -p <sh pid> +.Pp +Modify the cpuset all threads are in by default to contain only +the first 4 CPUs, leaving the rest idle: +.Dl cpuset -l 0-3 -s 1 +.Pp +Print the id of the cpuset +.Pa /bin/sh +is in: +.Dl cpuset -g -i -p <sh pid> +.Pp +Move the +.Ar pid +into the specified cpuset +.Ar setid +so it may be managed with other pids in that set: +.Dl cpuset -s <setid> -p <pid> +.Sh SEE ALSO +.Xr cpuset 2 +.Sh HISTORY +The +.Nm +command first appeared in +.Fx 8.0 . +.Sh AUTHORS +.An Jeffrey Roberson Aq jeff@FreeBSD.org diff --git a/usr.bin/cpuset/cpuset.c b/usr.bin/cpuset/cpuset.c index 23c4b79..41a715d 100644 --- a/usr.bin/cpuset/cpuset.c +++ b/usr.bin/cpuset/cpuset.c @@ -251,29 +251,24 @@ main(int argc, char *argv[]) printaffinity(); exit(EXIT_SUCCESS); } + if (iflag) + usage(); /* * The user wants to run a command with a set and possibly cpumask. */ if (argc) { if (pflag | rflag | tflag || cflag) usage(); - if (sflag && iflag) - usage(); if (sflag) { if (cpuset_setid(CPU_WHICH_PID, -1, setid)) err(argc, "setid"); - which = CPU_WHICH_PID; - level = CPU_LEVEL_WHICH; - } - if (iflag) { + } else { if (cpuset(&setid)) err(argc, "newid"); - which = CPU_WHICH_CPUSET; - level = CPU_LEVEL_WHICH; } if (lflag) { - if (cpuset_setaffinity(level, which, -1, - sizeof(mask), &mask) != 0) + if (cpuset_setaffinity(CPU_LEVEL_CPUSET, CPU_WHICH_PID, + -1, sizeof(mask), &mask) != 0) err(EXIT_FAILURE, "setaffinity"); } errno = 0; @@ -283,8 +278,6 @@ main(int argc, char *argv[]) /* * We're modifying something that presently exists. */ - if (iflag) - usage(); if (!lflag && (cflag || rflag)) usage(); if (!lflag && !sflag) @@ -316,7 +309,7 @@ usage(void) { fprintf(stderr, - "usage: cpuset [-l cpu-list] [-i | -s setid] cmd ...\n"); + "usage: cpuset [-l cpu-list] [-s setid] cmd ...\n"); fprintf(stderr, " cpuset [-l cpu-list] [-s setid] -p pid\n"); fprintf(stderr, |