15546be25SConrad Meyer.\" Copyright (c) 2015 Conrad Meyer <cem@FreeBSD.org> 25546be25SConrad Meyer.\" All rights reserved. 35546be25SConrad Meyer.\" 45546be25SConrad Meyer.\" Redistribution and use in source and binary forms, with or without 55546be25SConrad Meyer.\" modification, are permitted provided that the following conditions 65546be25SConrad Meyer.\" are met: 75546be25SConrad Meyer.\" 1. Redistributions of source code must retain the above copyright 85546be25SConrad Meyer.\" notice, this list of conditions and the following disclaimer. 95546be25SConrad Meyer.\" 2. Redistributions in binary form must reproduce the above copyright 105546be25SConrad Meyer.\" notice, this list of conditions and the following disclaimer in the 115546be25SConrad Meyer.\" documentation and/or other materials provided with the distribution. 125546be25SConrad Meyer.\" 135546be25SConrad Meyer.\" THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' 145546be25SConrad Meyer.\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED 155546be25SConrad Meyer.\" TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 165546be25SConrad Meyer.\" PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE 175546be25SConrad Meyer.\" LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 185546be25SConrad Meyer.\" CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 195546be25SConrad Meyer.\" SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 205546be25SConrad Meyer.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 215546be25SConrad Meyer.\" CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 225546be25SConrad Meyer.\" ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 235546be25SConrad Meyer.\" POSSIBILITY OF SUCH DAMAGE. 245546be25SConrad Meyer.\" 255546be25SConrad Meyer.\" $FreeBSD$ 265546be25SConrad Meyer.\" 275546be25SConrad Meyer.Dd October 20, 2015 285546be25SConrad Meyer.Dt CPUSET 9 295546be25SConrad Meyer.Os 305546be25SConrad Meyer.Sh NAME 315546be25SConrad Meyer.Nm cpuset(9) 325546be25SConrad Meyer\(em 335546be25SConrad Meyer.Nm CPUSET_T_INITIALIZER , 345546be25SConrad Meyer.Nm CPUSET_FSET , 355546be25SConrad Meyer.Nm CPU_CLR , 365546be25SConrad Meyer.Nm CPU_COPY , 375546be25SConrad Meyer.Nm CPU_ISSET , 385546be25SConrad Meyer.Nm CPU_SET , 395546be25SConrad Meyer.Nm CPU_ZERO , 405546be25SConrad Meyer.Nm CPU_FILL , 415546be25SConrad Meyer.Nm CPU_SETOF , 425546be25SConrad Meyer.Nm CPU_EMPTY , 435546be25SConrad Meyer.Nm CPU_ISFULLSET , 445546be25SConrad Meyer.Nm CPU_FFS , 455546be25SConrad Meyer.Nm CPU_COUNT , 465546be25SConrad Meyer.Nm CPU_SUBSET , 475546be25SConrad Meyer.Nm CPU_OVERLAP , 485546be25SConrad Meyer.Nm CPU_CMP , 495546be25SConrad Meyer.Nm CPU_OR , 505546be25SConrad Meyer.Nm CPU_AND , 515546be25SConrad Meyer.Nm CPU_NAND , 525546be25SConrad Meyer.Nm CPU_CLR_ATOMIC , 535546be25SConrad Meyer.Nm CPU_SET_ATOMIC , 545546be25SConrad Meyer.Nm CPU_SET_ATOMIC_ACQ , 555546be25SConrad Meyer.Nm CPU_AND_ATOMIC , 565546be25SConrad Meyer.Nm CPU_OR_ATOMIC , 575546be25SConrad Meyer.Nm CPU_COPY_STORE_REL 585546be25SConrad Meyer.Nd cpuset manipulation macros 595546be25SConrad Meyer.Sh SYNOPSIS 605546be25SConrad Meyer.In sys/_cpuset.h 615546be25SConrad Meyer.In sys/cpuset.h 625546be25SConrad Meyer.\" 635546be25SConrad Meyer.Fn CPUSET_T_INITIALIZER "ARRAY_CONTENTS" 645546be25SConrad Meyer.Vt CPUSET_FSET 655546be25SConrad Meyer.\" 665546be25SConrad Meyer.Fn CPU_CLR "size_t cpu_idx" "cpuset_t *cpuset" 675546be25SConrad Meyer.Fn CPU_COPY "cpuset_t *from" "cpuset_t *to" 685546be25SConrad Meyer.Ft bool 695546be25SConrad Meyer.Fn CPU_ISSET "size_t cpu_idx" "cpuset_t *cpuset" 705546be25SConrad Meyer.Fn CPU_SET "size_t cpu_idx" "cpuset_t *cpuset" 715546be25SConrad Meyer.Fn CPU_ZERO "cpuset_t *cpuset" 725546be25SConrad Meyer.Fn CPU_FILL "cpuset_t *cpuset" 735546be25SConrad Meyer.Fn CPU_SETOF "size_t cpu_idx" "cpuset_t *cpuset" 745546be25SConrad Meyer.Ft bool 755546be25SConrad Meyer.Fn CPU_EMPTY "cpuset_t *cpuset" 765546be25SConrad Meyer.Ft bool 775546be25SConrad Meyer.Fn CPU_ISFULLSET "cpuset_t *cpuset" 785546be25SConrad Meyer.Ft size_t 795546be25SConrad Meyer.Fn CPU_FFS "cpuset_t *cpuset" 805546be25SConrad Meyer.Ft size_t 815546be25SConrad Meyer.Fn CPU_COUNT "cpuset_t *cpuset" 825546be25SConrad Meyer.\" 835546be25SConrad Meyer.Ft bool 845546be25SConrad Meyer.Fn CPU_SUBSET "cpuset_t *haystack" "cpuset_t *needle" 855546be25SConrad Meyer.Ft bool 865546be25SConrad Meyer.Fn CPU_OVERLAP "cpuset_t *cpuset1" "cpuset_t *cpuset2" 875546be25SConrad Meyer.Ft bool 885546be25SConrad Meyer.Fn CPU_CMP "cpuset_t *cpuset1" "cpuset_t *cpuset2" 895546be25SConrad Meyer.Fn CPU_OR "cpuset_t *dst" "cpuset_t *src" 905546be25SConrad Meyer.Fn CPU_AND "cpuset_t *dst" "cpuset_t *src" 915546be25SConrad Meyer.Fn CPU_NAND "cpuset_t *dst" "cpuset_t *src" 925546be25SConrad Meyer.\" 935546be25SConrad Meyer.Fn CPU_CLR_ATOMIC "size_t cpu_idx" "cpuset_t *cpuset" 945546be25SConrad Meyer.Fn CPU_SET_ATOMIC "size_t cpu_idx" "cpuset_t *cpuset" 955546be25SConrad Meyer.Fn CPU_SET_ATOMIC_ACQ "size_t cpu_idx" "cpuset_t *cpuset" 965546be25SConrad Meyer.\" 975546be25SConrad Meyer.Fn CPU_AND_ATOMIC "cpuset_t *dst" "cpuset_t *src" 985546be25SConrad Meyer.Fn CPU_OR_ATOMIC "cpuset_t *dst" "cpuset_t *src" 995546be25SConrad Meyer.Fn CPU_COPY_STORE_REL "cpuset_t *from" "cpuset_t *to" 1005546be25SConrad Meyer.Sh DESCRIPTION 1015546be25SConrad MeyerThe 1025546be25SConrad Meyer.Nm 1035546be25SConrad Meyerfamily of macros provide a flexible and efficient CPU set implementation, 1045546be25SConrad Meyerbacked by the 1055546be25SConrad Meyer.Xr bitset 9 1065546be25SConrad Meyermacros. 1075546be25SConrad MeyerEach CPU is represented by a single bit. 1085546be25SConrad MeyerThe maximum number of CPUs representable by 1095546be25SConrad Meyer.Vt cpuset_t 1105546be25SConrad Meyeris 1115546be25SConrad Meyer.Va MAXCPU . 1125546be25SConrad MeyerIndividual CPUs in cpusets are referenced with indices zero through 1135546be25SConrad Meyer.Fa MAXCPU - 1 . 1145546be25SConrad Meyer.Pp 1155546be25SConrad MeyerThe 1165546be25SConrad Meyer.Fn CPUSET_T_INITIALIZER 1175546be25SConrad Meyermacro allows one to initialize a 1185546be25SConrad Meyer.Vt cpuset_t 1195546be25SConrad Meyerwith a compile time literal value. 1205546be25SConrad Meyer.Pp 1215546be25SConrad MeyerThe 1225546be25SConrad Meyer.Fn CPUSET_FSET 1235546be25SConrad Meyermacro defines a compile time literal, usable by 1245546be25SConrad Meyer.Fn CPUSET_T_INITIALIZER , 1255546be25SConrad Meyerrepresenting a full cpuset (all CPUs present). 1265546be25SConrad MeyerFor examples of 1275546be25SConrad Meyer.Fn CPUSET_T_INITIALIZER 1285546be25SConrad Meyerand 1295546be25SConrad Meyer.Fn CPUSET_FSET 1305546be25SConrad Meyerusage, see the 1315546be25SConrad Meyer.Sx CPUSET_T_INITIALIZER EXAMPLE 1325546be25SConrad Meyersection. 1335546be25SConrad Meyer.Pp 1345546be25SConrad MeyerThe 1355546be25SConrad Meyer.Fn CPU_CLR 1365546be25SConrad Meyermacro removes CPU 1375546be25SConrad Meyer.Fa cpu_idx 1385546be25SConrad Meyerfrom the cpuset pointed to by 1395546be25SConrad Meyer.Fa cpuset . 1405546be25SConrad MeyerThe 1415546be25SConrad Meyer.Fn CPU_CLR_ATOMIC 1425546be25SConrad Meyermacro is identical, but the bit representing the CPU is cleared with atomic 1435546be25SConrad Meyermachine instructions. 1445546be25SConrad Meyer.Pp 1455546be25SConrad MeyerThe 1465546be25SConrad Meyer.Fn CPU_COPY 1475546be25SConrad Meyermacro copies the contents of the cpuset 1485546be25SConrad Meyer.Fa from 1495546be25SConrad Meyerto the cpuset 1505546be25SConrad Meyer.Fa to . 1515546be25SConrad Meyer.Fn CPU_COPY_STORE_REL 1525546be25SConrad Meyeris similar, but copies component machine words from 1535546be25SConrad Meyer.Fa from 1545546be25SConrad Meyerand writes them to 1555546be25SConrad Meyer.Fa to 1565546be25SConrad Meyerwith atomic store with release semantics. 1575546be25SConrad Meyer(That is, if 1585546be25SConrad Meyer.Fa to 1595546be25SConrad Meyeris composed of multiple machine words, 1605546be25SConrad Meyer.Fn CPU_COPY_STORE_REL 1615546be25SConrad Meyerperforms multiple individually atomic operations.) 1625546be25SConrad Meyer.Pp 1635546be25SConrad MeyerThe 1645546be25SConrad Meyer.Fn CPU_SET 1655546be25SConrad Meyermacro adds CPU 1665546be25SConrad Meyer.Fa cpu_idx 1675546be25SConrad Meyerto the cpuset pointed to by 1685546be25SConrad Meyer.Fa cpuset , 1695546be25SConrad Meyerif it is not already present. 1705546be25SConrad MeyerThe 1715546be25SConrad Meyer.Fn CPU_SET_ATOMIC 1725546be25SConrad Meyermacro is identical, but the bit representing the CPU is set with atomic 1735546be25SConrad Meyermachine instructions. 1745546be25SConrad MeyerThe 1755546be25SConrad Meyer.Fn CPU_SET_ATOMIC_ACQ 1765546be25SConrad Meyermacro sets the bit representing the CPU with atomic acquire semantics. 1775546be25SConrad Meyer.Pp 1785546be25SConrad MeyerThe 1795546be25SConrad Meyer.Fn CPU_ZERO 1805546be25SConrad Meyermacro removes all CPUs from 1815546be25SConrad Meyer.Fa cpuset . 1825546be25SConrad Meyer.Pp 1835546be25SConrad MeyerThe 1845546be25SConrad Meyer.Fn CPU_FILL 1855546be25SConrad Meyermacro adds all CPUs to 1865546be25SConrad Meyer.Fa cpuset . 1875546be25SConrad Meyer.Pp 1885546be25SConrad MeyerThe 1895546be25SConrad Meyer.Fn CPU_SETOF 1905546be25SConrad Meyermacro removes all CPUs in 1915546be25SConrad Meyer.Fa cpuset 1925546be25SConrad Meyerbefore adding only CPU 1935546be25SConrad Meyer.Fa cpu_idx . 1945546be25SConrad Meyer.Pp 1955546be25SConrad MeyerThe 1965546be25SConrad Meyer.Fn CPU_EMPTY 1975546be25SConrad Meyermacro returns 1985546be25SConrad Meyer.Dv true 1995546be25SConrad Meyerif 2005546be25SConrad Meyer.Fa cpuset 2015546be25SConrad Meyeris empty. 2025546be25SConrad Meyer.Pp 2035546be25SConrad MeyerThe 2045546be25SConrad Meyer.Fn CPU_ISFULLSET 2055546be25SConrad Meyermacro returns 2065546be25SConrad Meyer.Dv true 2075546be25SConrad Meyerif 2085546be25SConrad Meyer.Fa cpuset 2095546be25SConrad Meyeris full (the set of all CPUs). 2105546be25SConrad Meyer.Pp 2115546be25SConrad MeyerThe 2125546be25SConrad Meyer.Fn CPU_FFS 2135546be25SConrad Meyermacro returns the 1-index of the first (lowest) CPU in 2145546be25SConrad Meyer.Fa cpuset , 2155546be25SConrad Meyeror zero if 2165546be25SConrad Meyer.Fa cpuset 2175546be25SConrad Meyeris empty. 2185546be25SConrad MeyerLike with 2195546be25SConrad Meyer.Xr ffs 3 , 2205546be25SConrad Meyerto use the non-zero result of 2215546be25SConrad Meyer.Fn CPU_FFS 2225546be25SConrad Meyeras a 2235546be25SConrad Meyer.Fa cpu_idx 2245546be25SConrad Meyerindex parameter to any other 2255546be25SConrad Meyer.Nm 2265546be25SConrad Meyermacro, you must subtract one from the result. 2275546be25SConrad Meyer.Pp 2285546be25SConrad MeyerThe 2295546be25SConrad Meyer.Fn CPU_COUNT 2305546be25SConrad Meyermacro returns the total number of CPUs in 2315546be25SConrad Meyer.Fa cpuset . 2325546be25SConrad Meyer.Pp 2335546be25SConrad MeyerThe 2345546be25SConrad Meyer.Fn CPU_SUBSET 2355546be25SConrad Meyermacro returns 2365546be25SConrad Meyer.Dv true 2375546be25SConrad Meyerif 2385546be25SConrad Meyer.Fa needle 2395546be25SConrad Meyeris a subset of 2405546be25SConrad Meyer.Fa haystack . 2415546be25SConrad Meyer.Pp 2425546be25SConrad MeyerThe 2435546be25SConrad Meyer.Fn CPU_OVERLAP 2445546be25SConrad Meyermacro returns 2455546be25SConrad Meyer.Dv true 2465546be25SConrad Meyerif 2475546be25SConrad Meyer.Fa cpuset1 2485546be25SConrad Meyerand 2495546be25SConrad Meyer.Fa cpuset2 2505546be25SConrad Meyerhave any common CPUs. 2515546be25SConrad Meyer(That is, if 2525546be25SConrad Meyer.Fa cpuset1 2535546be25SConrad MeyerAND 2545546be25SConrad Meyer.Fa cpuset2 2555546be25SConrad Meyeris not the empty set.) 2565546be25SConrad Meyer.Pp 2575546be25SConrad MeyerThe 2585546be25SConrad Meyer.Fn CPU_CMP 2595546be25SConrad Meyermacro returns 2605546be25SConrad Meyer.Dv true 2615546be25SConrad Meyerif 2625546be25SConrad Meyer.Fa cpuset1 2635546be25SConrad Meyeris NOT equal to 2645546be25SConrad Meyer.Fa cpuset2 . 2655546be25SConrad Meyer.Pp 2665546be25SConrad MeyerThe 2675546be25SConrad Meyer.Fn CPU_OR 2685546be25SConrad Meyermacro adds CPUs present in 2695546be25SConrad Meyer.Fa src 2705546be25SConrad Meyerto 2715546be25SConrad Meyer.Fa dst . 2725546be25SConrad Meyer(It is the 2735546be25SConrad Meyer.Nm 2745546be25SConrad Meyerequivalent of the scalar: 2755546be25SConrad Meyer.Fa dst 2765546be25SConrad Meyer|= 2775546be25SConrad Meyer.Fa src . ) 2785546be25SConrad Meyer.Fn CPU_OR_ATOMIC 2795546be25SConrad Meyeris similar, but sets the bits representing CPUs in the component machine words 2805546be25SConrad Meyerin 2815546be25SConrad Meyer.Fa dst 2825546be25SConrad Meyerwith atomic machine instructions. 2835546be25SConrad Meyer(That is, if 2845546be25SConrad Meyer.Fa dst 2855546be25SConrad Meyeris composed of multiple machine words, 2865546be25SConrad Meyer.Fn CPU_OR_ATOMIC 2875546be25SConrad Meyerperforms multiple individually atomic operations.) 2885546be25SConrad Meyer.Pp 2895546be25SConrad MeyerThe 2905546be25SConrad Meyer.Fn CPU_AND 2915546be25SConrad Meyermacro removes CPUs absent from 2925546be25SConrad Meyer.Fa src 2935546be25SConrad Meyerfrom 2945546be25SConrad Meyer.Fa dst . 2955546be25SConrad Meyer(It is the 2965546be25SConrad Meyer.Nm 2975546be25SConrad Meyerequivalent of the scalar: 2985546be25SConrad Meyer.Fa dst 2995546be25SConrad Meyer&= 3005546be25SConrad Meyer.Fa src . ) 3015546be25SConrad Meyer.Fn CPU_AND_ATOMIC 3025546be25SConrad Meyeris similar, with the same atomic semantics as 3035546be25SConrad Meyer.Fn CPU_OR_ATOMIC . 3045546be25SConrad Meyer.Pp 3055546be25SConrad MeyerThe 3065546be25SConrad Meyer.Fn CPU_NAND 3075546be25SConrad Meyermacro removes CPUs in 3085546be25SConrad Meyer.Fa src 3095546be25SConrad Meyerfrom 3105546be25SConrad Meyer.Fa dst . 3115546be25SConrad Meyer(It is the 3125546be25SConrad Meyer.Nm 3135546be25SConrad Meyerequivalent of the scalar: 3145546be25SConrad Meyer.Fa dst 3155546be25SConrad Meyer&= 3165546be25SConrad Meyer.Fa ~ src . ) 3175546be25SConrad Meyer.Sh CPUSET_T_INITIALIZER EXAMPLE 3185546be25SConrad Meyer.Bd -literal 3195546be25SConrad Meyercpuset_t myset; 3205546be25SConrad Meyer 3215546be25SConrad Meyer/* Initialize myset to filled (all CPUs) */ 3225546be25SConrad Meyermyset = CPUSET_T_INITIALIZER(CPUSET_FSET); 3235546be25SConrad Meyer 3245546be25SConrad Meyer/* Initialize myset to only the lowest CPU */ 3255546be25SConrad Meyermyset = CPUSET_T_INITIALIZER(0x1); 3265546be25SConrad Meyer.Ed 3275546be25SConrad Meyer.Sh SEE ALSO 328*8b584e9dSConrad Meyer.Xr cpuset 1 , 329*8b584e9dSConrad Meyer.Xr cpuset 2 , 3305546be25SConrad Meyer.Xr bitset 9 3315546be25SConrad Meyer.Sh HISTORY 3325546be25SConrad Meyer.In sys/cpuset.h 3335546be25SConrad Meyerfirst appeared in 3345546be25SConrad Meyer.Fx 7.1 , 3355546be25SConrad Meyerreleased in January 2009, and in 3365546be25SConrad Meyer.Fx 8.0 , 3375546be25SConrad Meyerreleased in November 2009. 3385546be25SConrad Meyer.Pp 3395546be25SConrad MeyerThis manual page first appeared in 3405546be25SConrad Meyer.Fx 11.0 . 3415546be25SConrad Meyer.Sh AUTHORS 3425546be25SConrad Meyer.An -nosplit 3435546be25SConrad MeyerThe 3445546be25SConrad Meyer.Nm 3455546be25SConrad Meyermacros were written by 3465546be25SConrad Meyer.An Jeff Roberson Aq Mt jeff@FreeBSD.org . 3475546be25SConrad MeyerThis manual page was written by 3485546be25SConrad Meyer.An Conrad Meyer Aq Mt cem@FreeBSD.org . 3495546be25SConrad Meyer.Sh CAVEATS 3505546be25SConrad MeyerUnlike every other reference to individual set members, which are zero-indexed, 3515546be25SConrad Meyer.Fn CPU_FFS 3525546be25SConrad Meyerreturns a one-indexed result (or zero if the cpuset is empty). 353