NAME
kcpuset,
kcpuset_create,
kcpuset_destroy,
kcpuset_clone,
kcpuset_copy,
kcpuset_use,
kcpuset_unuse,
kcpuset_copyin,
kcpuset_copyout,
kcpuset_zero,
kcpuset_fill,
kcpuset_set,
kcpuset_clear,
kcpuset_isset,
kcpuset_isotherset,
kcpuset_iszero,
kcpuset_match,
kcpuset_intersect,
kcpuset_merge,
kcpuset_remove,
kcpuset_ffs,
kcpuset_ffs_intersecting,
kcpuset_countset,
kcpuset_atomic_set,
kcpuset_atomic_clear,
kcpuset_atomicly_intersect,
kcpuset_atomicly_merge,
kcpuset_atomicly_remove,
kcpuset_export_32
—
dynamic kernel CPU sets
SYNOPSIS
#include <sys/kcpuset.h>
void
kcpuset_create(
kcpuset_t
**retkcp,
bool zero);
void
kcpuset_destroy(
kcpuset_t
*kcp);
void
kcpuset_clone(
kcpuset_t
**retkcp,
const kcpuset_t
*skcp);
void
kcpuset_copy(
kcpuset_t
*dkcp,
const kcpuset_t
*skcp);
void
kcpuset_use(
kcpuset_t
*kcp);
void
kcpuset_unuse(
kcpuset_t
*kcp,
kcpuset_t
**lst);
int
kcpuset_copyin(
const
cpuset_t *ucp,
kcpuset_t
*kcp,
size_t len);
int
kcpuset_copyout(
kcpuset_t
*kcp,
cpuset_t *ucp,
size_t len);
void
kcpuset_zero(
kcpuset_t
*kcp);
void
kcpuset_fill(
kcpuset_t
*kcp);
void
kcpuset_set(
kcpuset_t
*kcp,
cpuid_t cpu);
void
kcpuset_clear(
kcpuset_t
*kcp,
cpuid_t cpu);
bool
kcpuset_isset(
const
kcpuset_t * kcp,
cpuid_t
cpu);
bool
kcpuset_isotherset(
const
kcpuset_t * kcp,
cpuid_t
cpu);
bool
kcpuset_iszero(
const
kcpuset_t *kcp);
bool
kcpuset_intersecting_p(
const
kcpuset_t *kcp1,
const
kcpuset_t *kcp2);
bool
kcpuset_match(
const
kcpuset_t *kcp1,
const
kcpuset_t *kcp2);
void
kcpuset_intersect(
kcpuset_t
*kcp1,
const kcpuset_t
*kcp2);
void
kcpuset_merge(
kcpuset_t
*kcp1,
const kcpuset_t
*kcp2);
void
kcpuset_remove(
kcpuset_t
*kcp1,
const kcpuset_t
*kcp2);
cpuid_t
kcpuset_ffs(
const
kcpuset_t *kcp);
cpuid_t
kcpuset_ffs_intersecting(
const
kcpuset_t *kcp1,
const
kcpuset_t *kcp2);
int
kcpuset_countset(
const
kcpuset_t *kcp);
void
kcpuset_atomic_set(
kcpuset_t
*kcp,
cpuid_t cpu);
void
kcpuset_atomic_clear(
kcpuset_t
*kcp,
cpuid_t cpu);
void
kcpuset_atomicly_intersect(
kcpuset_t
*kcp1,
const kcpuset_t
*kcp2);
void
kcpuset_atomicly_merge(
kcpuset_t
*kcp1,
const kcpuset_t
*kcp2);
void
kcpuset_atomicly_remove(
kcpuset_t
*kcp1,
const kcpuset_t
*kcp2);
void
kcpuset_export_u32(
const
kcpuset_t *kcp,
uint32_t
*bitfield,
size_t
len);
DESCRIPTION
The machine-independent
kcpuset subsystem provides support for
dynamic processor sets. Conceptually
kcpuset can be
understood to be the kernel equivalent of the user space
cpuset(3) interface.
FUNCTIONS
-
-
- kcpuset_create(retkcp,
zero)
- The kcpuset_create() function creates a
dynamic CPU set and stores the result to retkcp. If
the boolean zero is not false, the allocated set is
also initialized to zero.
-
-
- kcpuset_destroy(kcp)
- Destroys the CPU set kcp and
schedules any linked CPU sets for deferred destruction.
-
-
- kcpuset_copy(dkcp,
skcp)
- Copies the CPU set pointed by skcp to
dkcp.
-
-
- kcpuset_clone(retkcp,
skcp)
- Creates a dynamic CPU set and stores the result to
retkcp and copies the CPU set pointed by
skcp to the new CPU set.
-
-
- kcpuset_use(kcp)
- Marks kcp as being in use by
increasing the reference count of the object. Note that initially
kcpuset_create() sets the reference count to 1.
-
-
- kcpuset_unuse(kcp,
lst)
- Decreases the internal reference count of
kcp, and on the last reference (when the count
reaches zero), destroys kcp. If
lst is not
NULL, then
instead of destroying, kcp will be added to the
lst list for a deferred destruction.
-
-
- kcpuset_copyin(ucp,
kcp, len)
- Copies the len bytes long user-space
CPU set ucp to the kernel CPU set
kcp.
-
-
- kcpuset_copyout(kcp,
ucp, len)
- Copies the kernel CPU set kcp to the
user-space CPU set ucp.
-
-
- kcpuset_zero(kcp)
- Clears the set kcp.
-
-
- kcpuset_fill(kcp)
- Fills the whole set kcp with
ones.
-
-
- kcpuset_set(kcp,
cpu)
- Adds cpu to the set
kcp.
-
-
- kcpuset_clear(kcp,
cpu)
- Removes cpu from the set
kcp.
-
-
- kcpuset_isset(kcp,
cpu)
- Returns true if cpu is part of the
CPU set kcp.
-
-
- kcpuset_isotherset(kcp,
cpu)
- Returns true if there any CPUs other than
cpu in the CPU set kcp.
-
-
- kcpuset_iszero(kcp)
- Returns true if the set kcp is
empty.
-
-
- kcpuset_match(kcp1,
kcp2)
- Compares the sets kcp1 and
kcp2, returning true if these are identical.
-
-
- kcpuset_intersect(kcp1,
kcp2)
- Removes any CPU not set in kcp2 from
the set kcp1.
-
-
- kcpuset_merge(kcp1,
kcp2)
- Merges the set kcp2 to the set
kcp1.
-
-
- kcpuset_remove(kcp1,
kcp2)
- Removes any CPU present in kcp2 from
the set kcp1.
-
-
- kcpuset_ffs(kcp)
- Returns the lowest numbered cpu
present in kcp plus 1. If kcp
is empty, a value of 0 is returned. kcp
-
-
- kcpuset_ffs_intersecting(kcp1,
kcp2)
- Returns the lowest numbered cpu
present in the intersection of kcp1 and
kcp2 plus 1. If the intersection is empty, a value
of 0 is returned.
-
-
- kcpuset_countset(kcp)
- Counts how many CPUs are in the set
kcp.
-
-
- kcpuset_atomic_set(kcp,
cpu)
- The kcpuset_atomic_set() function
operates as kcpuset_set(), but the operation is atomic;
see atomic_ops(3) for
more details.
-
-
- kcpuset_atomic_clear(kcp,
cpu)
- Removes cpu from the CPU set
kcp atomically.
-
-
- kcpuset_atomicly_intersect(kcp1,
kcp2)
- The kcpuset_atomicly_intersect() function
operates as kcpuset_intersect(), but the operation is
performed using atomic operations; see
atomic_ops(3) for more
details.
-
-
- kcpuset_atomicly_merge(kcp1,
kcp2)
- The kcpuset_atomicly_merge() function
operates as kcpuset_merge(), but the operation is
performed using atomic operations; see
atomic_ops(3) for more
details.
-
-
- kcpuset_atomicly_remove(kcp1,
kcp2)
- The kcpuset_atomicly_remove() function
operates as kcpuset_remove(), but the operation is
performed using atomic operations; see
atomic_ops(3) for more
details.
-
-
- kcpuset_export_u32(kcp,
bitfield, len)
- Exports the CPU set kcp into a format
of 32-bit integer array, specified by bitfield and
length in bytes by len. An integers is in the host
byte-order and represents a bit field. The first bit at index zero
represents CPU number 0, and so on.
CODE REFERENCES
The
kcpuset subsystem is implemented within
sys/kern/subr_kcpuset.c.
SEE ALSO
cpuset(3)
HISTORY
The
kcpuset subsystem first appeared in
NetBSD 6.0.