#![expect(
deprecated,
reason = "this module implements the deprecated cgroup storage map types"
)]
use std::{
borrow::{Borrow, BorrowMut},
marker::PhantomData,
os::fd::AsFd as _,
};
use aya_obj::generated::bpf_cgroup_storage_key;
use crate::{
Pod,
maps::{MapData, MapError, PerCpuValues, check_kv_size, hash_map},
sys::{SyscallError, bpf_map_lookup_elem_per_cpu, bpf_map_update_elem_per_cpu},
};
unsafe impl Pod for bpf_cgroup_storage_key {}
#[derive(Clone, Copy, Debug)]
pub struct CgroupStorageKey {
cgroup_inode_id: u64,
attach_type: u32,
}
impl CgroupStorageKey {
pub const fn new(cgroup_inode_id: u64, attach_type: u32) -> Self {
Self {
cgroup_inode_id,
attach_type,
}
}
const fn to_kernel(self) -> bpf_cgroup_storage_key {
let Self {
cgroup_inode_id,
attach_type,
} = self;
bpf_cgroup_storage_key {
cgroup_inode_id,
attach_type,
}
}
}
#[deprecated = "use the `BPF_MAP_TYPE_CGRP_STORAGE` map type, available since Linux 6.2"]
#[doc(alias = "BPF_MAP_TYPE_CGROUP_STORAGE")]
#[derive(Debug)]
pub struct CgroupStorage<T, V: Pod> {
pub(crate) inner: T,
_v: PhantomData<V>,
}
impl<T: Borrow<MapData>, V: Pod> CgroupStorage<T, V> {
pub(crate) fn new(map: T) -> Result<Self, MapError> {
let data = map.borrow();
check_kv_size::<bpf_cgroup_storage_key, V>(data)?;
Ok(Self {
inner: map,
_v: PhantomData,
})
}
pub fn get(&self, key: CgroupStorageKey, flags: u64) -> Result<V, MapError> {
hash_map::get(self.inner.borrow(), &key.to_kernel(), flags)
}
}
impl<T: BorrowMut<MapData>, V: Pod> CgroupStorage<T, V> {
pub fn insert(
&mut self,
key: CgroupStorageKey,
value: impl Borrow<V>,
flags: u64,
) -> Result<(), MapError> {
hash_map::insert(
self.inner.borrow_mut(),
&key.to_kernel(),
value.borrow(),
flags,
)
}
}
#[deprecated = "use the `BPF_MAP_TYPE_CGRP_STORAGE` map type, available since Linux 6.2"]
#[doc(alias = "BPF_MAP_TYPE_PERCPU_CGROUP_STORAGE")]
#[derive(Debug)]
pub struct PerCpuCgroupStorage<T, V: Pod> {
pub(crate) inner: T,
_v: PhantomData<V>,
}
impl<T: Borrow<MapData>, V: Pod> PerCpuCgroupStorage<T, V> {
pub(crate) fn new(map: T) -> Result<Self, MapError> {
let data = map.borrow();
check_kv_size::<bpf_cgroup_storage_key, V>(data)?;
Ok(Self {
inner: map,
_v: PhantomData,
})
}
pub fn get(&self, key: CgroupStorageKey, flags: u64) -> Result<PerCpuValues<V>, MapError> {
let fd = self.inner.borrow().fd().as_fd();
let values =
bpf_map_lookup_elem_per_cpu(fd, &key.to_kernel(), flags).map_err(|io_error| {
SyscallError {
call: "bpf_map_lookup_elem",
io_error,
}
})?;
values.ok_or(MapError::KeyNotFound)
}
}
impl<T: BorrowMut<MapData>, V: Pod> PerCpuCgroupStorage<T, V> {
pub fn insert(
&mut self,
key: CgroupStorageKey,
values: PerCpuValues<V>,
flags: u64,
) -> Result<(), MapError> {
let fd = self.inner.borrow_mut().fd().as_fd();
bpf_map_update_elem_per_cpu(fd, &key.to_kernel(), &values, flags)
.map_err(|io_error| SyscallError {
call: "bpf_map_update_elem",
io_error,
})
.map_err(Into::into)
}
}