Compare commits

...

37 Commits

Author SHA1 Message Date
Fupan Li
1df6e7a26e Merge pull request #75 from Tim-Zhang/release-0.2.9
release: v0.2.9
2022-03-03 11:39:13 +08:00
Tim Zhang
1bdd52470f release: v0.2.9
Release version 0.2.9

Signed-off-by: Tim Zhang <tim@hyper.sh>
2022-03-03 10:37:13 +08:00
Fupan Li
231d9d599e Merge pull request #74 from Tim-Zhang/avoid-panic-in-hugetlb
hugetlb: avoid panic caused by readdir in get_hugepage_sizes()
2022-03-02 18:12:48 +08:00
Fupan Li
a3bd03c662 Merge pull request #73 from Burning1020/pid-cgroup-path
cgroup: support get cgroup relative paths by process pid
2022-03-02 18:12:10 +08:00
Tim Zhang
8932df3fa0 hugetlb: avoid panic caused by readdir in get_hugepage_sizes()
The error EBADF might be occured during readdir()
Skip the size when the error apperar, do not panic.

Signed-off-by: Tim Zhang <tim@hyper.sh>
2022-03-02 17:07:50 +08:00
Zhang Tianyang
fa94a1174f cgroup: support get cgroup relative paths by process pid
support get cgroup relative paths by process pid

Signed-off-by: Zhang Tianyang <burning9699@gmail.com>
2022-03-02 16:48:05 +08:00
Tim Zhang
b4df6016b3 Merge pull request #71 from Tim-Zhang/release-0.2.8
release: v0.2.8
2021-12-17 18:27:13 +08:00
Tim Zhang
0686400268 release: v0.2.8
Bump version from 0.2.7 to 0.2.8

Signed-off-by: Tim Zhang <tim@hyper.sh>
2021-12-17 17:40:45 +08:00
Tim Zhang
6986c49e70 Merge pull request #67 from jodh-intel/update-nix-version
cargo: Update nix to latest version
2021-11-30 17:58:31 +08:00
James O. D. Hunt
e0bf36ae23 cargo: Update nix to latest version
Update the `nix` crate to version `0.23.0` to resolve a dependency
issue related to making `cargo audit` run cleanly for the Kata
Containers agent.

See:

https://github.com/kata-containers/kata-containers/pull/3125

Fixes: #66.

Signed-off-by: James O. D. Hunt <james.o.hunt@intel.com>
2021-11-26 11:17:58 +00:00
Fupan Li
2c68f36488 Merge pull request #65 from Tim-Zhang/release-0.2.7
release: v0.2.7
2021-11-11 11:36:20 +08:00
Tim Zhang
0bc1b9821b release: v0.2.7
Bump version from 0.2.6 to 0.2.7

Signed-off-by: Tim Zhang <tim@hyper.sh>
2021-11-11 11:25:28 +08:00
Tim Zhang
da75ba25d6 Merge pull request #59 from jmagnuson/update-nix-0.20.2
deps: update nix to 0.20.2
2021-11-11 11:23:08 +08:00
Jon Magnuson
01475ad515 clippy: fix needless-borrow in test
Fix needless-borrow in test.

Signed-off-by: Jon Magnuson <jon.magnuson@gmail.com>
2021-11-11 11:20:49 +08:00
Tim Zhang
417badd05f Merge pull request #61 from mjerabek/fix-freezer-for-v2
fix: support FreezerController in cgroups v2
2021-11-11 11:11:38 +08:00
Tim Zhang
1720443d58 Merge pull request #63 from quanweiZhou/fix_read_task_hang
fix: read task hang when the cgroup dir removed after open
2021-11-11 11:09:35 +08:00
quanwei.zqw
fb55383273 fix: read task hang when the cgroup dir removed after open
Fixes #62
Signed-off-by: quanweiZhou <quanweiZhou@linux.alibaba.com>
2021-11-10 19:52:42 +08:00
Tim Zhang
0233c1e046 Merge pull request #64 from Tim-Zhang/action-lock-rust-version
action: Lock rust version and fix commit-body checker
2021-11-10 19:39:00 +08:00
Tim Zhang
bf5af7b195 action: fix the the body line checker
the original regex can not handle pasted error message
rightly. this commit will fix this.

Signed-off-by: Tim Zhang <tim@hyper.sh>
2021-11-10 19:34:30 +08:00
Tim Zhang
2e3719dbd5 action: Lock rust version to 1.52
Got the following error in the clippy:
error: this expression borrows a reference (`&str`) that is immediately dereferenced by the compiler
  --> tests/cpuset.rs:54:37
   |
54 |             let r = cpuset.set_cpus(&cpus);
   |                                     ^^^^^ help: change this to: `cpus`
   |
   = note: `-D clippy::needless-borrow` implied by `-D warnings`
   = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#needless_borrow

But we did not touch the code, just becuase the clippy rules was updated
follow the rust update.

To avoid this problem we lock the rust version in CI and make it
steady.

Signed-off-by: Tim Zhang <tim@hyper.sh>
2021-11-10 19:29:14 +08:00
Martin Jeřábek
4231f35a44 fix: support FreezerController in cgroups v2
Fixes #60

Signed-off-by: Martin Jeřábek <martin.jerabek01@gmail.com>
2021-11-10 11:05:33 +01:00
Jon Magnuson
88b7aafd05 deps: update nix to 0.20.2
Enforces use of a version of nix which contains a patch for
RUSTSEC-2021-0119.

Fixes #58

Signed-off-by: Jon Magnuson <jon.magnuson@gmail.com>
2021-10-28 22:27:58 -05:00
Fupan Li
63750887c2 Merge pull request #56 from flxo/pr-serde
Add Serialize/Deserialize to resource and stat types
2021-08-04 10:10:28 +08:00
Felix Obenhuber
09499e7614 Add Serialize/Deserialize to resource and stat types
Add feature "serde" that derives all resource and statistics types from
Serialize and Deserialize. The feature is turned off by default.

Fixes #54
Fixes #55
Fixes #56

Signed-off-by: Felix Obenhuber <felix@obenhuber.de>
2021-08-03 09:55:10 +02:00
Fupan Li
bcb7c6cd54 Merge pull request #51 from Tim-Zhang/release-0.2.6
release: v0.2.6
2021-06-30 20:53:39 +08:00
Tim Zhang
2554aa65d0 release: v0.2.6
Bump version from 0.2.5 to 0.2.6

