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