in src/samplers/ext4/mod.rs [120:160]
fn initialize_bpf(&mut self) -> Result<(), anyhow::Error> {
#[cfg(feature = "bpf")]
{
if self.enabled() && self.bpf_enabled() {
debug!("initializing bpf");
// load the code and compile
let code = include_str!("bpf.c").to_string();
let addr = "0x".to_string()
+ &crate::common::bpf::symbol_lookup("ext4_file_operations").unwrap();
let code = code.replace("EXT4_FILE_OPERATIONS", &addr);
let code = code.replace(
"VALUE_TO_INDEX2_FUNC",
include_str!("../../common/value_to_index2.c"),
);
let mut bpf = bcc::BPF::new(&code)?;
// collect the set of probes required from the statistics enabled.
let mut probes = HashSet::new();
for statistic in &self.statistics {
for probe in statistic.bpf_probes_required() {
probes.insert(probe);
}
}
// load + attach the kernel probes that are required to the bpf instance.
for probe in probes {
if self.common.config.fault_tolerant() {
if let Err(e) = probe.try_attach_to_bpf(&mut bpf) {
warn!("skipping {} with error: {}", probe.name, e);
}
} else {
probe.try_attach_to_bpf(&mut bpf)?;
}
}
self.bpf = Some(Arc::new(Mutex::new(BPF { inner: bpf })));
}
}
Ok(())
}