API Reference
Relevant source files
This document provides a comprehensive reference for all public APIs, macros, and functions in the percpu crate ecosystem. It covers the main user-facing interfaces for defining and accessing per-CPU data structures.
For detailed information about the def_percpu macro syntax and usage patterns, see def_percpu Macro. For runtime initialization and management functions, see Runtime Functions. For guidance on safe usage and preemption handling, see Safety and Preemption.
API Overview
The percpu crate provides a declarative interface for per-CPU data management through the def_percpu attribute macro and a set of runtime functions for system initialization.
Complete API Surface
flowchart TD
subgraph subGraph5["Internal APIs"]
PERCPU_AREA_BASE["percpu_area_base(cpu_id) -> usize"]
NOPREEMPT_GUARD["NoPreemptGuard"]
PERCPU_SYMBOL_OFFSET["percpu_symbol_offset!"]
end
subgraph subGraph4["Generated Per-Variable APIs"]
WRAPPER["VAR_WRAPPERZero-sized struct"]
STATIC_VAR["VAR: VAR_WRAPPERStatic instance"]
subgraph subGraph3["Primitive Type Methods"]
READ_CURRENT_RAW["read_current_raw() -> T"]
WRITE_CURRENT_RAW["write_current_raw(val: T)"]
READ_CURRENT["read_current() -> T"]
WRITE_CURRENT["write_current(val: T)"]
end
subgraph subGraph2["Raw Access Methods"]
CURRENT_REF_RAW["current_ref_raw() -> &T"]
CURRENT_REF_MUT_RAW["current_ref_mut_raw() -> &mut T"]
REMOTE_PTR["remote_ptr(cpu_id) -> *const T"]
REMOTE_REF_RAW["remote_ref_raw(cpu_id) -> &T"]
REMOTE_REF_MUT_RAW["remote_ref_mut_raw(cpu_id) -> &mut T"]
end
subgraph subGraph1["Core Methods"]
OFFSET["offset() -> usize"]
CURRENT_PTR["current_ptr() -> *const T"]
WITH_CURRENT["with_current(f: F) -> R"]
end
end
subgraph subGraph0["User Interface"]
DEF_PERCPU["#[def_percpu]Attribute Macro"]
INIT["percpu::init()"]
INIT_REG["percpu::init_percpu_reg(cpu_id)"]
end
DEF_PERCPU --> STATIC_VAR
DEF_PERCPU --> WRAPPER
READ_CURRENT --> NOPREEMPT_GUARD
REMOTE_PTR --> PERCPU_AREA_BASE
WITH_CURRENT --> NOPREEMPT_GUARD
WRAPPER --> CURRENT_PTR
WRAPPER --> CURRENT_REF_MUT_RAW
WRAPPER --> CURRENT_REF_RAW
WRAPPER --> OFFSET
WRAPPER --> READ_CURRENT
WRAPPER --> READ_CURRENT_RAW
WRAPPER --> REMOTE_PTR
WRAPPER --> REMOTE_REF_MUT_RAW
WRAPPER --> REMOTE_REF_RAW
WRAPPER --> WITH_CURRENT
WRAPPER --> WRITE_CURRENT
WRAPPER --> WRITE_CURRENT_RAW
WRITE_CURRENT --> NOPREEMPT_GUARD
Sources: percpu_macros/src/lib.rs(L66 - L252) percpu/src/lib.rs(L5 - L17) README.md(L39 - L52)
Core API Components
Macro Definition Interface
The primary user interface is the def_percpu attribute macro that transforms static variable definitions into per-CPU data structures.
| Component | Type | Purpose |
|---|---|---|
| #[def_percpu] | Attribute Macro | Transforms static variables into per-CPU data |
| percpu::init() | Function | Initializes per-CPU data areas |
| percpu::init_percpu_reg(cpu_id) | Function | Sets up per-CPU register for given CPU |
Sources: percpu_macros/src/lib.rs(L66 - L78) percpu/src/lib.rs(L11) README.md(L44 - L46)
Generated Code Structure
For each variable defined with #[def_percpu], the macro generates multiple code entities that work together to provide per-CPU access.
flowchart TD
subgraph subGraph3["Method Categories"]
OFFSET_METHODS["Offset Calculationoffset()"]
POINTER_METHODS["Pointer Accesscurrent_ptr(), remote_ptr()"]
REFERENCE_METHODS["Reference Accesscurrent_ref_raw(), remote_ref_raw()"]
VALUE_METHODS["Value Accessread_current(), write_current()"]
FUNCTIONAL_METHODS["Functional Accesswith_current()"]
end
subgraph subGraph2["Section Placement"]
PERCPU_SECTION[".percpu sectionLinker managed"]
end
subgraph subGraph1["Generated Entities"]
INNER_SYMBOL["__PERCPU_VARstatic mut __PERCPU_VAR: T"]
WRAPPER_STRUCT["VAR_WRAPPERstruct VAR_WRAPPER {}"]
PUBLIC_STATIC["VARstatic VAR: VAR_WRAPPER"]
end
subgraph subGraph0["User Declaration"]
USER_VAR["#[def_percpu]static VAR: T = init;"]
end
INNER_SYMBOL --> PERCPU_SECTION
USER_VAR --> INNER_SYMBOL
USER_VAR --> PUBLIC_STATIC
USER_VAR --> WRAPPER_STRUCT
WRAPPER_STRUCT --> FUNCTIONAL_METHODS
WRAPPER_STRUCT --> OFFSET_METHODS
WRAPPER_STRUCT --> POINTER_METHODS
WRAPPER_STRUCT --> REFERENCE_METHODS
WRAPPER_STRUCT --> VALUE_METHODS
Sources: percpu_macros/src/lib.rs(L88 - L159) percpu_macros/src/lib.rs(L33 - L51)
Method Categories and Safety
The generated wrapper struct provides methods organized into distinct categories based on their safety requirements and access patterns.
Method Safety Hierarchy
flowchart TD
subgraph subGraph4["Preemption Guard Integration"]
NOPREEMPT["NoPreemptGuardkernel_guard crate"]
end
subgraph subGraph3["Utility Methods (Always Safe)"]
OFFSET_SAFE["offset() -> usizeAll types"]
end
subgraph subGraph2["Remote Access (Always Unsafe)"]
REMOTE_PTR_UNSAFE["remote_ptr(cpu_id) -> *const TAll types"]
REMOTE_REF_RAW_UNSAFE["remote_ref_raw(cpu_id) -> &TAll types"]
REMOTE_REF_MUT_RAW_UNSAFE["remote_ref_mut_raw(cpu_id) -> &mut TAll types"]
end
subgraph subGraph1["Unsafe Methods (Manual Preemption Control)"]
READ_CURRENT_RAW_UNSAFE["read_current_raw() -> TPrimitive types only"]
WRITE_CURRENT_RAW_UNSAFE["write_current_raw(val: T)Primitive types only"]
CURRENT_REF_RAW_UNSAFE["current_ref_raw() -> &TAll types"]
CURRENT_REF_MUT_RAW_UNSAFE["current_ref_mut_raw() -> &mut TAll types"]
CURRENT_PTR_UNSAFE["current_ptr() -> *const TAll types"]
end
subgraph subGraph0["Safe Methods (Preemption Handled)"]
READ_CURRENT_SAFE["read_current() -> TPrimitive types only"]
WRITE_CURRENT_SAFE["write_current(val: T)Primitive types only"]
WITH_CURRENT_SAFE["with_current(f: F) -> RAll types"]
end
READ_CURRENT_SAFE --> NOPREEMPT
READ_CURRENT_SAFE --> READ_CURRENT_RAW_UNSAFE
REMOTE_PTR_UNSAFE --> OFFSET_SAFE
REMOTE_REF_MUT_RAW_UNSAFE --> REMOTE_PTR_UNSAFE
REMOTE_REF_RAW_UNSAFE --> REMOTE_PTR_UNSAFE
WITH_CURRENT_SAFE --> CURRENT_REF_MUT_RAW_UNSAFE
WITH_CURRENT_SAFE --> NOPREEMPT
WRITE_CURRENT_SAFE --> NOPREEMPT
WRITE_CURRENT_SAFE --> WRITE_CURRENT_RAW_UNSAFE
Sources: percpu_macros/src/lib.rs(L101 - L145) percpu_macros/src/lib.rs(L161 - L248) percpu/src/lib.rs(L14 - L17)
Type-Specific API Variations
The generated API surface varies depending on the type of the per-CPU variable, with additional optimized methods for primitive integer types.
API Method Availability Matrix
| Method Category | All Types | Primitive Integer Types Only |
|---|---|---|
| offset() | ✓ | ✓ |
| current_ptr() | ✓ | ✓ |
| current_ref_raw() | ✓ | ✓ |
| current_ref_mut_raw() | ✓ | ✓ |
| with_current() | ✓ | ✓ |
| remote_ptr() | ✓ | ✓ |
| remote_ref_raw() | ✓ | ✓ |
| remote_ref_mut_raw() | ✓ | ✓ |
| read_current_raw() | ✗ | ✓ |
| write_current_raw() | ✗ | ✓ |
| read_current() | ✗ | ✓ |
| write_current() | ✗ | ✓ |
Primitive integer types: bool, u8, u16, u32, u64, usize
Sources: percpu_macros/src/lib.rs(L91 - L93) percpu_macros/src/lib.rs(L100 - L145)
Feature-Dependent Behavior
The API behavior changes based on enabled Cargo features, affecting both code generation and runtime behavior.
Feature Impact on API
| Feature | Impact on Generated Code | Runtime Behavior |
|---|---|---|
| sp-naive | Uses global variables instead of per-CPU areas | No register setup required |
| preempt | AddsNoPreemptGuardto safe methods | Preemption disabled during access |
| arm-el2 | Changes register selection for AArch64 | UsesTPIDR_EL2instead ofTPIDR_EL1 |
Sources: percpu_macros/src/lib.rs(L94 - L98) percpu/src/lib.rs(L7 - L8) README.md(L69 - L79)