Expand description
Similar to HashMap
but each CPU holds a separate value for a given key. Tipically used to
minimize lock contention in eBPF programs.
This type can be used with eBPF maps of type BPF_MAP_TYPE_PERCPU_HASH
and
BPF_MAP_TYPE_LRU_PERCPU_HASH
.
Minimum kernel version
The minimum kernel version required to use this feature is 4.6.
Examples
use aya::maps::PerCpuHashMap;
use std::convert::TryFrom;
const CPU_IDS: u8 = 1;
const WAKEUPS: u8 = 2;
let mut hm = PerCpuHashMap::<_, u8, u32>::try_from(bpf.map("COUNTERS")?)?;
let cpu_ids = unsafe { hm.get(&CPU_IDS, 0)? };
let wakeups = unsafe { hm.get(&WAKEUPS, 0)? };
for (cpu_id, wakeups) in cpu_ids.iter().zip(wakeups.iter()) {
println!("cpu {} woke up {} times", cpu_id, wakeups);
}
Implementations
sourceimpl<T: Deref<Target = Map>, K: Pod, V: Pod> PerCpuHashMap<T, K, V>
impl<T: Deref<Target = Map>, K: Pod, V: Pod> PerCpuHashMap<T, K, V>
sourcepub fn get(&self, key: &K, flags: u64) -> Result<PerCpuValues<V>, MapError>
pub fn get(&self, key: &K, flags: u64) -> Result<PerCpuValues<V>, MapError>
Returns a slice of values - one for each CPU - associated with the key.
sourcepub fn iter(&self) -> MapIter<'_, K, PerCpuValues<V>, Self>ⓘNotable traits for MapIter<'_, K, V, I>impl<K: Pod, V, I: IterableMap<K, V>> Iterator for MapIter<'_, K, V, I> type Item = Result<(K, V), MapError>;
pub fn iter(&self) -> MapIter<'_, K, PerCpuValues<V>, Self>ⓘNotable traits for MapIter<'_, K, V, I>impl<K: Pod, V, I: IterableMap<K, V>> Iterator for MapIter<'_, K, V, I> type Item = Result<(K, V), MapError>;
An iterator visiting all key-value pairs in arbitrary order. The
iterator item type is Result<(K, PerCpuValues<V>), MapError>
.
sourceimpl<T: DerefMut<Target = Map>, K: Pod, V: Pod> PerCpuHashMap<T, K, V>
impl<T: DerefMut<Target = Map>, K: Pod, V: Pod> PerCpuHashMap<T, K, V>
sourcepub fn insert(
&mut self,
key: K,
values: PerCpuValues<V>,
flags: u64
) -> Result<(), MapError>
pub fn insert(
&mut self,
key: K,
values: PerCpuValues<V>,
flags: u64
) -> Result<(), MapError>
Inserts a slice of values - one for each CPU - for the given key.
Examples
use aya::maps::{PerCpuHashMap, PerCpuValues};
use aya::util::nr_cpus;
use std::convert::TryFrom;
const RETRIES: u8 = 1;
let mut hm = PerCpuHashMap::<_, u8, u32>::try_from(bpf.map_mut("PER_CPU_STORAGE")?)?;
hm.insert(
RETRIES,
PerCpuValues::try_from(vec![3u32; nr_cpus()?])?,
0,
)?;
Trait Implementations
sourceimpl<T: Deref<Target = Map>, K: Pod, V: Pod> IterableMap<K, PerCpuValues<V>> for PerCpuHashMap<T, K, V>
impl<T: Deref<Target = Map>, K: Pod, V: Pod> IterableMap<K, PerCpuValues<V>> for PerCpuHashMap<T, K, V>
Auto Trait Implementations
impl<T, K, V> RefUnwindSafe for PerCpuHashMap<T, K, V> where
K: RefUnwindSafe,
T: RefUnwindSafe,
V: RefUnwindSafe,
impl<T, K, V> Send for PerCpuHashMap<T, K, V> where
K: Send,
T: Send,
V: Send,
impl<T, K, V> Sync for PerCpuHashMap<T, K, V> where
K: Sync,
T: Sync,
V: Sync,
impl<T, K, V> Unpin for PerCpuHashMap<T, K, V> where
K: Unpin,
T: Unpin,
V: Unpin,
impl<T, K, V> UnwindSafe for PerCpuHashMap<T, K, V> where
K: UnwindSafe,
T: UnwindSafe,
V: UnwindSafe,
Blanket Implementations
sourceimpl<T> BorrowMut<T> for T where
T: ?Sized,
impl<T> BorrowMut<T> for T where
T: ?Sized,
const: unstable · sourcefn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Mutably borrows from an owned value. Read more