xref: /freebsd/share/man/man9/cpuset.9 (revision 5546be25d6510ece38fa3f537fd2c6891bd5b3d3)
1*5546be25SConrad Meyer.\" Copyright (c) 2015 Conrad Meyer <cem@FreeBSD.org>
2*5546be25SConrad Meyer.\" All rights reserved.
3*5546be25SConrad Meyer.\"
4*5546be25SConrad Meyer.\" Redistribution and use in source and binary forms, with or without
5*5546be25SConrad Meyer.\" modification, are permitted provided that the following conditions
6*5546be25SConrad Meyer.\" are met:
7*5546be25SConrad Meyer.\" 1. Redistributions of source code must retain the above copyright
8*5546be25SConrad Meyer.\"    notice, this list of conditions and the following disclaimer.
9*5546be25SConrad Meyer.\" 2. Redistributions in binary form must reproduce the above copyright
10*5546be25SConrad Meyer.\"    notice, this list of conditions and the following disclaimer in the
11*5546be25SConrad Meyer.\"    documentation and/or other materials provided with the distribution.
12*5546be25SConrad Meyer.\"
13*5546be25SConrad Meyer.\" THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS''
14*5546be25SConrad Meyer.\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
15*5546be25SConrad Meyer.\" TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16*5546be25SConrad Meyer.\" PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE
17*5546be25SConrad Meyer.\" LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
18*5546be25SConrad Meyer.\" CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
19*5546be25SConrad Meyer.\" SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
20*5546be25SConrad Meyer.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
21*5546be25SConrad Meyer.\" CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
22*5546be25SConrad Meyer.\" ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
23*5546be25SConrad Meyer.\" POSSIBILITY OF SUCH DAMAGE.
24*5546be25SConrad Meyer.\"
25*5546be25SConrad Meyer.\" $FreeBSD$
26*5546be25SConrad Meyer.\"
27*5546be25SConrad Meyer.Dd October 20, 2015
28*5546be25SConrad Meyer.Dt CPUSET 9
29*5546be25SConrad Meyer.Os
30*5546be25SConrad Meyer.Sh NAME
31*5546be25SConrad Meyer.Nm cpuset(9)
32*5546be25SConrad Meyer\(em
33*5546be25SConrad Meyer.Nm CPUSET_T_INITIALIZER ,
34*5546be25SConrad Meyer.Nm CPUSET_FSET ,
35*5546be25SConrad Meyer.Nm CPU_CLR ,
36*5546be25SConrad Meyer.Nm CPU_COPY ,
37*5546be25SConrad Meyer.Nm CPU_ISSET ,
38*5546be25SConrad Meyer.Nm CPU_SET ,
39*5546be25SConrad Meyer.Nm CPU_ZERO ,
40*5546be25SConrad Meyer.Nm CPU_FILL ,
41*5546be25SConrad Meyer.Nm CPU_SETOF ,
42*5546be25SConrad Meyer.Nm CPU_EMPTY ,
43*5546be25SConrad Meyer.Nm CPU_ISFULLSET ,
44*5546be25SConrad Meyer.Nm CPU_FFS ,
45*5546be25SConrad Meyer.Nm CPU_COUNT ,
46*5546be25SConrad Meyer.Nm CPU_SUBSET ,
47*5546be25SConrad Meyer.Nm CPU_OVERLAP ,
48*5546be25SConrad Meyer.Nm CPU_CMP ,
49*5546be25SConrad Meyer.Nm CPU_OR ,
50*5546be25SConrad Meyer.Nm CPU_AND ,
51*5546be25SConrad Meyer.Nm CPU_NAND ,
52*5546be25SConrad Meyer.Nm CPU_CLR_ATOMIC ,
53*5546be25SConrad Meyer.Nm CPU_SET_ATOMIC ,
54*5546be25SConrad Meyer.Nm CPU_SET_ATOMIC_ACQ ,
55*5546be25SConrad Meyer.Nm CPU_AND_ATOMIC ,
56*5546be25SConrad Meyer.Nm CPU_OR_ATOMIC ,
57*5546be25SConrad Meyer.Nm CPU_COPY_STORE_REL
58*5546be25SConrad Meyer.Nd cpuset manipulation macros
59*5546be25SConrad Meyer.Sh SYNOPSIS
60*5546be25SConrad Meyer.In sys/_cpuset.h
61*5546be25SConrad Meyer.In sys/cpuset.h
62*5546be25SConrad Meyer.\"
63*5546be25SConrad Meyer.Fn CPUSET_T_INITIALIZER "ARRAY_CONTENTS"
64*5546be25SConrad Meyer.Vt CPUSET_FSET
65*5546be25SConrad Meyer.\"
66*5546be25SConrad Meyer.Fn CPU_CLR "size_t cpu_idx" "cpuset_t *cpuset"
67*5546be25SConrad Meyer.Fn CPU_COPY "cpuset_t *from" "cpuset_t *to"
68*5546be25SConrad Meyer.Ft bool
69*5546be25SConrad Meyer.Fn CPU_ISSET "size_t cpu_idx" "cpuset_t *cpuset"
70*5546be25SConrad Meyer.Fn CPU_SET "size_t cpu_idx" "cpuset_t *cpuset"
71*5546be25SConrad Meyer.Fn CPU_ZERO "cpuset_t *cpuset"
72*5546be25SConrad Meyer.Fn CPU_FILL "cpuset_t *cpuset"
73*5546be25SConrad Meyer.Fn CPU_SETOF "size_t cpu_idx" "cpuset_t *cpuset"
74*5546be25SConrad Meyer.Ft bool
75*5546be25SConrad Meyer.Fn CPU_EMPTY "cpuset_t *cpuset"
76*5546be25SConrad Meyer.Ft bool
77*5546be25SConrad Meyer.Fn CPU_ISFULLSET "cpuset_t *cpuset"
78*5546be25SConrad Meyer.Ft size_t
79*5546be25SConrad Meyer.Fn CPU_FFS "cpuset_t *cpuset"
80*5546be25SConrad Meyer.Ft size_t
81*5546be25SConrad Meyer.Fn CPU_COUNT "cpuset_t *cpuset"
82*5546be25SConrad Meyer.\"
83*5546be25SConrad Meyer.Ft bool
84*5546be25SConrad Meyer.Fn CPU_SUBSET "cpuset_t *haystack" "cpuset_t *needle"
85*5546be25SConrad Meyer.Ft bool
86*5546be25SConrad Meyer.Fn CPU_OVERLAP "cpuset_t *cpuset1" "cpuset_t *cpuset2"
87*5546be25SConrad Meyer.Ft bool
88*5546be25SConrad Meyer.Fn CPU_CMP "cpuset_t *cpuset1" "cpuset_t *cpuset2"
89*5546be25SConrad Meyer.Fn CPU_OR "cpuset_t *dst" "cpuset_t *src"
90*5546be25SConrad Meyer.Fn CPU_AND "cpuset_t *dst" "cpuset_t *src"
91*5546be25SConrad Meyer.Fn CPU_NAND "cpuset_t *dst" "cpuset_t *src"
92*5546be25SConrad Meyer.\"
93*5546be25SConrad Meyer.Fn CPU_CLR_ATOMIC "size_t cpu_idx" "cpuset_t *cpuset"
94*5546be25SConrad Meyer.Fn CPU_SET_ATOMIC "size_t cpu_idx" "cpuset_t *cpuset"
95*5546be25SConrad Meyer.Fn CPU_SET_ATOMIC_ACQ "size_t cpu_idx" "cpuset_t *cpuset"
96*5546be25SConrad Meyer.\"
97*5546be25SConrad Meyer.Fn CPU_AND_ATOMIC "cpuset_t *dst" "cpuset_t *src"
98*5546be25SConrad Meyer.Fn CPU_OR_ATOMIC "cpuset_t *dst" "cpuset_t *src"
99*5546be25SConrad Meyer.Fn CPU_COPY_STORE_REL "cpuset_t *from" "cpuset_t *to"
100*5546be25SConrad Meyer.Sh DESCRIPTION
101*5546be25SConrad MeyerThe
102*5546be25SConrad Meyer.Nm
103*5546be25SConrad Meyerfamily of macros provide a flexible and efficient CPU set implementation,
104*5546be25SConrad Meyerbacked by the
105*5546be25SConrad Meyer.Xr bitset 9
106*5546be25SConrad Meyermacros.
107*5546be25SConrad MeyerEach CPU is represented by a single bit.
108*5546be25SConrad MeyerThe maximum number of CPUs representable by
109*5546be25SConrad Meyer.Vt cpuset_t
110*5546be25SConrad Meyeris
111*5546be25SConrad Meyer.Va MAXCPU .
112*5546be25SConrad MeyerIndividual CPUs in cpusets are referenced with indices zero through
113*5546be25SConrad Meyer.Fa MAXCPU - 1 .
114*5546be25SConrad Meyer.Pp
115*5546be25SConrad MeyerThe
116*5546be25SConrad Meyer.Fn CPUSET_T_INITIALIZER
117*5546be25SConrad Meyermacro allows one to initialize a
118*5546be25SConrad Meyer.Vt cpuset_t
119*5546be25SConrad Meyerwith a compile time literal value.
120*5546be25SConrad Meyer.Pp
121*5546be25SConrad MeyerThe
122*5546be25SConrad Meyer.Fn CPUSET_FSET
123*5546be25SConrad Meyermacro defines a compile time literal, usable by
124*5546be25SConrad Meyer.Fn CPUSET_T_INITIALIZER ,
125*5546be25SConrad Meyerrepresenting a full cpuset (all CPUs present).
126*5546be25SConrad MeyerFor examples of
127*5546be25SConrad Meyer.Fn CPUSET_T_INITIALIZER
128*5546be25SConrad Meyerand
129*5546be25SConrad Meyer.Fn CPUSET_FSET
130*5546be25SConrad Meyerusage, see the
131*5546be25SConrad Meyer.Sx CPUSET_T_INITIALIZER EXAMPLE
132*5546be25SConrad Meyersection.
133*5546be25SConrad Meyer.Pp
134*5546be25SConrad MeyerThe
135*5546be25SConrad Meyer.Fn CPU_CLR
136*5546be25SConrad Meyermacro removes CPU
137*5546be25SConrad Meyer.Fa cpu_idx
138*5546be25SConrad Meyerfrom the cpuset pointed to by
139*5546be25SConrad Meyer.Fa cpuset .
140*5546be25SConrad MeyerThe
141*5546be25SConrad Meyer.Fn CPU_CLR_ATOMIC
142*5546be25SConrad Meyermacro is identical, but the bit representing the CPU is cleared with atomic
143*5546be25SConrad Meyermachine instructions.
144*5546be25SConrad Meyer.Pp
145*5546be25SConrad MeyerThe
146*5546be25SConrad Meyer.Fn CPU_COPY
147*5546be25SConrad Meyermacro copies the contents of the cpuset
148*5546be25SConrad Meyer.Fa from
149*5546be25SConrad Meyerto the cpuset
150*5546be25SConrad Meyer.Fa to .
151*5546be25SConrad Meyer.Fn CPU_COPY_STORE_REL
152*5546be25SConrad Meyeris similar, but copies component machine words from
153*5546be25SConrad Meyer.Fa from
154*5546be25SConrad Meyerand writes them to
155*5546be25SConrad Meyer.Fa to
156*5546be25SConrad Meyerwith atomic store with release semantics.
157*5546be25SConrad Meyer(That is, if
158*5546be25SConrad Meyer.Fa to
159*5546be25SConrad Meyeris composed of multiple machine words,
160*5546be25SConrad Meyer.Fn CPU_COPY_STORE_REL
161*5546be25SConrad Meyerperforms multiple individually atomic operations.)
162*5546be25SConrad Meyer.Pp
163*5546be25SConrad MeyerThe
164*5546be25SConrad Meyer.Fn CPU_SET
165*5546be25SConrad Meyermacro adds CPU
166*5546be25SConrad Meyer.Fa cpu_idx
167*5546be25SConrad Meyerto the cpuset pointed to by
168*5546be25SConrad Meyer.Fa cpuset ,
169*5546be25SConrad Meyerif it is not already present.
170*5546be25SConrad MeyerThe
171*5546be25SConrad Meyer.Fn CPU_SET_ATOMIC
172*5546be25SConrad Meyermacro is identical, but the bit representing the CPU is set with atomic
173*5546be25SConrad Meyermachine instructions.
174*5546be25SConrad MeyerThe
175*5546be25SConrad Meyer.Fn CPU_SET_ATOMIC_ACQ
176*5546be25SConrad Meyermacro sets the bit representing the CPU with atomic acquire semantics.
177*5546be25SConrad Meyer.Pp
178*5546be25SConrad MeyerThe
179*5546be25SConrad Meyer.Fn CPU_ZERO
180*5546be25SConrad Meyermacro removes all CPUs from
181*5546be25SConrad Meyer.Fa cpuset .
182*5546be25SConrad Meyer.Pp
183*5546be25SConrad MeyerThe
184*5546be25SConrad Meyer.Fn CPU_FILL
185*5546be25SConrad Meyermacro adds all CPUs to
186*5546be25SConrad Meyer.Fa cpuset .
187*5546be25SConrad Meyer.Pp
188*5546be25SConrad MeyerThe
189*5546be25SConrad Meyer.Fn CPU_SETOF
190*5546be25SConrad Meyermacro removes all CPUs in
191*5546be25SConrad Meyer.Fa cpuset
192*5546be25SConrad Meyerbefore adding only CPU
193*5546be25SConrad Meyer.Fa cpu_idx .
194*5546be25SConrad Meyer.Pp
195*5546be25SConrad MeyerThe
196*5546be25SConrad Meyer.Fn CPU_EMPTY
197*5546be25SConrad Meyermacro returns
198*5546be25SConrad Meyer.Dv true
199*5546be25SConrad Meyerif
200*5546be25SConrad Meyer.Fa cpuset
201*5546be25SConrad Meyeris empty.
202*5546be25SConrad Meyer.Pp
203*5546be25SConrad MeyerThe
204*5546be25SConrad Meyer.Fn CPU_ISFULLSET
205*5546be25SConrad Meyermacro returns
206*5546be25SConrad Meyer.Dv true
207*5546be25SConrad Meyerif
208*5546be25SConrad Meyer.Fa cpuset
209*5546be25SConrad Meyeris full (the set of all CPUs).
210*5546be25SConrad Meyer.Pp
211*5546be25SConrad MeyerThe
212*5546be25SConrad Meyer.Fn CPU_FFS
213*5546be25SConrad Meyermacro returns the 1-index of the first (lowest) CPU in
214*5546be25SConrad Meyer.Fa cpuset ,
215*5546be25SConrad Meyeror zero if
216*5546be25SConrad Meyer.Fa cpuset
217*5546be25SConrad Meyeris empty.
218*5546be25SConrad MeyerLike with
219*5546be25SConrad Meyer.Xr ffs 3 ,
220*5546be25SConrad Meyerto use the non-zero result of
221*5546be25SConrad Meyer.Fn CPU_FFS
222*5546be25SConrad Meyeras a
223*5546be25SConrad Meyer.Fa cpu_idx
224*5546be25SConrad Meyerindex parameter to any other
225*5546be25SConrad Meyer.Nm
226*5546be25SConrad Meyermacro, you must subtract one from the result.
227*5546be25SConrad Meyer.Pp
228*5546be25SConrad MeyerThe
229*5546be25SConrad Meyer.Fn CPU_COUNT
230*5546be25SConrad Meyermacro returns the total number of CPUs in
231*5546be25SConrad Meyer.Fa cpuset .
232*5546be25SConrad Meyer.Pp
233*5546be25SConrad MeyerThe
234*5546be25SConrad Meyer.Fn CPU_SUBSET
235*5546be25SConrad Meyermacro returns
236*5546be25SConrad Meyer.Dv true
237*5546be25SConrad Meyerif
238*5546be25SConrad Meyer.Fa needle
239*5546be25SConrad Meyeris a subset of
240*5546be25SConrad Meyer.Fa haystack .
241*5546be25SConrad Meyer.Pp
242*5546be25SConrad MeyerThe
243*5546be25SConrad Meyer.Fn CPU_OVERLAP
244*5546be25SConrad Meyermacro returns
245*5546be25SConrad Meyer.Dv true
246*5546be25SConrad Meyerif
247*5546be25SConrad Meyer.Fa cpuset1
248*5546be25SConrad Meyerand
249*5546be25SConrad Meyer.Fa cpuset2
250*5546be25SConrad Meyerhave any common CPUs.
251*5546be25SConrad Meyer(That is, if
252*5546be25SConrad Meyer.Fa cpuset1
253*5546be25SConrad MeyerAND
254*5546be25SConrad Meyer.Fa cpuset2
255*5546be25SConrad Meyeris not the empty set.)
256*5546be25SConrad Meyer.Pp
257*5546be25SConrad MeyerThe
258*5546be25SConrad Meyer.Fn CPU_CMP
259*5546be25SConrad Meyermacro returns
260*5546be25SConrad Meyer.Dv true
261*5546be25SConrad Meyerif
262*5546be25SConrad Meyer.Fa cpuset1
263*5546be25SConrad Meyeris NOT equal to
264*5546be25SConrad Meyer.Fa cpuset2 .
265*5546be25SConrad Meyer.Pp
266*5546be25SConrad MeyerThe
267*5546be25SConrad Meyer.Fn CPU_OR
268*5546be25SConrad Meyermacro adds CPUs present in
269*5546be25SConrad Meyer.Fa src
270*5546be25SConrad Meyerto
271*5546be25SConrad Meyer.Fa dst .
272*5546be25SConrad Meyer(It is the
273*5546be25SConrad Meyer.Nm
274*5546be25SConrad Meyerequivalent of the scalar:
275*5546be25SConrad Meyer.Fa dst
276*5546be25SConrad Meyer|=
277*5546be25SConrad Meyer.Fa src . )
278*5546be25SConrad Meyer.Fn CPU_OR_ATOMIC
279*5546be25SConrad Meyeris similar, but sets the bits representing CPUs in the component machine words
280*5546be25SConrad Meyerin
281*5546be25SConrad Meyer.Fa dst
282*5546be25SConrad Meyerwith atomic machine instructions.
283*5546be25SConrad Meyer(That is, if
284*5546be25SConrad Meyer.Fa dst
285*5546be25SConrad Meyeris composed of multiple machine words,
286*5546be25SConrad Meyer.Fn CPU_OR_ATOMIC
287*5546be25SConrad Meyerperforms multiple individually atomic operations.)
288*5546be25SConrad Meyer.Pp
289*5546be25SConrad MeyerThe
290*5546be25SConrad Meyer.Fn CPU_AND
291*5546be25SConrad Meyermacro removes CPUs absent from
292*5546be25SConrad Meyer.Fa src
293*5546be25SConrad Meyerfrom
294*5546be25SConrad Meyer.Fa dst .
295*5546be25SConrad Meyer(It is the
296*5546be25SConrad Meyer.Nm
297*5546be25SConrad Meyerequivalent of the scalar:
298*5546be25SConrad Meyer.Fa dst
299*5546be25SConrad Meyer&=
300*5546be25SConrad Meyer.Fa src . )
301*5546be25SConrad Meyer.Fn CPU_AND_ATOMIC
302*5546be25SConrad Meyeris similar, with the same atomic semantics as
303*5546be25SConrad Meyer.Fn CPU_OR_ATOMIC .
304*5546be25SConrad Meyer.Pp
305*5546be25SConrad MeyerThe
306*5546be25SConrad Meyer.Fn CPU_NAND
307*5546be25SConrad Meyermacro removes CPUs in
308*5546be25SConrad Meyer.Fa src
309*5546be25SConrad Meyerfrom
310*5546be25SConrad Meyer.Fa dst .
311*5546be25SConrad Meyer(It is the
312*5546be25SConrad Meyer.Nm
313*5546be25SConrad Meyerequivalent of the scalar:
314*5546be25SConrad Meyer.Fa dst
315*5546be25SConrad Meyer&=
316*5546be25SConrad Meyer.Fa ~ src . )
317*5546be25SConrad Meyer.Sh CPUSET_T_INITIALIZER EXAMPLE
318*5546be25SConrad Meyer.Bd -literal
319*5546be25SConrad Meyercpuset_t myset;
320*5546be25SConrad Meyer
321*5546be25SConrad Meyer/* Initialize myset to filled (all CPUs) */
322*5546be25SConrad Meyermyset = CPUSET_T_INITIALIZER(CPUSET_FSET);
323*5546be25SConrad Meyer
324*5546be25SConrad Meyer/* Initialize myset to only the lowest CPU */
325*5546be25SConrad Meyermyset = CPUSET_T_INITIALIZER(0x1);
326*5546be25SConrad Meyer.Ed
327*5546be25SConrad Meyer.Sh SEE ALSO
328*5546be25SConrad Meyer.Xr bitset 9
329*5546be25SConrad Meyer.Sh HISTORY
330*5546be25SConrad Meyer.In sys/cpuset.h
331*5546be25SConrad Meyerfirst appeared in
332*5546be25SConrad Meyer.Fx 7.1 ,
333*5546be25SConrad Meyerreleased in January 2009, and in
334*5546be25SConrad Meyer.Fx 8.0 ,
335*5546be25SConrad Meyerreleased in November 2009.
336*5546be25SConrad Meyer.Pp
337*5546be25SConrad MeyerThis manual page first appeared in
338*5546be25SConrad Meyer.Fx 11.0 .
339*5546be25SConrad Meyer.Sh AUTHORS
340*5546be25SConrad Meyer.An -nosplit
341*5546be25SConrad MeyerThe
342*5546be25SConrad Meyer.Nm
343*5546be25SConrad Meyermacros were written by
344*5546be25SConrad Meyer.An Jeff Roberson Aq Mt jeff@FreeBSD.org .
345*5546be25SConrad MeyerThis manual page was written by
346*5546be25SConrad Meyer.An Conrad Meyer Aq Mt cem@FreeBSD.org .
347*5546be25SConrad Meyer.Sh CAVEATS
348*5546be25SConrad MeyerUnlike every other reference to individual set members, which are zero-indexed,
349*5546be25SConrad Meyer.Fn CPU_FFS
350*5546be25SConrad Meyerreturns a one-indexed result (or zero if the cpuset is empty).
351