use anyhow::Result;
use btf_rs::Btf;
use super::{find_struct, member_byte_offset};
#[derive(Debug, Clone, Copy)]
pub struct CgroupWalkOffsets {
pub cgroup_self: usize,
pub cgroup_kn: usize,
pub cgroup_psi: usize,
pub css_sibling: usize,
pub css_children: usize,
pub css_serial_nr: usize,
pub cgroup_root_cgrp: usize,
pub kernfs_node_name: usize,
}
impl CgroupWalkOffsets {
pub fn from_btf(btf: &Btf) -> Result<Self> {
let (cgroup, _) = find_struct(btf, "cgroup")?;
let cgroup_self = member_byte_offset(btf, &cgroup, "self")?;
let cgroup_kn = member_byte_offset(btf, &cgroup, "kn")?;
let cgroup_psi = member_byte_offset(btf, &cgroup, "psi")?;
let (css, _) = find_struct(btf, "cgroup_subsys_state")?;
let css_sibling = member_byte_offset(btf, &css, "sibling")?;
let css_children = member_byte_offset(btf, &css, "children")?;
let css_serial_nr = member_byte_offset(btf, &css, "serial_nr")?;
let (cgroup_root, _) = find_struct(btf, "cgroup_root")?;
let cgroup_root_cgrp = member_byte_offset(btf, &cgroup_root, "cgrp")?;
let (kernfs_node, _) = find_struct(btf, "kernfs_node")?;
let kernfs_node_name = member_byte_offset(btf, &kernfs_node, "name")?;
Ok(Self {
cgroup_self,
cgroup_kn,
cgroup_psi,
css_sibling,
css_children,
css_serial_nr,
cgroup_root_cgrp,
kernfs_node_name,
})
}
}
#[cfg(test)]
mod tests {
use super::super::load_btf_from_path;
use super::*;
#[test]
fn parse_cgroup_walk_offsets_from_vmlinux() {
let path = match crate::monitor::find_test_vmlinux() {
Some(p) => p,
None => return,
};
let btf = match load_btf_from_path(&path) {
Ok(b) => b,
Err(e) => skip!("vmlinux BTF load failed: {e}"),
};
let off = match CgroupWalkOffsets::from_btf(&btf) {
Ok(o) => o,
Err(e) => skip!("CgroupWalkOffsets::from_btf failed: {e}"),
};
assert_eq!(
off.cgroup_self, 0,
"offsetof(cgroup, self) must be 0 (self is the first member)"
);
assert_ne!(
off.css_sibling, off.css_children,
"css.sibling and css.children must be at distinct offsets"
);
assert!(
off.cgroup_root_cgrp > 0,
"offsetof(cgroup_root, cgrp) must be nonzero (cgrp is not the first member)"
);
}
}