in resctl-bench/src/base.rs [52:144]
fn prep_bench(
args: &'a Args,
scr_devname: &str,
iocost_sys_save: &IoCostSysSave,
) -> Result<rd_agent_intf::BenchKnobs> {
let (dev_model, dev_fwrev, dev_size) =
devname_to_model_fwrev_size(&scr_devname).map_err(|e| {
anyhow!(
"Failed to resolve model/fwrev/size for {:?} ({})",
&scr_devname,
&e
)
})?;
let demo_bench_knobs_path = args.demo_bench_knobs_path();
let mut bench = match rd_agent_intf::BenchKnobs::load(&demo_bench_knobs_path) {
Ok(v) => v,
Err(e) => {
match e.downcast_ref::<std::io::Error>() {
Some(e) if e.raw_os_error() == Some(libc::ENOENT) => (),
_ => warn!(
"Failed to load {:?} ({}), remove the file",
&demo_bench_knobs_path, &e
),
}
Default::default()
}
};
if bench.iocost_dev_model.len() > 0 && bench.iocost_dev_model != dev_model {
bail!(
"benchfile device model {:?} doesn't match detected {:?}, try removing {:?}",
&bench.iocost_dev_model,
&dev_model,
&demo_bench_knobs_path,
);
}
if bench.iocost_dev_fwrev.len() > 0 && bench.iocost_dev_fwrev != dev_fwrev {
bail!(
"benchfile device firmware revision {:?} doesn't match detected {:?}, try removing {:?}",
&bench.iocost_dev_fwrev,
&dev_fwrev,
&demo_bench_knobs_path,
);
}
if bench.iocost_dev_size > 0 && bench.iocost_dev_size != dev_size {
bail!(
"benchfile device size {} doesn't match detected {}, try removing {:?}",
bench.iocost_dev_size,
dev_size,
&demo_bench_knobs_path,
);
}
bench.iocost_dev_model = dev_model;
bench.iocost_dev_fwrev = dev_fwrev;
bench.iocost_dev_size = dev_size;
if args.iocost_from_sys {
if !iocost_sys_save.enable {
bail!(
"--iocost-from-sys specified but iocost is disabled for {:?}",
&scr_devname
);
}
bench.iocost_seq = 1;
bench.iocost.model = iocost_sys_save.model.clone();
bench.iocost.qos = iocost_sys_save.qos.clone();
info!("Using iocost parameters from \"/sys/fs/cgroup/io.cost.model,qos\"");
}
if args.iocost_qos_ovr != Default::default() {
let qos_cfg = IoCostQoSCfg::new(&bench.iocost.qos, &args.iocost_qos_ovr);
info!("base: iocost QoS overrides: {}", qos_cfg.format());
bench.iocost.qos = qos_cfg.calc().unwrap();
}
if let Some(size) = args.hashd_size {
if bench.hashd.mem_size < size as u64 {
bench.hashd.mem_size = size as u64;
bench.hashd.mem_frac = 1.0;
} else {
bench.hashd.mem_frac = size as f64 / bench.hashd.mem_size as f64;
}
}
if let Some(fake) = args.hashd_fake_cpu_load {
bench.hashd.fake_cpu_load = fake;
}
Ok(bench)
}