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.