diff --git a/src/bin/izoli.rs b/src/bin/izoli.rs index 34d8100..00d36c6 100644 --- a/src/bin/izoli.rs +++ b/src/bin/izoli.rs @@ -1,6 +1,6 @@ use izolilib::{ - cgroup::cgroup::CGroup, - izolibox::{CGroupOption, IzoliBox}, + cgroup::{cgroup::CGroup, cgroup_option::CGroupOption, cpu_limit::CpuLimit}, + izolibox::IzoliBox, }; fn main() { @@ -21,7 +21,15 @@ fn main() { .add_subtree_control(cgroup.get_controllers().unwrap()) .unwrap(); - let izolibox = IzoliBox::new(1, Some(CGroupOption {})); + let izolibox = IzoliBox::new( + 1, + Some(CGroupOption { + cpu_max: Some(CpuLimit { + max: izolilib::cgroup::limit_value::CGroupLimitValue::Value(1000), + period: 100000, + }), + }), + ); let pid = izolibox .enter(Box::new(|| { println!("Isolated process: {}", std::process::id()); diff --git a/src/cgroup/cgroup.rs b/src/cgroup/cgroup.rs index fe20748..cdb4ac4 100644 --- a/src/cgroup/cgroup.rs +++ b/src/cgroup/cgroup.rs @@ -7,8 +7,8 @@ use std::{ }; use super::{ - cgroup_stat::CGroupStat, controller::Controller, cpu_limit::CpuLimit, - limit_value::CGroupLimitValue, + cgroup_option::CGroupOption, cgroup_stat::CGroupStat, controller::Controller, + cpu_limit::CpuLimit, limit_value::CGroupLimitValue, }; pub struct CGroup { @@ -41,6 +41,14 @@ impl CGroup { fs::create_dir_all(root) } + pub fn apply_options(&self, option: &CGroupOption) -> Result<(), std::io::Error> { + if let Some(cpu_max) = &option.cpu_max { + self.set_cpu_max(cpu_max)?; + } + + Ok(()) + } + pub fn enter(&self) -> Result<(), std::io::Error> { let pid = std::process::id(); @@ -178,6 +186,14 @@ impl CGroup { Ok(CpuLimit::from_str(&max).unwrap()) } + // cpu write + + pub fn set_cpu_max(&self, cpu_limit: &CpuLimit) -> Result<(), std::io::Error> { + let to_write = cpu_limit.to_string(); + + self.write("cpu.max", &to_write) + } + fn write_value(&self, name: &str, value: T) -> Result<(), std::io::Error> where T: fmt::Display, diff --git a/src/cgroup/mod.rs b/src/cgroup/mod.rs index c15340c..981fadd 100644 --- a/src/cgroup/mod.rs +++ b/src/cgroup/mod.rs @@ -1,4 +1,5 @@ pub mod cgroup; +pub mod cgroup_option; pub mod cgroup_stat; pub mod controller; pub mod cpu_limit; diff --git a/src/izolibox.rs b/src/izolibox.rs index f624547..4524a2e 100644 --- a/src/izolibox.rs +++ b/src/izolibox.rs @@ -4,12 +4,10 @@ use nix::{ unistd::Pid, }; -use crate::cgroup::cgroup::CGroup; +use crate::cgroup::{cgroup::CGroup, cgroup_option::CGroupOption}; const STACK_SIZE: usize = 8192; -pub struct CGroupOption {} - pub struct IzoliBox { pub id: usize, pub cgroup_option: Option, @@ -27,8 +25,9 @@ impl IzoliBox { | CloneFlags::CLONE_NEWIPC | CloneFlags::CLONE_NEWPID; - if let Some(_cgroup_option) = &self.cgroup_option { + if let Some(cgroup_option) = &self.cgroup_option { let cgroup = CGroup::new(&format!("izoli/box_{}", self.id)).unwrap(); + cgroup.apply_options(cgroup_option).unwrap(); cgroup.enter().unwrap(); }