mirror of
https://github.com/kata-containers/kata-containers.git
synced 2025-08-13 21:56:32 +00:00
agent: update cpuset of container path
After cpu hot-plugged is available, cpuset for containers will be written into
cgroup files recursively, the paths should include container's cgroup path, and up
to root path of cgroup filesystem.
Fixes: #1156, #1159
Signed-off-by: bin liu <bin@hyper.sh>
(cherry picked from commit a793b8d90d
)
This commit is contained in:
parent
4d4aba2e64
commit
6bb3f44100
@ -1008,11 +1008,11 @@ impl Manager {
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn update_cpuset_path(&self, cpuset_cpus: &str) -> Result<()> {
|
pub fn update_cpuset_path(&self, guest_cpuset: &str, container_cpuset: &str) -> Result<()> {
|
||||||
if cpuset_cpus == "" {
|
if guest_cpuset == "" {
|
||||||
return Ok(());
|
return Ok(());
|
||||||
}
|
}
|
||||||
info!(sl!(), "update_cpuset_path to: {}", cpuset_cpus);
|
info!(sl!(), "update_cpuset_path to: {}", guest_cpuset);
|
||||||
|
|
||||||
let h = cgroups::hierarchies::auto();
|
let h = cgroups::hierarchies::auto();
|
||||||
let h = Box::new(&*h);
|
let h = Box::new(&*h);
|
||||||
@ -1026,8 +1026,8 @@ impl Manager {
|
|||||||
let h = cgroups::hierarchies::auto();
|
let h = cgroups::hierarchies::auto();
|
||||||
let h = Box::new(&*h);
|
let h = Box::new(&*h);
|
||||||
let cg = load_or_create(h, &self.cpath);
|
let cg = load_or_create(h, &self.cpath);
|
||||||
let cpuset_controller: &CpuSetController = cg.controller_of().unwrap();
|
let container_cpuset_controller: &CpuSetController = cg.controller_of().unwrap();
|
||||||
let path = cpuset_controller.path();
|
let path = container_cpuset_controller.path();
|
||||||
let container_path = Path::new(path);
|
let container_path = Path::new(path);
|
||||||
info!(sl!(), "container cpuset path: {:?}", &path);
|
info!(sl!(), "container cpuset path: {:?}", &path);
|
||||||
|
|
||||||
@ -1036,11 +1036,9 @@ impl Manager {
|
|||||||
if ancestor == root_path {
|
if ancestor == root_path {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
if ancestor != container_path {
|
|
||||||
paths.push(ancestor);
|
paths.push(ancestor);
|
||||||
}
|
}
|
||||||
}
|
info!(sl!(), "parent paths to update cpuset: {:?}", &paths);
|
||||||
info!(sl!(), "paths to update cpuset: {:?}", &paths);
|
|
||||||
|
|
||||||
let mut i = paths.len();
|
let mut i = paths.len();
|
||||||
loop {
|
loop {
|
||||||
@ -1056,10 +1054,20 @@ impl Manager {
|
|||||||
.to_str()
|
.to_str()
|
||||||
.unwrap()
|
.unwrap()
|
||||||
.trim_start_matches(root_path.to_str().unwrap());
|
.trim_start_matches(root_path.to_str().unwrap());
|
||||||
info!(sl!(), "updating cpuset for path {:?}", &r_path);
|
info!(sl!(), "updating cpuset for parent path {:?}", &r_path);
|
||||||
let cg = load_or_create(h, &r_path);
|
let cg = load_or_create(h, &r_path);
|
||||||
let cpuset_controller: &CpuSetController = cg.controller_of().unwrap();
|
let cpuset_controller: &CpuSetController = cg.controller_of().unwrap();
|
||||||
cpuset_controller.set_cpus(cpuset_cpus)?;
|
cpuset_controller.set_cpus(guest_cpuset)?;
|
||||||
|
}
|
||||||
|
|
||||||
|
if !container_cpuset.is_empty() {
|
||||||
|
info!(
|
||||||
|
sl!(),
|
||||||
|
"updating cpuset for container path: {:?} cpuset: {}",
|
||||||
|
&container_path,
|
||||||
|
container_cpuset
|
||||||
|
);
|
||||||
|
container_cpuset_controller.set_cpus(container_cpuset)?;
|
||||||
}
|
}
|
||||||
|
|
||||||
Ok(())
|
Ok(())
|
||||||
|
74
src/agent/rustjail/src/cgroups/mock.rs
Normal file
74
src/agent/rustjail/src/cgroups/mock.rs
Normal file
@ -0,0 +1,74 @@
|
|||||||
|
// Copyright (c) 2020 Intel Corporation
|
||||||
|
//
|
||||||
|
// SPDX-License-Identifier: Apache-2.0
|
||||||
|
//
|
||||||
|
|
||||||
|
use protobuf::{CachedSize, SingularPtrField, UnknownFields};
|
||||||
|
|
||||||
|
use crate::cgroups::Manager as CgroupManager;
|
||||||
|
use crate::protocols::agent::{BlkioStats, CgroupStats, CpuStats, MemoryStats, PidsStats};
|
||||||
|
use anyhow::Result;
|
||||||
|
use cgroups::freezer::FreezerState;
|
||||||
|
use libc::{self, pid_t};
|
||||||
|
use oci::LinuxResources;
|
||||||
|
use std::collections::HashMap;
|
||||||
|
use std::string::String;
|
||||||
|
|
||||||
|
#[derive(Serialize, Deserialize, Debug, Clone)]
|
||||||
|
pub struct Manager {
|
||||||
|
pub paths: HashMap<String, String>,
|
||||||
|
pub mounts: HashMap<String, String>,
|
||||||
|
pub cpath: String,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl CgroupManager for Manager {
|
||||||
|
fn apply(&self, _: pid_t) -> Result<()> {
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
|
||||||
|
fn set(&self, _: &LinuxResources, _: bool) -> Result<()> {
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
|
||||||
|
fn get_stats(&self) -> Result<CgroupStats> {
|
||||||
|
Ok(CgroupStats {
|
||||||
|
cpu_stats: SingularPtrField::some(CpuStats::default()),
|
||||||
|
memory_stats: SingularPtrField::some(MemoryStats::new()),
|
||||||
|
pids_stats: SingularPtrField::some(PidsStats::new()),
|
||||||
|
blkio_stats: SingularPtrField::some(BlkioStats::new()),
|
||||||
|
hugetlb_stats: HashMap::new(),
|
||||||
|
unknown_fields: UnknownFields::default(),
|
||||||
|
cached_size: CachedSize::default(),
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
fn freeze(&self, _: FreezerState) -> Result<()> {
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
|
||||||
|
fn destroy(&mut self) -> Result<()> {
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
|
||||||
|
fn get_pids(&self) -> Result<Vec<pid_t>> {
|
||||||
|
Ok(Vec::new())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Manager {
|
||||||
|
pub fn new(cpath: &str) -> Result<Self> {
|
||||||
|
Ok(Self {
|
||||||
|
paths: HashMap::new(),
|
||||||
|
mounts: HashMap::new(),
|
||||||
|
cpath: cpath.to_string(),
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn update_cpuset_path(&self, _: &str, _: &str) -> Result<()> {
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn get_cg_path(&self, _: &str) -> Option<String> {
|
||||||
|
Some("".to_string())
|
||||||
|
}
|
||||||
|
}
|
@ -236,14 +236,29 @@ impl Sandbox {
|
|||||||
return Ok(());
|
return Ok(());
|
||||||
}
|
}
|
||||||
|
|
||||||
let cpuset = rustjail_cgroups::fs::get_guest_cpuset()?;
|
let guest_cpuset = rustjail_cgroups::fs::get_guest_cpuset()?;
|
||||||
|
|
||||||
for (_, ctr) in self.containers.iter() {
|
for (_, ctr) in self.containers.iter() {
|
||||||
|
let cpu = ctr
|
||||||
|
.config
|
||||||
|
.spec
|
||||||
|
.as_ref()
|
||||||
|
.unwrap()
|
||||||
|
.linux
|
||||||
|
.as_ref()
|
||||||
|
.unwrap()
|
||||||
|
.resources
|
||||||
|
.as_ref()
|
||||||
|
.unwrap()
|
||||||
|
.cpu
|
||||||
|
.as_ref();
|
||||||
|
let container_cpust = if let Some(c) = cpu { &c.cpus } else { "" };
|
||||||
|
|
||||||
info!(self.logger, "updating {}", ctr.id.as_str());
|
info!(self.logger, "updating {}", ctr.id.as_str());
|
||||||
ctr.cgroup_manager
|
ctr.cgroup_manager
|
||||||
.as_ref()
|
.as_ref()
|
||||||
.unwrap()
|
.unwrap()
|
||||||
.update_cpuset_path(cpuset.as_str())?;
|
.update_cpuset_path(guest_cpuset.as_str(), &container_cpust)?;
|
||||||
}
|
}
|
||||||
|
|
||||||
Ok(())
|
Ok(())
|
||||||
|
Loading…
Reference in New Issue
Block a user