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