Signed-off-by: Tim Zhang <tim@hyper.sh>
2021-06-30 20:36:34 +08:00
Tim Zhang
34f935be89 Merge pull request #49 from lifupan/master
freezer: fix the issue of missing trim the str
2021-06-30 20:35:22 +08:00
Fupan Li
5485d8dd46 Merge pull request #50 from Tim-Zhang/fix-clippy-for-rust-1.53
Fix clippy for rust 1.53
2021-06-30 19:58:48 +08:00
Tim Zhang
ec4cda1dd9 Fix clippy for rust 1.53
There are new lints are added in clippy for rust 1.53

Signed-off-by: Tim Zhang <tim@hyper.sh>
2021-06-30 19:07:56 +08:00
fupan.lfp
4b5a190ecc freezer: fix the issue of missing trim the str
When reading from the freezer file, it should trim it
first, and the string may container an '\n'.

Fixes: #48

Signed-off-by: fupan.lfp <fupan.lfp@antgroup.com>
2021-06-30 18:39:33 +08:00
Fupan Li
45b626e0c0 Merge pull request #46 from Tim-Zhang/fix-clippy-for-rust-1.52
Fix clippy for rust 1.52
2021-05-21 16:24:16 +08:00
Tim Zhang
0e2430fde1 clippy: turn on lint upper_case_acronyms
cargo-clippy has moved the upper_case_acronyms lint to
pedantic(removed from the default list), but we need
the lint to keep names consistent and follow the rust
naming conventions.

Signed-off-by: Tim Zhang <tim@hyper.sh>
2021-05-21 00:48:50 +08:00
Tim Zhang
5aa7e6c90e Fix clippy for rust 1.52
There are new lints are added in clippy for rust 1.52

Signed-off-by: Tim Zhang <tim@hyper.sh>
2021-05-21 00:45:27 +08:00
Fupan Li
5bb27a2692 Merge pull request #45 from Tim-Zhang/release-0.2.5
release: v0.2.5
2021-03-24 14:52:27 +08:00
Tim Zhang
0b2a0405e2 release: v0.2.5
Bump version to 0.2.5

Signed-off-by: Tim Zhang <tim@hyper.sh>
2021-03-24 14:37:19 +08:00
Bin Liu
c4850ef2ef Merge pull request #44 from Tim-Zhang/impl-clone
Impl Clone for hierarchies:V1, hierarchies:V2
2021-03-23 22:31:27 +08:00
Tim Zhang
aa207edca8 Impl Clone for hierarchies:V1, hierarchies:V2
Clone is useful.

Signed-off-by: Tim Zhang <tim@hyper.sh>
2021-03-23 21:50:18 +08:00
22 changed files with 141 additions and 67 deletions

1
.clippy.toml Normal file
View File

@@ -0,0 +1 @@
upper-case-acronyms-aggressive = true

View File

@@ -1,20 +1,22 @@
name: BVT name: BVT
on: [pull_request] on: [pull_request]
env:
RUST_VERSION: 1.52
jobs: jobs:
build: build:
name: Build name: Build
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- name: Checkout - uses: actions/checkout@v2
uses: actions/checkout@v2 - run: rustup install ${{ env.RUST_VERSION }} && rustup default ${{ env.RUST_VERSION }}
- name: Build - run: make debug
run: make debug
fmt: fmt:
name: Format Check name: Format Check
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- uses: actions/checkout@v2 - uses: actions/checkout@v2
- run: rustup install ${{ env.RUST_VERSION }} && rustup default ${{ env.RUST_VERSION }}
- run: rustup component add rustfmt - run: rustup component add rustfmt
- run: make fmt - run: make fmt
clippy: clippy:
@@ -22,6 +24,7 @@ jobs:
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- uses: actions/checkout@v2 - uses: actions/checkout@v2
- run: rustup install ${{ env.RUST_VERSION }} && rustup default ${{ env.RUST_VERSION }}
- run: rustup component add clippy - run: rustup component add clippy
- run: make clippy - run: make clippy
test: test:
@@ -29,6 +32,7 @@ jobs:
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- uses: actions/checkout@v2 - uses: actions/checkout@v2
- run: rustup install ${{ env.RUST_VERSION }} && rustup default ${{ env.RUST_VERSION }}
- run: make test - run: make test

View File

@@ -48,6 +48,6 @@ jobs:
uses: tim-actions/commit-message-checker-with-regex@v0.3.1 uses: tim-actions/commit-message-checker-with-regex@v0.3.1
with: with:
commits: ${{ steps.get-pr-commits.outputs.commits }} commits: ${{ steps.get-pr-commits.outputs.commits }}
pattern: '^.+(\n.{0,72})*$|^.+\n\s*[^a-zA-Z\s\n]|^.+\n\S+$' pattern: '^.+(\n([a-zA-Z].{0,149}|[^a-zA-Z\n].*|Signed-off-by:.*|))+$'
error: 'Body line too long (max 72)' error: 'Body line too long (max 72)'
post_error: ${{ env.error_msg }} post_error: ${{ env.error_msg }}

View File

@@ -5,7 +5,7 @@ repository = "https://github.com/kata-containers/cgroups-rs"
keywords = ["linux", "cgroup", "containers", "isolation"] keywords = ["linux", "cgroup", "containers", "isolation"]
categories = ["os", "api-bindings", "os::unix-apis"] categories = ["os", "api-bindings", "os::unix-apis"]
license = "MIT OR Apache-2.0" license = "MIT OR Apache-2.0"
version = "0.2.4" version = "0.2.9"
authors = ["The Kata Containers community <kata-dev@lists.katacontainers.io>", "Levente Kurusa <lkurusa@acm.org>", "Sam Wilson <tecywiz121@hotmail.com>"] authors = ["The Kata Containers community <kata-dev@lists.katacontainers.io>", "Levente Kurusa <lkurusa@acm.org>", "Sam Wilson <tecywiz121@hotmail.com>"]
edition = "2018" edition = "2018"
homepage = "https://github.com/kata-containers/cgroups-rs" homepage = "https://github.com/kata-containers/cgroups-rs"
@@ -14,8 +14,12 @@ readme = "README.md"
[dependencies] [dependencies]
log = "0.4" log = "0.4"
regex = "1.1" regex = "1.1"
nix = "0.20.0" nix = "0.23.0"
libc = "0.2" libc = "0.2"
serde = { version = "1.0", features = ["derive"], optional = true }
[dev-dependencies] [dev-dependencies]
libc = "0.2.76" libc = "0.2.76"
[features]
default = []

