KCPUSET(9) | Kernel Developer's Manual | KCPUSET(9)

# 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.

July 17, 2013 | NetBSD 9.5