in resctl-bench/src/bench/protection.rs [137:185]
fn parse(mut props: BTreeMap<String, String>) -> Result<Self> {
match props.remove("scenario").as_deref() {
Some("mem-hog") => {
let mut hog = MemHog::default();
for (k, v) in props.iter() {
match k.as_str() {
"loops" => hog.loops = v.parse::<u32>()?,
"load" => hog.load = parse_frac(v)?,
"speed" => hog.speed = MemHogSpeed::from_str(v)?,
k => bail!("unknown mem-hog property {:?}", k),
}
}
if hog.loops == 0 || hog.load == 0.0 {
bail!("\"loops\" and \"load\" can't be 0");
}
Ok(Self::MemHog(hog))
}
Some("mem-hog-tune") => {
let mut tune = MemHogTune::default();
for (k, v) in props.iter() {
match k.as_str() {
"load" => tune.load = parse_frac(v)?,
"speed" => tune.speed = MemHogSpeed::from_str(v)?,
"size-min" => tune.size_range.0 = parse_size(v)? as usize,
"size-max" => tune.size_range.1 = parse_size(v)? as usize,
"intvs" => tune.intvs = v.parse::<u32>()?,
"isol-pct" => tune.isol_pct = v.to_owned(),
"isol-thr" => tune.isol_thr = parse_frac(v)?,
k => bail!("unknown mem-hog-tune property {:?}", k),
}
}
if tune.load == 0.0 || tune.intvs == 0 {
bail!("\"load\" and \"intvs\" can't be 0");
}
if tune.size_range.1 == 0 || tune.size_range.1 < tune.size_range.0 {
bail!("Invalid size range");
}
if !MemHog::PCTS.contains(&tune.isol_pct.as_str()) {
bail!(
"Invalid isol-pct {:?}, supported: {:?}",
&tune.isol_pct,
&MemHog::PCTS
);
}
Ok(Self::MemHogTune(tune))
}
_ => bail!("\"scenario\" invalid or missing"),
}
}