View File

@@ -31,6 +31,7 @@ pub struct BlkIoController {
} }
#[derive(Eq, PartialEq, Debug)] #[derive(Eq, PartialEq, Debug)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
/// Per-device information /// Per-device information
pub struct BlkIoData { pub struct BlkIoData {
/// The major number of the device. /// The major number of the device.
@@ -42,6 +43,7 @@ pub struct BlkIoData {
} }
#[derive(Eq, PartialEq, Debug)] #[derive(Eq, PartialEq, Debug)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
/// Per-device activity from the control group. /// Per-device activity from the control group.
pub struct IoService { pub struct IoService {
/// The major number of the device. /// The major number of the device.
@@ -61,6 +63,7 @@ pub struct IoService {
} }
#[derive(Eq, PartialEq, Debug)] #[derive(Eq, PartialEq, Debug)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
/// Per-device activity from the control group. /// Per-device activity from the control group.
/// Only for cgroup v2 /// Only for cgroup v2
pub struct IoStat { pub struct IoStat {
@@ -203,6 +206,7 @@ fn parse_blkio_data(s: String) -> Result<Vec<BlkIoData>> {
/// Current state and statistics about how throttled are the block devices when accessed from the /// Current state and statistics about how throttled are the block devices when accessed from the
/// controller's control group. /// controller's control group.
#[derive(Default, Debug)] #[derive(Default, Debug)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct BlkIoThrottle { pub struct BlkIoThrottle {
/// Statistics about the bytes transferred between the block devices by the tasks in this /// Statistics about the bytes transferred between the block devices by the tasks in this
/// control group. /// control group.
@@ -238,6 +242,7 @@ pub struct BlkIoThrottle {
/// Statistics and state of the block devices. /// Statistics and state of the block devices.
#[derive(Default, Debug)] #[derive(Default, Debug)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct BlkIo { pub struct BlkIo {
/// The number of BIOS requests merged into I/O requests by the control group's tasks. /// The number of BIOS requests merged into I/O requests by the control group's tasks.
pub io_merged: Vec<IoService>, pub io_merged: Vec<IoService>,

View File

@@ -311,9 +311,8 @@ impl Cgroup {
pub const UNIFIED_MOUNTPOINT: &str = "/sys/fs/cgroup"; pub const UNIFIED_MOUNTPOINT: &str = "/sys/fs/cgroup";
fn enable_controllers(controllers: &[String], path: &PathBuf) { fn enable_controllers(controllers: &[String], path: &Path) {
let mut f = path.clone(); let f = path.join("cgroup.subtree_control");
f.push("cgroup.subtree_control");
for c in controllers { for c in controllers {
let body = format!("+{}", c); let body = format!("+{}", c);
let _rest = fs::write(f.as_path(), body.as_bytes()); let _rest = fs::write(f.as_path(), body.as_bytes());
@@ -360,9 +359,18 @@ fn create_v2_cgroup(root: PathBuf, path: &str) -> Result<()> {
} }
pub fn get_cgroups_relative_paths() -> Result<HashMap<String, String>> { pub fn get_cgroups_relative_paths() -> Result<HashMap<String, String>> {
let path = "/proc/self/cgroup".to_string();
get_cgroups_relative_paths_by_path(path)
}
pub fn get_cgroups_relative_paths_by_pid(pid: u32) -> Result<HashMap<String, String>> {
let path = format!("/proc/{}/cgroup", pid);
get_cgroups_relative_paths_by_path(path)
}
fn get_cgroups_relative_paths_by_path(path: String) -> Result<HashMap<String, String>> {
let mut m = HashMap::new(); let mut m = HashMap::new();
let content = let content = fs::read_to_string(path).map_err(|e| Error::with_cause(ReadFailed, e))?;
fs::read_to_string("/proc/self/cgroup").map_err(|e| Error::with_cause(ReadFailed, e))?;
for l in content.lines() { for l in content.lines() {
let fl: Vec<&str> = l.split(':').collect(); let fl: Vec<&str> = l.split(':').collect();
if fl.len() != 3 { if fl.len() != 3 {

View File

@@ -240,10 +240,10 @@ impl DeviceResourceBuilder {
access: Vec<crate::devices::DevicePermissions>, access: Vec<crate::devices::DevicePermissions>,
) -> DeviceResourceBuilder { ) -> DeviceResourceBuilder {
self.cgroup.resources.devices.devices.push(DeviceResource { self.cgroup.resources.devices.devices.push(DeviceResource {
allow,
devtype,
major, major,
minor, minor,
devtype,
allow,
access, access,
}); });
self self

View File

@@ -36,6 +36,7 @@ pub struct CpuController {
/// The current state of the control group and its processes. /// The current state of the control group and its processes.
#[derive(Debug)] #[derive(Debug)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct Cpu { pub struct Cpu {
/// Reports CPU time statistics. /// Reports CPU time statistics.
/// ///
@@ -45,7 +46,7 @@ pub struct Cpu {
/// The current state of the control group and its processes. /// The current state of the control group and its processes.
#[derive(Debug)] #[derive(Debug)]
struct CFSQuotaAndPeriod { struct CfsQuotaAndPeriod {
quota: MaxValue, quota: MaxValue,
period: u64, period: u64,
} }
@@ -284,7 +285,7 @@ impl CpuController {
impl CustomizedAttribute for CpuController {} impl CustomizedAttribute for CpuController {}
fn parse_cfs_quota_and_period(mut file: File) -> Result<CFSQuotaAndPeriod> { fn parse_cfs_quota_and_period(mut file: File) -> Result<CfsQuotaAndPeriod> {
let mut content = String::new(); let mut content = String::new();
file.read_to_string(&mut content) file.read_to_string(&mut content)
.map_err(|e| Error::with_cause(ReadFailed, e))?; .map_err(|e| Error::with_cause(ReadFailed, e))?;
@@ -299,5 +300,5 @@ fn parse_cfs_quota_and_period(mut file: File) -> Result<CFSQuotaAndPeriod> {
.parse::<u64>() .parse::<u64>()
.map_err(|e| Error::with_cause(ParseError, e))?; .map_err(|e| Error::with_cause(ParseError, e))?;
Ok(CFSQuotaAndPeriod { quota, period }) Ok(CfsQuotaAndPeriod { quota, period })
} }

View File

@@ -27,6 +27,7 @@ pub struct CpuAcctController {
} }
/// Represents the statistics retrieved from the control group. /// Represents the statistics retrieved from the control group.
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct CpuAcct { pub struct CpuAcct {
/// Divides the time used by the tasks into `user` time and `system` time. /// Divides the time used by the tasks into `user` time and `system` time.
pub stat: String, pub stat: String,

View File

@@ -33,6 +33,7 @@ pub struct CpuSetController {
} }
/// The current state of the `cpuset` controller for this control group. /// The current state of the `cpuset` controller for this control group.
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct CpuSet { pub struct CpuSet {
/// If true, no other control groups can share the CPUs listed in the `cpus` field. /// If true, no other control groups can share the CPUs listed in the `cpus` field.
pub cpu_exclusive: bool, pub cpu_exclusive: bool,

View File

@@ -32,6 +32,11 @@ pub struct DevicesController {
/// An enum holding the different types of devices that can be manipulated using this controller. /// An enum holding the different types of devices that can be manipulated using this controller.
#[derive(Debug, Copy, Clone, PartialEq, Eq)] #[derive(Debug, Copy, Clone, PartialEq, Eq)]
#[cfg_attr(
feature = "serde",
derive(serde::Serialize, serde::Deserialize),
serde(rename_all = "snake_case")
)]
pub enum DeviceType { pub enum DeviceType {
/// The rule applies to all devices. /// The rule applies to all devices.
All, All,
@@ -49,6 +54,7 @@ impl Default for DeviceType {
impl DeviceType { impl DeviceType {
/// Convert a DeviceType into the character that the kernel recognizes. /// Convert a DeviceType into the character that the kernel recognizes.
#[allow(clippy::should_implement_trait, clippy::wrong_self_convention)]
pub fn to_char(&self) -> char { pub fn to_char(&self) -> char {
match self { match self {
DeviceType::All => 'a', DeviceType::All => 'a',
@@ -70,6 +76,11 @@ impl DeviceType {
/// An enum with the permissions that can be allowed/denied to the control group. /// An enum with the permissions that can be allowed/denied to the control group.
#[derive(Debug, Copy, Clone, PartialEq, Eq)] #[derive(Debug, Copy, Clone, PartialEq, Eq)]
#[cfg_attr(
feature = "serde",
derive(serde::Serialize, serde::Deserialize),
serde(rename_all = "snake_case")
)]
pub enum DevicePermissions { pub enum DevicePermissions {
/// Permission to read from the device. /// Permission to read from the device.
Read, Read,
@@ -82,6 +93,7 @@ pub enum DevicePermissions {
impl DevicePermissions { impl DevicePermissions {
/// Convert a DevicePermissions into the character that the kernel recognizes. /// Convert a DevicePermissions into the character that the kernel recognizes.
#[allow(clippy::should_implement_trait, clippy::wrong_self_convention)]
pub fn to_char(&self) -> char { pub fn to_char(&self) -> char {
match self { match self {
DevicePermissions::Read => 'r', DevicePermissions::Read => 'r',

View File

@@ -76,6 +76,7 @@ impl fmt::Display for Error {
impl StdError for Error { impl StdError for Error {
fn cause(&self) -> Option<&dyn StdError> { fn cause(&self) -> Option<&dyn StdError> {
#[allow(clippy::manual_map)]
match self.cause { match self.cause {
Some(ref x) => Some(&**x), Some(ref x) => Some(&**x),
None => None, None => None,

View File

@@ -8,7 +8,7 @@ use nix::sys::eventfd;
use std::fs::{self, File}; use std::fs::{self, File};
use std::io::Read; use std::io::Read;
use std::os::unix::io::{AsRawFd, FromRawFd}; use std::os::unix::io::{AsRawFd, FromRawFd};
use std::path::{Path, PathBuf}; use std::path::Path;
use std::sync::mpsc::{self, Receiver}; use std::sync::mpsc::{self, Receiver};
use std::thread; use std::thread;
@@ -17,18 +17,18 @@ use crate::error::*;
// notify_on_oom returns channel on which you can expect event about OOM, // notify_on_oom returns channel on which you can expect event about OOM,
// if process died without OOM this channel will be closed. // if process died without OOM this channel will be closed.
pub fn notify_on_oom_v2(key: &str, dir: &PathBuf) -> Result<Receiver<String>> { pub fn notify_on_oom_v2(key: &str, dir: &Path) -> Result<Receiver<String>> {
register_memory_event(key, dir, "memory.oom_control", "") register_memory_event(key, dir, "memory.oom_control", "")
} }
// notify_on_oom returns channel on which you can expect event about OOM, // notify_on_oom returns channel on which you can expect event about OOM,
// if process died without OOM this channel will be closed. // if process died without OOM this channel will be closed.
pub fn notify_on_oom_v1(key: &str, dir: &PathBuf) -> Result<Receiver<String>> { pub fn notify_on_oom_v1(key: &str, dir: &Path) -> Result<Receiver<String>> {
register_memory_event(key, dir, "memory.oom_control", "") register_memory_event(key, dir, "memory.oom_control", "")
} }
// level is one of "low", "medium", or "critical" // level is one of "low", "medium", or "critical"
pub fn notify_memory_pressure(key: &str, dir: &PathBuf, level: &str) -> Result<Receiver<String>> { pub fn notify_memory_pressure(key: &str, dir: &Path, level: &str) -> Result<Receiver<String>> {
if level != "low" && level != "medium" && level != "critical" { if level != "low" && level != "medium" && level != "critical" {
return Err(Error::from_string(format!( return Err(Error::from_string(format!(
"invalid pressure level {}", "invalid pressure level {}",
@@ -41,7 +41,7 @@ pub fn notify_memory_pressure(key: &str, dir: &PathBuf, level: &str) -> Result<R
fn register_memory_event( fn register_memory_event(
key: &str, key: &str,
cg_dir: &PathBuf, cg_dir: &Path,
event_name: &str, event_name: &str,
arg: &str, arg: &str,
) -> Result<Receiver<String>> { ) -> Result<Receiver<String>> {

View File

@@ -32,6 +32,7 @@ pub struct FreezerController {
} }
/// The current state of the control group /// The current state of the control group
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub enum FreezerState { pub enum FreezerState {
/// The processes in the control group are _not_ frozen. /// The processes in the control group are _not_ frozen.
Thawed, Thawed,
@@ -130,7 +131,7 @@ impl FreezerController {
let mut s = String::new(); let mut s = String::new();
let res = file.read_to_string(&mut s); let res = file.read_to_string(&mut s);
match res { match res {
Ok(_) => match s.as_ref() { Ok(_) => match s.trim() {
"FROZEN" => Ok(FreezerState::Frozen), "FROZEN" => Ok(FreezerState::Frozen),
"THAWED" => Ok(FreezerState::Thawed), "THAWED" => Ok(FreezerState::Thawed),
"1" => Ok(FreezerState::Frozen), "1" => Ok(FreezerState::Frozen),

View File

@@ -35,7 +35,7 @@ use crate::cgroup::Cgroup;
/// Process mounts information. /// Process mounts information.
/// ///
/// See `proc(5)` for format details. /// See `proc(5)` for format details.
#[derive(Debug, PartialEq, Eq, Hash)] #[derive(Debug, PartialEq, Eq, Hash, Clone)]
pub struct Mountinfo { pub struct Mountinfo {
/// Mount pathname relative to the process's root. /// Mount pathname relative to the process's root.
pub mount_point: PathBuf, pub mount_point: PathBuf,
@@ -87,7 +87,7 @@ fn mountinfo_file(file: &mut File) -> Vec<Mountinfo> {
} }
} }
} }
Err(_) => continue, Err(_) => break,
} }
} }
r r
@@ -102,12 +102,12 @@ pub fn mountinfo_self() -> Vec<Mountinfo> {
} }
/// The standard, original cgroup implementation. Often referred to as "cgroupv1". /// The standard, original cgroup implementation. Often referred to as "cgroupv1".
#[derive(Debug)] #[derive(Debug, Clone)]
pub struct V1 { pub struct V1 {
mountinfo: Vec<Mountinfo>, mountinfo: Vec<Mountinfo>,
} }
#[derive(Debug)] #[derive(Debug, Clone)]
pub struct V2 { pub struct V2 {
root: String, root: String,
} }
@@ -202,7 +202,12 @@ impl Hierarchy for V2 {
let mut subs = vec![]; let mut subs = vec![];
let controllers = ret.unwrap().trim().to_string(); let controllers = ret.unwrap().trim().to_string();
let controller_list: Vec<&str> = controllers.split(' ').collect(); let mut controller_list: Vec<&str> = controllers.split(' ').collect();
// The freezer functionality is present in V2, but not as a controller,
// but apparently as a core functionality. FreezerController supports
// that, but we must explicitly fake the controller here.
controller_list.push("freezer");
for s in controller_list { for s in controller_list {
match s { match s {

View File

@@ -8,6 +8,7 @@
//! //!
//! See the Kernel's documentation for more information about this subsystem, found at: //! See the Kernel's documentation for more information about this subsystem, found at:
//! [Documentation/cgroup-v1/hugetlb.txt](https://www.kernel.org/doc/Documentation/cgroup-v1/hugetlb.txt) //! [Documentation/cgroup-v1/hugetlb.txt](https://www.kernel.org/doc/Documentation/cgroup-v1/hugetlb.txt)
use log::warn;
use std::io::Write; use std::io::Write;
use std::path::PathBuf; use std::path::PathBuf;
@@ -88,7 +89,7 @@ impl<'a> From<&'a Subsystem> for &'a HugeTlbController {
impl HugeTlbController { impl HugeTlbController {
/// Constructs a new `HugeTlbController` with `root` serving as the root of the control group. /// Constructs a new `HugeTlbController` with `root` serving as the root of the control group.
pub fn new(root: PathBuf, v2: bool) -> Self { pub fn new(root: PathBuf, v2: bool) -> Self {
let sizes = get_hugepage_sizes().unwrap(); let sizes = get_hugepage_sizes();
Self { Self {
base: root.clone(), base: root.clone(),
path: root, path: root,
@@ -180,27 +181,29 @@ use regex::Regex;
use std::collections::HashMap; use std::collections::HashMap;
use std::fs; use std::fs;
fn get_hugepage_sizes() -> Result<Vec<String>> { fn get_hugepage_sizes() -> Vec<String> {
let mut m = Vec::new();
let dirs = fs::read_dir(HUGEPAGESIZE_DIR); let dirs = fs::read_dir(HUGEPAGESIZE_DIR);
if dirs.is_err() { if dirs.is_err() {
return Ok(m); return Vec::new();
} }
for e in dirs.unwrap() { dirs.unwrap()
let entry = e.unwrap(); .filter_map(|e| {
let name = entry.file_name().into_string().unwrap(); let entry = e.map_err(|e| warn!("readdir error: {:?}", e)).ok()?;
let parts: Vec<&str> = name.split('-').collect(); let name = entry.file_name().into_string().unwrap();
if parts.len() != 2 { let parts: Vec<&str> = name.split('-').collect();
continue; if parts.len() != 2 {
} return None;
let bmap = get_binary_size_map(); }
let size = parse_size(parts[1], &bmap)?; let bmap = get_binary_size_map();
let dabbrs = get_decimal_abbrs(); let size = parse_size(parts[1], &bmap)
m.push(custom_size(size as f64, 1024.0, &dabbrs)); .map_err(|e| warn!("parse_size error: {:?}", e))
} .ok()?;
let dabbrs = get_decimal_abbrs();
Ok(m) Some(custom_size(size as f64, 1024.0, &dabbrs))
})
.collect()
} }
pub const KB: u128 = 1000; pub const KB: u128 = 1000;

View File

@@ -366,9 +366,12 @@ where
let bf = BufReader::new(file); let bf = BufReader::new(file);
let mut v = Vec::new(); let mut v = Vec::new();
for line in bf.lines() { for line in bf.lines() {
if let Ok(line) = line { match line {
let n = line.trim().parse().unwrap_or(0u64); Ok(line) => {
v.push(n); let n = line.trim().parse().unwrap_or(0u64);
v.push(n);
}
Err(_) => break,
} }
} }
v.into_iter().map(CgroupPid::from).collect() v.into_iter().map(CgroupPid::from).collect()
@@ -383,7 +386,7 @@ where
// remove_dir aims to remove cgroup path. It does so recursively, // remove_dir aims to remove cgroup path. It does so recursively,
// by removing any subdirectories (sub-cgroups) first. // by removing any subdirectories (sub-cgroups) first.
fn remove_dir(dir: &PathBuf) -> Result<()> { fn remove_dir(dir: &Path) -> Result<()> {
// try the fast path first. // try the fast path first.
if fs::remove_dir(dir).is_ok() { if fs::remove_dir(dir).is_ok() {
return Ok(()); return Ok(());
@@ -425,6 +428,7 @@ pub trait Hierarchy: std::fmt::Debug + Send + Sync {
/// Resource limits for the memory subsystem. /// Resource limits for the memory subsystem.
#[derive(Debug, Clone, Eq, PartialEq, Default)] #[derive(Debug, Clone, Eq, PartialEq, Default)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct MemoryResources { pub struct MemoryResources {
/// How much memory (in bytes) can the kernel consume. /// How much memory (in bytes) can the kernel consume.
pub kernel_memory_limit: Option<i64>, pub kernel_memory_limit: Option<i64>,
@@ -448,13 +452,15 @@ pub struct MemoryResources {
/// # Usage: /// # Usage:
/// ``` /// ```
/// let resource = &mut cgroups_rs::Resources::default(); /// let resource = &mut cgroups_rs::Resources::default();
/// resource.memory.attrs.insert("memory.numa_balancing", "true".to_string()); /// resource.memory.attrs.insert("memory.numa_balancing".to_string(), "true".to_string());
/// // apply here /// // apply here
pub attrs: std::collections::HashMap<&'static str, String>, /// ```
pub attrs: HashMap<String, String>,
} }
/// Resources limits on the number of processes. /// Resources limits on the number of processes.
#[derive(Debug, Clone, Eq, PartialEq, Default)] #[derive(Debug, Clone, Eq, PartialEq, Default)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct PidResources { pub struct PidResources {
/// The maximum number of processes that can exist in the control group. /// The maximum number of processes that can exist in the control group.
/// ///
@@ -466,6 +472,7 @@ pub struct PidResources {
/// Resources limits about how the tasks can use the CPU. /// Resources limits about how the tasks can use the CPU.
#[derive(Debug, Clone, Eq, PartialEq, Default)] #[derive(Debug, Clone, Eq, PartialEq, Default)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct CpuResources { pub struct CpuResources {
// cpuset // cpuset
/// A comma-separated list of CPU IDs where the task in the control group can run. Dashes /// A comma-separated list of CPU IDs where the task in the control group can run. Dashes
@@ -490,14 +497,15 @@ pub struct CpuResources {
/// # Usage: /// # Usage:
/// ``` /// ```
/// let resource = &mut cgroups_rs::Resources::default(); /// let resource = &mut cgroups_rs::Resources::default();
/// resource.cpu.attrs.insert("cpu.cfs_init_buffer_us", "10".to_string()); /// resource.cpu.attrs.insert("cpu.cfs_init_buffer_us".to_string(), "10".to_string());
/// // apply here /// // apply here
/// ``` /// ```
pub attrs: std::collections::HashMap<&'static str, String>, pub attrs: HashMap<String, String>,
} }
/// A device resource that can be allowed or denied access to. /// A device resource that can be allowed or denied access to.
#[derive(Debug, Clone, Eq, PartialEq, Default)] #[derive(Debug, Clone, Eq, PartialEq, Default)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct DeviceResource { pub struct DeviceResource {
/// If true, access to the device is allowed, otherwise it's denied. /// If true, access to the device is allowed, otherwise it's denied.
pub allow: bool, pub allow: bool,
@@ -513,6 +521,7 @@ pub struct DeviceResource {
/// Limit the usage of devices for the control group's tasks. /// Limit the usage of devices for the control group's tasks.
#[derive(Debug, Clone, Eq, PartialEq, Default)] #[derive(Debug, Clone, Eq, PartialEq, Default)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct DeviceResources { pub struct DeviceResources {
/// For each device in the list, the limits in the structure are applied. /// For each device in the list, the limits in the structure are applied.
pub devices: Vec<DeviceResource>, pub devices: Vec<DeviceResource>,
@@ -520,6 +529,7 @@ pub struct DeviceResources {
/// Assigned priority for a network device. /// Assigned priority for a network device.
#[derive(Debug, Clone, Eq, PartialEq, Default)] #[derive(Debug, Clone, Eq, PartialEq, Default)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct NetworkPriority { pub struct NetworkPriority {
/// The name (as visible in `ifconfig`) of the interface. /// The name (as visible in `ifconfig`) of the interface.
pub name: String, pub name: String,
@@ -530,6 +540,7 @@ pub struct NetworkPriority {
/// Collections of limits and tags that can be imposed on packets emitted by the tasks in the /// Collections of limits and tags that can be imposed on packets emitted by the tasks in the
/// control group. /// control group.
#[derive(Debug, Clone, Eq, PartialEq, Default)] #[derive(Debug, Clone, Eq, PartialEq, Default)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct NetworkResources { pub struct NetworkResources {
/// The networking class identifier to attach to the packets. /// The networking class identifier to attach to the packets.
/// ///
@@ -541,6 +552,7 @@ pub struct NetworkResources {
/// A hugepage type and its consumption limit for the control group. /// A hugepage type and its consumption limit for the control group.
#[derive(Debug, Clone, Eq, PartialEq, Default)] #[derive(Debug, Clone, Eq, PartialEq, Default)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct HugePageResource { pub struct HugePageResource {
/// The size of the hugepage, i.e. `2MB`, `1GB`, etc. /// The size of the hugepage, i.e. `2MB`, `1GB`, etc.
pub size: String, pub size: String,
@@ -551,6 +563,7 @@ pub struct HugePageResource {
/// Provides the ability to set consumption limit on each type of hugepages. /// Provides the ability to set consumption limit on each type of hugepages.
#[derive(Debug, Clone, Eq, PartialEq, Default)] #[derive(Debug, Clone, Eq, PartialEq, Default)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct HugePageResources { pub struct HugePageResources {
/// Set a limit of consumption for each hugepages type. /// Set a limit of consumption for each hugepages type.
pub limits: Vec<HugePageResource>, pub limits: Vec<HugePageResource>,
@@ -558,6 +571,7 @@ pub struct HugePageResources {
/// Weight for a particular block device. /// Weight for a particular block device.
#[derive(Debug, Clone, Eq, PartialEq, Default)] #[derive(Debug, Clone, Eq, PartialEq, Default)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct BlkIoDeviceResource { pub struct BlkIoDeviceResource {
/// The major number of the device. /// The major number of the device.
pub major: u64, pub major: u64,
@@ -571,6 +585,7 @@ pub struct BlkIoDeviceResource {
/// Provides the ability to throttle a device (both byte/sec, and IO op/s) /// Provides the ability to throttle a device (both byte/sec, and IO op/s)
#[derive(Debug, Clone, Eq, PartialEq, Default)] #[derive(Debug, Clone, Eq, PartialEq, Default)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct BlkIoDeviceThrottleResource { pub struct BlkIoDeviceThrottleResource {
/// The major number of the device. /// The major number of the device.
pub major: u64, pub major: u64,
@@ -582,6 +597,7 @@ pub struct BlkIoDeviceThrottleResource {
/// General block I/O resource limits. /// General block I/O resource limits.
#[derive(Debug, Clone, Eq, PartialEq, Default)] #[derive(Debug, Clone, Eq, PartialEq, Default)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct BlkIoResources { pub struct BlkIoResources {
/// The weight of the control group against descendant nodes. /// The weight of the control group against descendant nodes.
pub weight: Option<u16>, pub weight: Option<u16>,
@@ -601,6 +617,7 @@ pub struct BlkIoResources {
/// The resource limits and constraints that will be set on the control group. /// The resource limits and constraints that will be set on the control group.
#[derive(Debug, Clone, Eq, PartialEq, Default)] #[derive(Debug, Clone, Eq, PartialEq, Default)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct Resources { pub struct Resources {
/// Memory usage related limits. /// Memory usage related limits.
pub memory: MemoryResources, pub memory: MemoryResources,
@@ -726,6 +743,7 @@ impl Subsystem {
/// The values for `memory.hight` or `pids.max` /// The values for `memory.hight` or `pids.max`
#[derive(Eq, PartialEq, Copy, Clone, Debug)] #[derive(Eq, PartialEq, Copy, Clone, Debug)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub enum MaxValue { pub enum MaxValue {
/// This value is returned when the text is `"max"`. /// This value is returned when the text is `"max"`.
Max, Max,
@@ -740,6 +758,7 @@ impl Default for MaxValue {
} }
impl MaxValue { impl MaxValue {
#[allow(clippy::should_implement_trait, clippy::wrong_self_convention)]
fn to_i64(&self) -> i64 { fn to_i64(&self) -> i64 {
match self { match self {
MaxValue::Max => -1, MaxValue::Max => -1,

View File

@@ -38,6 +38,7 @@ pub struct MemController {
} }
#[derive(Default, Debug, PartialEq, Eq)] #[derive(Default, Debug, PartialEq, Eq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct SetMemory { pub struct SetMemory {
pub low: Option<MaxValue>, pub low: Option<MaxValue>,
pub high: Option<MaxValue>, pub high: Option<MaxValue>,
@@ -47,6 +48,7 @@ pub struct SetMemory {
/// Controls statistics and controls about the OOM killer operating in this control group. /// Controls statistics and controls about the OOM killer operating in this control group.
#[derive(Default, Debug, PartialEq, Eq)] #[derive(Default, Debug, PartialEq, Eq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct OomControl { pub struct OomControl {
/// If true, the OOM killer has been disabled for the tasks in this control group. /// If true, the OOM killer has been disabled for the tasks in this control group.
pub oom_kill_disable: bool, pub oom_kill_disable: bool,
@@ -87,6 +89,7 @@ fn parse_oom_control(s: String) -> Result<OomControl> {
/// Contains statistics about the NUMA locality of the control group's tasks. /// Contains statistics about the NUMA locality of the control group's tasks.
#[derive(Default, Debug, PartialEq, Eq)] #[derive(Default, Debug, PartialEq, Eq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct NumaStat { pub struct NumaStat {
/// Total amount of pages used by the control group. /// Total amount of pages used by the control group.
pub total_pages: u64, pub total_pages: u64,
@@ -302,6 +305,7 @@ fn parse_numa_stat(s: String) -> Result<NumaStat> {
} }
#[derive(Default, Debug, PartialEq, Eq)] #[derive(Default, Debug, PartialEq, Eq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct MemoryStat { pub struct MemoryStat {
pub cache: u64, pub cache: u64,
pub rss: u64, pub rss: u64,
@@ -403,6 +407,7 @@ fn parse_memory_stat(s: String) -> Result<MemoryStat> {
/// Contains statistics about the current usage of memory and swap (together, not seperately) by /// Contains statistics about the current usage of memory and swap (together, not seperately) by
/// the control group's tasks. /// the control group's tasks.
#[derive(Debug)] #[derive(Debug)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct MemSwap { pub struct MemSwap {
/// How many times the limit has been hit. /// How many times the limit has been hit.
pub fail_cnt: u64, pub fail_cnt: u64,
@@ -417,6 +422,7 @@ pub struct MemSwap {
/// State of and statistics gathered by the kernel about the memory usage of the control group's /// State of and statistics gathered by the kernel about the memory usage of the control group's
/// tasks. /// tasks.
#[derive(Debug)] #[derive(Debug)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct Memory { pub struct Memory {
/// How many times the limit has been hit. /// How many times the limit has been hit.
pub fail_cnt: u64, pub fail_cnt: u64,
@@ -461,6 +467,7 @@ pub struct Memory {
/// The current state of and gathered statistics about the kernel's memory usage for TCP-related /// The current state of and gathered statistics about the kernel's memory usage for TCP-related
/// data structures. /// data structures.
#[derive(Debug)] #[derive(Debug)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct Tcp { pub struct Tcp {
/// How many times the limit has been hit. /// How many times the limit has been hit.
pub fail_cnt: u64, pub fail_cnt: u64,
@@ -479,6 +486,7 @@ pub struct Tcp {
/// these tasks if it would think that the limits here would be violated. It's important to note /// these tasks if it would think that the limits here would be violated. It's important to note
/// that interrupts in particular might not be able to enforce these limits. /// that interrupts in particular might not be able to enforce these limits.
#[derive(Debug)] #[derive(Debug)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct Kmem { pub struct Kmem {
/// How many times the limit has been hit. /// How many times the limit has been hit.
pub fail_cnt: u64, pub fail_cnt: u64,

View File

@@ -36,12 +36,12 @@ fn test_cpuset_set_cpus() {
assert_eq!(0, set.cpus.len()); assert_eq!(0, set.cpus.len());
} else { } else {
// for cgroup v1, cpuset is copied from parent. // for cgroup v1, cpuset is copied from parent.
assert_eq!(true, !set.cpus.is_empty()); assert!(!set.cpus.is_empty());
} }
// 0 // 0
let r = cpuset.set_cpus("0"); let r = cpuset.set_cpus("0");
assert_eq!(true, r.is_ok()); assert!(r.is_ok());
let set = cpuset.cpuset(); let set = cpuset.cpuset();
assert_eq!(1, set.cpus.len()); assert_eq!(1, set.cpus.len());
@@ -51,8 +51,8 @@ fn test_cpuset_set_cpus() {
let cpus = fs::read_to_string("/sys/fs/cgroup/cpuset.cpus.effective").unwrap_or_default(); let cpus = fs::read_to_string("/sys/fs/cgroup/cpuset.cpus.effective").unwrap_or_default();
let cpus = cpus.trim(); let cpus = cpus.trim();
if !cpus.is_empty() { if !cpus.is_empty() {
let r = cpuset.set_cpus(&cpus); let r = cpuset.set_cpus(cpus);
assert_eq!(true, r.is_ok()); assert!(r.is_ok());
let set = cpuset.cpuset(); let set = cpuset.cpuset();
assert_eq!(1, set.cpus.len()); assert_eq!(1, set.cpus.len());
assert_eq!(format!("{}-{}", set.cpus[0].0, set.cpus[0].1), cpus); assert_eq!(format!("{}-{}", set.cpus[0].0, set.cpus[0].1), cpus);
@@ -72,14 +72,14 @@ fn test_cpuset_set_cpus_add_task() {
assert_eq!(0, set.cpus.len()); assert_eq!(0, set.cpus.len());
} else { } else {
// for cgroup v1, cpuset is copied from parent. // for cgroup v1, cpuset is copied from parent.
assert_eq!(true, !set.cpus.is_empty()); assert!(!set.cpus.is_empty());
} }
// Add a task to the control group. // Add a task to the control group.
let pid_i = libc::pid_t::from(nix::unistd::getpid()) as u64; let pid_i = libc::pid_t::from(nix::unistd::getpid()) as u64;
let _ = cg.add_task(CgroupPid::from(pid_i)); let _ = cg.add_task(CgroupPid::from(pid_i));
let tasks = cg.tasks(); let tasks = cg.tasks();
assert_eq!(true, !tasks.is_empty()); assert!(!tasks.is_empty());
println!("tasks after added: {:?}", tasks); println!("tasks after added: {:?}", tasks);
// remove task // remove task

View File

@@ -29,7 +29,7 @@ fn test_hugetlb_sizes() {
for size in sizes { for size in sizes {
let supported = hugetlb_controller.size_supported(&size); let supported = hugetlb_controller.size_supported(&size);
assert_eq!(supported, true); assert!(supported);
assert_no_error(hugetlb_controller.failcnt(&size)); assert_no_error(hugetlb_controller.failcnt(&size));
assert_no_error(hugetlb_controller.limit_in_bytes(&size)); assert_no_error(hugetlb_controller.limit_in_bytes(&size));
assert_no_error(hugetlb_controller.usage_in_bytes(&size)); assert_no_error(hugetlb_controller.usage_in_bytes(&size));
@@ -40,5 +40,5 @@ fn test_hugetlb_sizes() {
} }
fn assert_no_error(r: Result<u64>) { fn assert_no_error(r: Result<u64>) {
assert_eq!(!r.is_err(), true) assert!(!r.is_err())
} }

View File

@@ -17,17 +17,17 @@ fn test_disable_oom_killer() {
// before disable // before disable
let m = mem_controller.memory_stat(); let m = mem_controller.memory_stat();
assert_eq!(m.oom_control.oom_kill_disable, false); assert!(!m.oom_control.oom_kill_disable);
// now only v1 // now only v1
if !mem_controller.v2() { if !mem_controller.v2() {
// disable oom killer // disable oom killer
let r = mem_controller.disable_oom_killer(); let r = mem_controller.disable_oom_killer();
assert_eq!(r.is_err(), false); assert!(!r.is_err());
// after disable // after disable
let m = mem_controller.memory_stat(); let m = mem_controller.memory_stat();
assert_eq!(m.oom_control.oom_kill_disable, true); assert!(m.oom_control.oom_kill_disable);
} }
} }
cg.delete().unwrap(); cg.delete().unwrap();
@@ -60,7 +60,7 @@ fn set_mem_v2() {
max: None, max: None,
}; };
let r = mem_controller.set_mem(m); let r = mem_controller.set_mem(m);
assert_eq!(true, r.is_ok()); assert!(r.is_ok());
let m = mem_controller.get_mem().unwrap(); let m = mem_controller.get_mem().unwrap();
// get // get
@@ -77,7 +77,7 @@ fn set_mem_v2() {
low: None, low: None,
}; };
let r = mem_controller.set_mem(m); let r = mem_controller.set_mem(m);
assert_eq!(true, r.is_ok()); assert!(r.is_ok());
let m = mem_controller.get_mem().unwrap(); let m = mem_controller.get_mem().unwrap();
// get // get

View File

@@ -24,7 +24,7 @@ fn pid_resources() {
// verify // verify
let pidcontroller: &PidController = cg.controller_of().unwrap(); let pidcontroller: &PidController = cg.controller_of().unwrap();
let pid_max = pidcontroller.get_pid_max(); let pid_max = pidcontroller.get_pid_max();
assert_eq!(pid_max.is_ok(), true); assert!(pid_max.is_ok());
assert_eq!(pid_max.unwrap(), MaxValue::Value(512)); assert_eq!(pid_max.unwrap(), MaxValue::Value(512));
} }
cg.delete().unwrap(); cg.delete().unwrap();