From 4f9fe856a25ab29345b90e7725509e9ee38a37be Mon Sep 17 00:00:00 2001 From: Daniel Baumann Date: Wed, 17 Apr 2024 14:19:41 +0200 Subject: Adding upstream version 1.69.0+dfsg1. Signed-off-by: Daniel Baumann --- vendor/num_cpus/.cargo-checksum.json | 2 +- vendor/num_cpus/CHANGELOG.md | 13 + vendor/num_cpus/Cargo.lock | 6 +- vendor/num_cpus/Cargo.toml | 12 +- .../fixtures/cgroups2/cgroups/ceil/cpu.max | 1 + .../fixtures/cgroups2/cgroups/good/cpu.max | 1 + .../fixtures/cgroups2/cgroups/zero-period/cpu.max | 1 + .../num_cpus/fixtures/cgroups2/proc/cgroups/cgroup | 2 + .../fixtures/cgroups2/proc/cgroups/cgroup_multi | 3 + .../fixtures/cgroups2/proc/cgroups/mountinfo | 5 + vendor/num_cpus/src/linux.rs | 407 +++++++++++++++------ 11 files changed, 331 insertions(+), 122 deletions(-) create mode 100644 vendor/num_cpus/fixtures/cgroups2/cgroups/ceil/cpu.max create mode 100644 vendor/num_cpus/fixtures/cgroups2/cgroups/good/cpu.max create mode 100644 vendor/num_cpus/fixtures/cgroups2/cgroups/zero-period/cpu.max create mode 100644 vendor/num_cpus/fixtures/cgroups2/proc/cgroups/cgroup create mode 100644 vendor/num_cpus/fixtures/cgroups2/proc/cgroups/cgroup_multi create mode 100644 vendor/num_cpus/fixtures/cgroups2/proc/cgroups/mountinfo (limited to 'vendor/num_cpus') diff --git a/vendor/num_cpus/.cargo-checksum.json b/vendor/num_cpus/.cargo-checksum.json index e101b17c3..496119d1d 100644 --- a/vendor/num_cpus/.cargo-checksum.json +++ b/vendor/num_cpus/.cargo-checksum.json @@ -1 +1 @@ -{"files":{"CHANGELOG.md":"1b01434272c7e464f187eedc95522d9f5668f7f423459572fd33cd8eb5c4c5cf","CONTRIBUTING.md":"2390961aab1bba026135338da1216b6cc828dfaeed9357d9c155c55a252d3efb","Cargo.lock":"dabfb21d5ed9cefaf28e1fcbcaf253de08807ca3be33d0de4b06bb7a377d7b60","Cargo.toml":"885f8ecc8197bec06e151fde7769dc7c267d2f25a4b573240463e8a40a5be298","LICENSE-APACHE":"a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2","LICENSE-MIT":"0593d22d122d4bfec6407115e3907546312976f75473417aaa4c57ecd2095ae6","README.md":"7760d315d3efd2306affa4c8e4dcdb3a245ae30b3c9cfb9cffed2f1116c86362","ci/cgroups/Dockerfile":"567f00918a6422b363e2c21e57bd47cef9dcc03d0ab109c9605e052f83af7e89","examples/values.rs":"46c833324b7339d359054c4f8e8284259e860df206c552c63b5893ade59c16a6","fixtures/cgroups/cgroups/ceil/cpu.cfs_period_us":"d2ace393dc9388863d75d8de140df516d7ffe4aa7ed2f9a545aa71c9930d6638","fixtures/cgroups/cgroups/ceil/cpu.cfs_quota_us":"7ccd86cde0b22ffc2318f2509726d2a13053f6973e96dc5ca6965a56497e485e","fixtures/cgroups/cgroups/good/cpu.cfs_period_us":"d2ace393dc9388863d75d8de140df516d7ffe4aa7ed2f9a545aa71c9930d6638","fixtures/cgroups/cgroups/good/cpu.cfs_quota_us":"cdc3397c35d915e5fe61f8d2bdedcae00a225d55cc6b090580cde1b71c63463b","fixtures/cgroups/cgroups/zero-period/cpu.cfs_period_us":"74d01a0c051c963d9a9b8ab9dbeab1723f0ad8534ea9fa6a942f358d7fa011b4","fixtures/cgroups/cgroups/zero-period/cpu.cfs_quota_us":"1e6ffd8a95fab538ddd645a767e8cc505722d5c8aaf008969f2ed8ab753ff61e","fixtures/cgroups/proc/cgroups/cgroup":"6812299a4409bfd831ed751fdbbfdd9c5749f69acd7b14c5b0a704271a1f74c6","fixtures/cgroups/proc/cgroups/mountinfo":"3187b0b1c0fa192790abced7d435190e8979059186055688e4c3c2ca013398c6","fixtures/cgroups/proc/cgroups/mountinfo_multi_opt":"d1e397752bc5c4558a3230ad847e89c6885362eab68a53b08dbf219de2e0138a","fixtures/cgroups/proc/cgroups/mountinfo_zero_opt":"91b03b270c76460bc19225aa4b743f893c7d32173e9609ef77e5a04814ab81ff","src/lib.rs":"81fc237964757a53689db848b1df4fed75bbd6a6e7a9063b6bb008161f8c22af","src/linux.rs":"a453e1056c130beaa7e2338222d04b5d3786f6325f5ca314ce9f4130079add2f"},"package":"19e64526ebdee182341572e50e9ad03965aa510cd94427a4549448f285e957a1"} \ No newline at end of file +{"files":{"CHANGELOG.md":"66c7e8dedaa631c5e8d189b896efb691a97529358a56ad78282fbd4cbae3c638","CONTRIBUTING.md":"2390961aab1bba026135338da1216b6cc828dfaeed9357d9c155c55a252d3efb","Cargo.lock":"5a782f53bfc63c9ef7a901472c8ae3599d3f5ecb6f8bb9ce871235b4d9c8bfc1","Cargo.toml":"7a8fa6033b28607f305e144269902dc62c082cf02f76780fcce866810fcf931b","LICENSE-APACHE":"a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2","LICENSE-MIT":"0593d22d122d4bfec6407115e3907546312976f75473417aaa4c57ecd2095ae6","README.md":"7760d315d3efd2306affa4c8e4dcdb3a245ae30b3c9cfb9cffed2f1116c86362","ci/cgroups/Dockerfile":"567f00918a6422b363e2c21e57bd47cef9dcc03d0ab109c9605e052f83af7e89","examples/values.rs":"46c833324b7339d359054c4f8e8284259e860df206c552c63b5893ade59c16a6","fixtures/cgroups/cgroups/ceil/cpu.cfs_period_us":"d2ace393dc9388863d75d8de140df516d7ffe4aa7ed2f9a545aa71c9930d6638","fixtures/cgroups/cgroups/ceil/cpu.cfs_quota_us":"7ccd86cde0b22ffc2318f2509726d2a13053f6973e96dc5ca6965a56497e485e","fixtures/cgroups/cgroups/good/cpu.cfs_period_us":"d2ace393dc9388863d75d8de140df516d7ffe4aa7ed2f9a545aa71c9930d6638","fixtures/cgroups/cgroups/good/cpu.cfs_quota_us":"cdc3397c35d915e5fe61f8d2bdedcae00a225d55cc6b090580cde1b71c63463b","fixtures/cgroups/cgroups/zero-period/cpu.cfs_period_us":"74d01a0c051c963d9a9b8ab9dbeab1723f0ad8534ea9fa6a942f358d7fa011b4","fixtures/cgroups/cgroups/zero-period/cpu.cfs_quota_us":"1e6ffd8a95fab538ddd645a767e8cc505722d5c8aaf008969f2ed8ab753ff61e","fixtures/cgroups/proc/cgroups/cgroup":"6812299a4409bfd831ed751fdbbfdd9c5749f69acd7b14c5b0a704271a1f74c6","fixtures/cgroups/proc/cgroups/mountinfo":"3187b0b1c0fa192790abced7d435190e8979059186055688e4c3c2ca013398c6","fixtures/cgroups/proc/cgroups/mountinfo_multi_opt":"d1e397752bc5c4558a3230ad847e89c6885362eab68a53b08dbf219de2e0138a","fixtures/cgroups/proc/cgroups/mountinfo_zero_opt":"91b03b270c76460bc19225aa4b743f893c7d32173e9609ef77e5a04814ab81ff","fixtures/cgroups2/cgroups/ceil/cpu.max":"d6eb496d0851963c9e6a9cf33c0a3ef2f08cbbee2a387c093b30ceca23239226","fixtures/cgroups2/cgroups/good/cpu.max":"2f8bd783be33cf80b6a2a0cf810f81ccf85f988c72c9bb76fa6172b6e4ec2b02","fixtures/cgroups2/cgroups/zero-period/cpu.max":"f42f2771a5f669873e0f45400ff64c481618029fe14a5bcb15d51b426646a9aa","fixtures/cgroups2/proc/cgroups/cgroup":"f8327c16331cc79ecbf875bd7bea6cf1831757589c39e16a149bfb3b6f81f7c8","fixtures/cgroups2/proc/cgroups/cgroup_multi":"96e107b552b1f51a8e96199c12e42dc3807e207d5a1be4a901f49db8e23ed869","fixtures/cgroups2/proc/cgroups/mountinfo":"7ac8cda160d4d80de73195fda560b46ed3826f43ef07fb513308549b32b08b56","src/lib.rs":"81fc237964757a53689db848b1df4fed75bbd6a6e7a9063b6bb008161f8c22af","src/linux.rs":"378ea174d00d560e16fda4b09fb523dda5f4c6f420e46af7d317393a39d88dd1"},"package":"0fac9e2da13b5eb447a6ce3d392f23a29d8694bff781bf03a16cd9ac8697593b"} \ No newline at end of file diff --git a/vendor/num_cpus/CHANGELOG.md b/vendor/num_cpus/CHANGELOG.md index 5496ace25..5be725c54 100644 --- a/vendor/num_cpus/CHANGELOG.md +++ b/vendor/num_cpus/CHANGELOG.md @@ -1,3 +1,16 @@ +## v1.15.0 + +### Fixes + +- update hermit-abi + +## v1.14.0 + +### Features + +- add support for cgroups v2 +- Skip reading files in Miri + ## v1.13.1 ### Fixes diff --git a/vendor/num_cpus/Cargo.lock b/vendor/num_cpus/Cargo.lock index 93137c3ea..1e955390a 100644 --- a/vendor/num_cpus/Cargo.lock +++ b/vendor/num_cpus/Cargo.lock @@ -4,9 +4,9 @@ version = 3 [[package]] name = "hermit-abi" -version = "0.1.3" +version = "0.2.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "307c3c9f937f38e3534b1d6447ecf090cafcc9744e4a6360e8b037b2cf5af120" +checksum = "ee512640fe35acbfb4bb779db6f0d80704c2cacfa2e39b601ef3e3f47d1ae4c7" dependencies = [ "libc", ] @@ -19,7 +19,7 @@ checksum = "1a31a0627fdf1f6a39ec0dd577e101440b7db22672c0901fe00a9a6fbb5c24e8" [[package]] name = "num_cpus" -version = "1.13.1" +version = "1.15.0" dependencies = [ "hermit-abi", "libc", diff --git a/vendor/num_cpus/Cargo.toml b/vendor/num_cpus/Cargo.toml index f708cc878..6d62e8626 100644 --- a/vendor/num_cpus/Cargo.toml +++ b/vendor/num_cpus/Cargo.toml @@ -11,16 +11,22 @@ [package] name = "num_cpus" -version = "1.13.1" +version = "1.15.0" authors = ["Sean McArthur "] description = "Get the number of CPUs on a machine." documentation = "https://docs.rs/num_cpus" readme = "README.md" -keywords = ["cpu", "cpus", "cores"] +keywords = [ + "cpu", + "cpus", + "cores", +] categories = ["hardware-support"] license = "MIT OR Apache-2.0" repository = "https://github.com/seanmonstar/num_cpus" + [target."cfg(all(any(target_arch = \"x86_64\", target_arch = \"aarch64\"), target_os = \"hermit\"))".dependencies.hermit-abi] -version = "0.1.3" +version = "0.2.6" + [target."cfg(not(windows))".dependencies.libc] version = "0.2.26" diff --git a/vendor/num_cpus/fixtures/cgroups2/cgroups/ceil/cpu.max b/vendor/num_cpus/fixtures/cgroups2/cgroups/ceil/cpu.max new file mode 100644 index 000000000..833a8f2d3 --- /dev/null +++ b/vendor/num_cpus/fixtures/cgroups2/cgroups/ceil/cpu.max @@ -0,0 +1 @@ +150000 100000 diff --git a/vendor/num_cpus/fixtures/cgroups2/cgroups/good/cpu.max b/vendor/num_cpus/fixtures/cgroups2/cgroups/good/cpu.max new file mode 100644 index 000000000..e469067a6 --- /dev/null +++ b/vendor/num_cpus/fixtures/cgroups2/cgroups/good/cpu.max @@ -0,0 +1 @@ +600000 100000 diff --git a/vendor/num_cpus/fixtures/cgroups2/cgroups/zero-period/cpu.max b/vendor/num_cpus/fixtures/cgroups2/cgroups/zero-period/cpu.max new file mode 100644 index 000000000..24e757f51 --- /dev/null +++ b/vendor/num_cpus/fixtures/cgroups2/cgroups/zero-period/cpu.max @@ -0,0 +1 @@ +600000 0 diff --git a/vendor/num_cpus/fixtures/cgroups2/proc/cgroups/cgroup b/vendor/num_cpus/fixtures/cgroups2/proc/cgroups/cgroup new file mode 100644 index 000000000..35b49db2c --- /dev/null +++ b/vendor/num_cpus/fixtures/cgroups2/proc/cgroups/cgroup @@ -0,0 +1,2 @@ +12::/ +3::/user.slice diff --git a/vendor/num_cpus/fixtures/cgroups2/proc/cgroups/cgroup_multi b/vendor/num_cpus/fixtures/cgroups2/proc/cgroups/cgroup_multi new file mode 100644 index 000000000..1a9282a6e --- /dev/null +++ b/vendor/num_cpus/fixtures/cgroups2/proc/cgroups/cgroup_multi @@ -0,0 +1,3 @@ +12::/ +11:cpu,cpuacct:/ +3::/user.slice diff --git a/vendor/num_cpus/fixtures/cgroups2/proc/cgroups/mountinfo b/vendor/num_cpus/fixtures/cgroups2/proc/cgroups/mountinfo new file mode 100644 index 000000000..da36e4102 --- /dev/null +++ b/vendor/num_cpus/fixtures/cgroups2/proc/cgroups/mountinfo @@ -0,0 +1,5 @@ +1 0 8:1 / / rw,noatime shared:1 - ext4 /dev/sda1 rw,errors=remount-ro,data=reordered +2 1 0:1 / /dev rw,relatime shared:2 - devtmpfs udev rw,size=10240k,nr_inodes=16487629,mode=755 +3 1 0:2 / /proc rw,nosuid,nodev,noexec,relatime shared:3 - proc proc rw +4 1 0:3 / /sys rw,nosuid,nodev,noexec,relatime shared:4 - sysfs sysfs rw +5 4 0:4 / /sys/fs/cgroup rw,nosuid,nodev,noexec,relatime shared:5 - cgroup2 cgroup2 rw,nsdelegate,memory_recursiveprot diff --git a/vendor/num_cpus/src/linux.rs b/vendor/num_cpus/src/linux.rs index 36f472717..295c925fb 100644 --- a/vendor/num_cpus/src/linux.rs +++ b/vendor/num_cpus/src/linux.rs @@ -126,6 +126,11 @@ fn init_cgroups() { // Should only be called once debug_assert!(CGROUPS_CPUS.load(Ordering::SeqCst) == 0); + // Fails in Miri by default (cannot open files), and Miri does not have parallelism anyway. + if cfg!(miri) { + return; + } + if let Some(quota) = load_cgroups("/proc/self/cgroup", "/proc/self/mountinfo") { if quota == 0 { return; @@ -144,27 +149,36 @@ where P2: AsRef, { let subsys = some!(Subsys::load_cpu(cgroup_proc)); - let mntinfo = some!(MountInfo::load_cpu(mountinfo_proc)); + let mntinfo = some!(MountInfo::load_cpu(mountinfo_proc, subsys.version)); let cgroup = some!(Cgroup::translate(mntinfo, subsys)); cgroup.cpu_quota() } +#[derive(Debug, Clone, Copy, PartialEq, Eq)] +enum CgroupVersion { + V1, + V2, +} + struct Cgroup { + version: CgroupVersion, base: PathBuf, } struct MountInfo { + version: CgroupVersion, root: String, mount_point: String, } struct Subsys { + version: CgroupVersion, base: String, } impl Cgroup { - fn new(dir: PathBuf) -> Cgroup { - Cgroup { base: dir } + fn new(version: CgroupVersion, dir: PathBuf) -> Cgroup { + Cgroup { version: version, base: dir } } fn translate(mntinfo: MountInfo, subsys: Subsys) -> Option { @@ -181,12 +195,14 @@ impl Cgroup { // join(mp.MountPoint, relPath) let mut path = PathBuf::from(mntinfo.mount_point); path.push(rel_from_root); - Some(Cgroup::new(path)) + Some(Cgroup::new(mntinfo.version, path)) } fn cpu_quota(&self) -> Option { - let quota_us = some!(self.quota_us()); - let period_us = some!(self.period_us()); + let (quota_us, period_us) = match self.version { + CgroupVersion::V1 => (some!(self.quota_us()), some!(self.period_us())), + CgroupVersion::V2 => some!(self.max()), + }; // protect against dividing by zero if period_us == 0 { @@ -207,25 +223,41 @@ impl Cgroup { self.param("cpu.cfs_period_us") } + fn max(&self) -> Option<(usize, usize)> { + let max = some!(self.raw_param("cpu.max")); + let mut max = some!(max.lines().next()).split(' '); + + let quota = some!(max.next().and_then(|quota| quota.parse().ok())); + let period = some!(max.next().and_then(|period| period.parse().ok())); + + Some((quota, period)) + } + fn param(&self, param: &str) -> Option { + let buf = some!(self.raw_param(param)); + + buf.trim().parse().ok() + } + + fn raw_param(&self, param: &str) -> Option { let mut file = some!(File::open(self.base.join(param)).ok()); let mut buf = String::new(); some!(file.read_to_string(&mut buf).ok()); - buf.trim().parse().ok() + Some(buf) } } impl MountInfo { - fn load_cpu>(proc_path: P) -> Option { + fn load_cpu>(proc_path: P, version: CgroupVersion) -> Option { let file = some!(File::open(proc_path).ok()); let file = BufReader::new(file); file.lines() .filter_map(|result| result.ok()) .filter_map(MountInfo::parse_line) - .next() + .find(|mount_info| mount_info.version == version) } fn parse_line(line: String) -> Option { @@ -247,19 +279,25 @@ impl MountInfo { }; // 7 5 0:6 / /sys/fs/cgroup/cpu,cpuacct rw,nosuid,nodev,noexec,relatime shared:7 - cgroup rw,cpu,cpuacct - if fields.next() != Some("cgroup") { - return None; - } + let version = match fields.next() { + Some("cgroup") => CgroupVersion::V1, + Some("cgroup2") => CgroupVersion::V2, + _ => return None, + }; - // 7 5 0:6 / /sys/fs/cgroup/cpu,cpuacct rw,nosuid,nodev,noexec,relatime shared:7 - cgroup cgroup - let super_opts = some!(fields.nth(1)); + // cgroups2 only has a single mount point + if version == CgroupVersion::V1 { + // 7 5 0:6 / /sys/fs/cgroup/cpu,cpuacct rw,nosuid,nodev,noexec,relatime shared:7 - cgroup cgroup + let super_opts = some!(fields.nth(1)); - // We only care about the 'cpu' option - if !super_opts.split(',').any(|opt| opt == "cpu") { - return None; + // We only care about the 'cpu' option + if !super_opts.split(',').any(|opt| opt == "cpu") { + return None; + } } Some(MountInfo { + version: version, root: mnt_root.to_owned(), mount_point: mnt_point.to_owned(), }) @@ -274,7 +312,14 @@ impl Subsys { file.lines() .filter_map(|result| result.ok()) .filter_map(Subsys::parse_line) - .next() + .fold(None, |previous, line| { + // already-found v1 trumps v2 since it explicitly specifies its controllers + if previous.is_some() && line.version == CgroupVersion::V2 { + return previous; + } + + Some(line) + }) } fn parse_line(line: String) -> Option { @@ -284,11 +329,18 @@ impl Subsys { let sub_systems = some!(fields.nth(1)); - if !sub_systems.split(',').any(|sub| sub == "cpu") { + let version = if sub_systems.is_empty() { + CgroupVersion::V2 + } else { + CgroupVersion::V1 + }; + + if version == CgroupVersion::V1 && !sub_systems.split(',').any(|sub| sub == "cpu") { return None; } fields.next().map(|path| Subsys { + version: version, base: path.to_owned(), }) } @@ -296,123 +348,248 @@ impl Subsys { #[cfg(test)] mod tests { - use super::{Cgroup, MountInfo, Subsys}; - use std::path::{Path, PathBuf}; + mod v1 { + use super::super::{Cgroup, CgroupVersion, MountInfo, Subsys}; + use std::path::{Path, PathBuf}; - // `static_in_const` feature is not stable in Rust 1.13. - static FIXTURES_PROC: &'static str = "fixtures/cgroups/proc/cgroups"; + // `static_in_const` feature is not stable in Rust 1.13. + static FIXTURES_PROC: &'static str = "fixtures/cgroups/proc/cgroups"; - static FIXTURES_CGROUPS: &'static str = "fixtures/cgroups/cgroups"; + static FIXTURES_CGROUPS: &'static str = "fixtures/cgroups/cgroups"; - macro_rules! join { - ($base:expr, $($path:expr),+) => ({ - Path::new($base) - $(.join($path))+ - }) - } + macro_rules! join { + ($base:expr, $($path:expr),+) => ({ + Path::new($base) + $(.join($path))+ + }) + } - #[test] - fn test_load_mountinfo() { - // test only one optional fields - let path = join!(FIXTURES_PROC, "mountinfo"); + #[test] + fn test_load_mountinfo() { + // test only one optional fields + let path = join!(FIXTURES_PROC, "mountinfo"); - let mnt_info = MountInfo::load_cpu(path).unwrap(); + let mnt_info = MountInfo::load_cpu(path, CgroupVersion::V1).unwrap(); - assert_eq!(mnt_info.root, "/"); - assert_eq!(mnt_info.mount_point, "/sys/fs/cgroup/cpu,cpuacct"); + assert_eq!(mnt_info.root, "/"); + assert_eq!(mnt_info.mount_point, "/sys/fs/cgroup/cpu,cpuacct"); - // test zero optional field - let path = join!(FIXTURES_PROC, "mountinfo_zero_opt"); + // test zero optional field + let path = join!(FIXTURES_PROC, "mountinfo_zero_opt"); - let mnt_info = MountInfo::load_cpu(path).unwrap(); + let mnt_info = MountInfo::load_cpu(path, CgroupVersion::V1).unwrap(); - assert_eq!(mnt_info.root, "/"); - assert_eq!(mnt_info.mount_point, "/sys/fs/cgroup/cpu,cpuacct"); + assert_eq!(mnt_info.root, "/"); + assert_eq!(mnt_info.mount_point, "/sys/fs/cgroup/cpu,cpuacct"); - // test multi optional fields - let path = join!(FIXTURES_PROC, "mountinfo_multi_opt"); + // test multi optional fields + let path = join!(FIXTURES_PROC, "mountinfo_multi_opt"); - let mnt_info = MountInfo::load_cpu(path).unwrap(); + let mnt_info = MountInfo::load_cpu(path, CgroupVersion::V1).unwrap(); - assert_eq!(mnt_info.root, "/"); - assert_eq!(mnt_info.mount_point, "/sys/fs/cgroup/cpu,cpuacct"); - } + assert_eq!(mnt_info.root, "/"); + assert_eq!(mnt_info.mount_point, "/sys/fs/cgroup/cpu,cpuacct"); + } - #[test] - fn test_load_subsys() { - let path = join!(FIXTURES_PROC, "cgroup"); + #[test] + fn test_load_subsys() { + let path = join!(FIXTURES_PROC, "cgroup"); - let subsys = Subsys::load_cpu(path).unwrap(); + let subsys = Subsys::load_cpu(path).unwrap(); - assert_eq!(subsys.base, "/"); - } + assert_eq!(subsys.base, "/"); + assert_eq!(subsys.version, CgroupVersion::V1); + } - #[test] - fn test_cgroup_mount() { - let cases = &[ - ("/", "/sys/fs/cgroup/cpu", "/", Some("/sys/fs/cgroup/cpu")), - ( - "/docker/01abcd", - "/sys/fs/cgroup/cpu", - "/docker/01abcd", - Some("/sys/fs/cgroup/cpu"), - ), - ( - "/docker/01abcd", - "/sys/fs/cgroup/cpu", - "/docker/01abcd/", - Some("/sys/fs/cgroup/cpu"), - ), - ( - "/docker/01abcd", - "/sys/fs/cgroup/cpu", - "/docker/01abcd/large", - Some("/sys/fs/cgroup/cpu/large"), - ), - // fails - ("/docker/01abcd", "/sys/fs/cgroup/cpu", "/", None), - ("/docker/01abcd", "/sys/fs/cgroup/cpu", "/docker", None), - ("/docker/01abcd", "/sys/fs/cgroup/cpu", "/elsewhere", None), - ( - "/docker/01abcd", - "/sys/fs/cgroup/cpu", - "/docker/01abcd-other-dir", - None, - ), - ]; - - for &(root, mount_point, subsys, expected) in cases.iter() { - let mnt_info = MountInfo { - root: root.into(), - mount_point: mount_point.into(), - }; - let subsys = Subsys { - base: subsys.into(), - }; + #[test] + fn test_cgroup_mount() { + let cases = &[ + ("/", "/sys/fs/cgroup/cpu", "/", Some("/sys/fs/cgroup/cpu")), + ( + "/docker/01abcd", + "/sys/fs/cgroup/cpu", + "/docker/01abcd", + Some("/sys/fs/cgroup/cpu"), + ), + ( + "/docker/01abcd", + "/sys/fs/cgroup/cpu", + "/docker/01abcd/", + Some("/sys/fs/cgroup/cpu"), + ), + ( + "/docker/01abcd", + "/sys/fs/cgroup/cpu", + "/docker/01abcd/large", + Some("/sys/fs/cgroup/cpu/large"), + ), + // fails + ("/docker/01abcd", "/sys/fs/cgroup/cpu", "/", None), + ("/docker/01abcd", "/sys/fs/cgroup/cpu", "/docker", None), + ("/docker/01abcd", "/sys/fs/cgroup/cpu", "/elsewhere", None), + ( + "/docker/01abcd", + "/sys/fs/cgroup/cpu", + "/docker/01abcd-other-dir", + None, + ), + ]; + + for &(root, mount_point, subsys, expected) in cases.iter() { + let mnt_info = MountInfo { + version: CgroupVersion::V1, + root: root.into(), + mount_point: mount_point.into(), + }; + let subsys = Subsys { + version: CgroupVersion::V1, + base: subsys.into(), + }; + + let actual = Cgroup::translate(mnt_info, subsys).map(|c| c.base); + let expected = expected.map(PathBuf::from); + assert_eq!(actual, expected); + } + } - let actual = Cgroup::translate(mnt_info, subsys).map(|c| c.base); - let expected = expected.map(PathBuf::from); - assert_eq!(actual, expected); + #[test] + fn test_cgroup_cpu_quota() { + let cgroup = Cgroup::new(CgroupVersion::V1, join!(FIXTURES_CGROUPS, "good")); + assert_eq!(cgroup.cpu_quota(), Some(6)); } - } - #[test] - fn test_cgroup_cpu_quota() { - let cgroup = Cgroup::new(join!(FIXTURES_CGROUPS, "good")); - assert_eq!(cgroup.cpu_quota(), Some(6)); - } + #[test] + fn test_cgroup_cpu_quota_divide_by_zero() { + let cgroup = Cgroup::new(CgroupVersion::V1, join!(FIXTURES_CGROUPS, "zero-period")); + assert!(cgroup.quota_us().is_some()); + assert_eq!(cgroup.period_us(), Some(0)); + assert_eq!(cgroup.cpu_quota(), None); + } - #[test] - fn test_cgroup_cpu_quota_divide_by_zero() { - let cgroup = Cgroup::new(join!(FIXTURES_CGROUPS, "zero-period")); - assert!(cgroup.quota_us().is_some()); - assert_eq!(cgroup.period_us(), Some(0)); - assert_eq!(cgroup.cpu_quota(), None); + #[test] + fn test_cgroup_cpu_quota_ceil() { + let cgroup = Cgroup::new(CgroupVersion::V1, join!(FIXTURES_CGROUPS, "ceil")); + assert_eq!(cgroup.cpu_quota(), Some(2)); + } } - #[test] - fn test_cgroup_cpu_quota_ceil() { - let cgroup = Cgroup::new(join!(FIXTURES_CGROUPS, "ceil")); - assert_eq!(cgroup.cpu_quota(), Some(2)); + mod v2 { + use super::super::{Cgroup, CgroupVersion, MountInfo, Subsys}; + use std::path::{Path, PathBuf}; + + // `static_in_const` feature is not stable in Rust 1.13. + static FIXTURES_PROC: &'static str = "fixtures/cgroups2/proc/cgroups"; + + static FIXTURES_CGROUPS: &'static str = "fixtures/cgroups2/cgroups"; + + macro_rules! join { + ($base:expr, $($path:expr),+) => ({ + Path::new($base) + $(.join($path))+ + }) + } + + #[test] + fn test_load_mountinfo() { + // test only one optional fields + let path = join!(FIXTURES_PROC, "mountinfo"); + + let mnt_info = MountInfo::load_cpu(path, CgroupVersion::V2).unwrap(); + + assert_eq!(mnt_info.root, "/"); + assert_eq!(mnt_info.mount_point, "/sys/fs/cgroup"); + } + + #[test] + fn test_load_subsys() { + let path = join!(FIXTURES_PROC, "cgroup"); + + let subsys = Subsys::load_cpu(path).unwrap(); + + assert_eq!(subsys.base, "/"); + assert_eq!(subsys.version, CgroupVersion::V2); + } + + #[test] + fn test_load_subsys_multi() { + let path = join!(FIXTURES_PROC, "cgroup_multi"); + + let subsys = Subsys::load_cpu(path).unwrap(); + + assert_eq!(subsys.base, "/"); + assert_eq!(subsys.version, CgroupVersion::V1); + } + + #[test] + fn test_cgroup_mount() { + let cases = &[ + ("/", "/sys/fs/cgroup/cpu", "/", Some("/sys/fs/cgroup/cpu")), + ( + "/docker/01abcd", + "/sys/fs/cgroup/cpu", + "/docker/01abcd", + Some("/sys/fs/cgroup/cpu"), + ), + ( + "/docker/01abcd", + "/sys/fs/cgroup/cpu", + "/docker/01abcd/", + Some("/sys/fs/cgroup/cpu"), + ), + ( + "/docker/01abcd", + "/sys/fs/cgroup/cpu", + "/docker/01abcd/large", + Some("/sys/fs/cgroup/cpu/large"), + ), + // fails + ("/docker/01abcd", "/sys/fs/cgroup/cpu", "/", None), + ("/docker/01abcd", "/sys/fs/cgroup/cpu", "/docker", None), + ("/docker/01abcd", "/sys/fs/cgroup/cpu", "/elsewhere", None), + ( + "/docker/01abcd", + "/sys/fs/cgroup/cpu", + "/docker/01abcd-other-dir", + None, + ), + ]; + + for &(root, mount_point, subsys, expected) in cases.iter() { + let mnt_info = MountInfo { + version: CgroupVersion::V1, + root: root.into(), + mount_point: mount_point.into(), + }; + let subsys = Subsys { + version: CgroupVersion::V1, + base: subsys.into(), + }; + + let actual = Cgroup::translate(mnt_info, subsys).map(|c| c.base); + let expected = expected.map(PathBuf::from); + assert_eq!(actual, expected); + } + } + + #[test] + fn test_cgroup_cpu_quota() { + let cgroup = Cgroup::new(CgroupVersion::V2, join!(FIXTURES_CGROUPS, "good")); + assert_eq!(cgroup.cpu_quota(), Some(6)); + } + + #[test] + fn test_cgroup_cpu_quota_divide_by_zero() { + let cgroup = Cgroup::new(CgroupVersion::V2, join!(FIXTURES_CGROUPS, "zero-period")); + let period = cgroup.max().map(|max| max.1); + + assert_eq!(period, Some(0)); + assert_eq!(cgroup.cpu_quota(), None); + } + + #[test] + fn test_cgroup_cpu_quota_ceil() { + let cgroup = Cgroup::new(CgroupVersion::V2, join!(FIXTURES_CGROUPS, "ceil")); + assert_eq!(cgroup.cpu_quota(), Some(2)); + } } } -- cgit v1.2.3