NAME
percpu
,
percpu_alloc
, percpu_free
,
percpu_getref
,
percpu_putref
,
percpu_foreach
—
per-CPU storage allocator
SYNOPSIS
#include
<sys/percpu.h>
typedef void (*percpu_callback_t)(void *, void *, struct cpu_info *);
percpu_t *
percpu_alloc
(size_t
size);
void
percpu_free
(percpu_t
*pc, size_t
size);
void *
percpu_getref
(percpu_t
*pc);
void
percpu_putref
(percpu_t
*pc);
void
percpu_foreach
(percpu_t
*pc, percpu_callback_t
cb, void *arg);
DESCRIPTION
The machine-independent percpu
interface
provides per-CPU, CPU-local memory reservations to kernel subsystems.
percpu_alloc
(size);
reserves on each CPU an independent memory region of
size bytes that is local to that CPU, returning a
handle (percpu_t) to those regions. A thread may
subsequently ask for a pointer, p, to the region held
by the percpu_t on the thread's current CPU. Until the
thread relinquishes the pointer, or voluntarily sleeps, the thread may read
or write the region at p without causing
interprocessor memory synchronization.
FUNCTIONS
percpu_alloc
(size)- Call this in thread context to allocate size bytes
of local storage on each CPU. The storage is initialized with zeroes.
Treat this as an expensive operation.
percpu_alloc
() returns a handle for the per-CPU storage. percpu_free
(pc, size)- Call this in thread context to return to the system the per-CPU storage
held by pc. size should match
the size passed to
percpu_alloc
(). Whenpercpu_free
() returns, pc is undefined. Treat this as an expensive operation. percpu_getref
(pc)- Disable preemption and return a pointer to the storage held by
pc on the local CPU. Use
percpu_getref
() in either thread or interrupt context. Follow eachpercpu_getref
() call with a matching call topercpu_putref
(). percpu_putref
(pc)- Indicate that the thread is finished with the pointer returned by the
matching call to
percpu_getref
(). Re-enables preemption. percpu_foreach
(pc, cb, arg)- On each CPU, for ci the corresponding
struct cpu_info * and p the
CPU-local storage held by pc, run
(*cb)
(p, arg, ci);. Call this in thread context. cb should be non-blocking and fast. Do not rely on cb to be run on the CPUs in any particular order.
CODE REFERENCES
The percpu
interface is implemented within
the file sys/kern/subr_percpu.c.
SEE ALSO
HISTORY
The percpu
interface first appeared in
NetBSD 6.0.
AUTHORS
YAMAMOTO Takashi <yamt@NetBSD.org>