fn fix_overrides()

in rd-agent/src/slices.rs [383:440]


fn fix_overrides(dseqs: &DisableSeqKnobs, cfg: &Config) -> Result<()> {
    let seq = super::instance_seq();
    let mut disable = String::new();
    let mut enable = String::new();

    if cfg.enforce.cpu {
        if dseqs.cpu < seq {
            enable += " +cpu";
        } else {
            disable += " -cpu";
        }
    }
    if cfg.enforce.io {
        enable += " +io";
    }

    if cfg.enforce.crit_mem_prot {
        enable += " +memory";
    }

    if disable.len() > 0 {
        let mut scs: Vec<String> = glob("/sys/fs/cgroup/**/cgroup.subtree_control")
            .unwrap()
            .filter_map(|x| x.ok())
            .map(|x| x.to_str().unwrap().to_string())
            .collect();
        scs.sort_unstable_by_key(|x| -(x.len() as i64));

        let mut nr_failed = 0;
        for sc in &scs {
            if let Err(e) = write_one_line(sc, &disable) {
                if nr_failed == 0 {
                    warn!(
                        "resctl: Failed to write {:?} to {:?} ({:?})",
                        &disable, &sc, &e
                    );
                }
                nr_failed += 1;
            }
        }

        if nr_failed > 1 {
            warn!(
                "resctl: Failed to write {:?} to {} files",
                &disable, nr_failed
            );
        }
    }

    if enable.len() > 0 {
        write_one_line("/sys/fs/cgroup/cgroup.subtree_control", &enable).context(format!(
            "Writing {:?} to /sys/fs/cgroup/cgroup.subtree_control",
            &enable
        ))?;
    }

    Ok(())
}