use super::Ctx;
use super::ops::{CgroupDef, CpusetSpec, HoldSpec, Step, execute_steps_with};
use crate::assert::{Assert, AssertResult};
use crate::workload::*;
use anyhow::Result;
pub fn custom_cache_pressure_imbalance(ctx: &Ctx) -> Result<AssertResult> {
let checks = Assert::default_checks().max_throughput_cv(1.0);
let steps = vec![Step::with_defs(
vec![
CgroupDef::named("cg_0")
.workers(ctx.workers_per_cgroup)
.work_type(WorkType::cache_pressure(32, 64)),
CgroupDef::named("cg_1").workers(ctx.topo.total_cpus()),
],
HoldSpec::Fixed(ctx.settle + ctx.duration),
)];
execute_steps_with(ctx, steps, Some(&checks))
}
pub fn custom_cache_yield_wake_affine(ctx: &Ctx) -> Result<AssertResult> {
if ctx.topo.num_llcs() < 2 {
return Ok(AssertResult::skip("need >=2 LLCs"));
}
let checks = Assert::default_checks()
.max_wake_latency_cv(50.0)
.max_throughput_cv(1.0);
let steps = vec![Step::with_defs(
vec![
CgroupDef::named("cg_0")
.with_cpuset(CpusetSpec::llc(0))
.workers(ctx.workers_per_cgroup)
.work_type(WorkType::cache_yield(32, 64)),
CgroupDef::named("cg_1")
.with_cpuset(CpusetSpec::llc(1))
.workers(ctx.workers_per_cgroup)
.work_type(WorkType::cache_yield(32, 64)),
],
HoldSpec::Fixed(ctx.settle + ctx.duration),
)];
execute_steps_with(ctx, steps, Some(&checks))
}
pub fn custom_cache_pipe_io_compute_imbalance(ctx: &Ctx) -> Result<AssertResult> {
let n_pipe = ctx.workers_per_cgroup;
let n_pipe = if !n_pipe.is_multiple_of(2) {
n_pipe + 1
} else {
n_pipe
};
let checks = Assert::default_checks().max_wake_latency_cv(15.0);
let steps = vec![Step::with_defs(
vec![
CgroupDef::named("cg_0")
.workers(n_pipe)
.work_type(WorkType::cache_pipe(32, 1024)),
CgroupDef::named("cg_1").workers(ctx.topo.total_cpus()),
],
HoldSpec::Fixed(ctx.settle + ctx.duration),
)];
execute_steps_with(ctx, steps, Some(&checks))
}
pub fn custom_fan_out_wake(ctx: &Ctx) -> Result<AssertResult> {
let fan_out = 4usize;
let group_size = fan_out + 1;
let n_fan_out = (ctx.workers_per_cgroup / group_size).max(1) * group_size;
let checks = Assert::default_checks()
.max_wake_latency_cv(10.0)
.max_spread_pct(50.0);
let steps = vec![Step::with_defs(
vec![
CgroupDef::named("cg_0")
.workers(n_fan_out)
.work_type(WorkType::futex_fan_out(fan_out, 1024)),
CgroupDef::named("cg_1").workers(ctx.topo.total_cpus()),
],
HoldSpec::Fixed(ctx.settle + ctx.duration),
)];
execute_steps_with(ctx, steps, Some(&checks))
}
pub fn custom_fan_out_compute(ctx: &Ctx) -> Result<AssertResult> {
let fan_out = 4usize;
let group_size = fan_out + 1;
let n_workers = (ctx.workers_per_cgroup / group_size).max(1) * group_size;
let checks = Assert::default_checks()
.max_wake_latency_cv(10.0)
.max_spread_pct(50.0);
let steps = vec![Step::with_defs(
vec![
CgroupDef::named("cg_0")
.workers(n_workers)
.work_type(WorkType::fan_out_compute(fan_out, 256, 5, 100)),
CgroupDef::named("cg_1").workers(ctx.topo.total_cpus()),
],
HoldSpec::Fixed(ctx.settle + ctx.duration),
)];
execute_steps_with(ctx, steps, Some(&checks))
}