topology: Skip offline CPUs

Offline CPUs don't have a /sys/devices/system/cpu/cpuN/topology
directory, so let's just skip them if they're not online. Schedulers are
expected to detect hotplug, and handle gracefully restarting.

Signed-off-by: David Vernet <void@manifault.com>
This commit is contained in:
David Vernet 2024-03-13 20:51:51 -05:00
parent 583696f940
commit 84a202e2a0
No known key found for this signature in database
GPG Key ID: 59E4B86965C4F364

View File

@ -79,7 +79,6 @@ use std::path::Path;
#[derive(Debug, Clone)] #[derive(Debug, Clone)]
pub struct Cpu { pub struct Cpu {
id: usize, id: usize,
online: bool,
min_freq: usize, min_freq: usize,
max_freq: usize, max_freq: usize,
} }
@ -90,11 +89,6 @@ impl Cpu {
self.id self.id
} }
/// Is this CPU online?
pub fn cpus(&self) -> bool {
self.online
}
/// Get the minimum scaling frequency of this CPU /// Get the minimum scaling frequency of this CPU
pub fn min_freq(&self) -> usize { pub fn min_freq(&self) -> usize {
self.min_freq self.min_freq
@ -316,6 +310,13 @@ fn create_numa_nodes(online_mask: &Cpumask) -> Result<Vec<Node>> {
} }
}; };
// CPU is offline. The Topology hierarchy is read-only, and assumes
// that hotplug will cause the scheduler to restart. Thus, we can
// just skip this CPU altogether.
if !online_mask.test_cpu(cpu_id) {
continue;
}
// Physical core ID // Physical core ID
let top_path = cpu_path.join("topology"); let top_path = cpu_path.join("topology");
let core_id = read_file_usize(&top_path.join("core_id"))?; let core_id = read_file_usize(&top_path.join("core_id"))?;
@ -331,9 +332,6 @@ fn create_numa_nodes(online_mask: &Cpumask) -> Result<Vec<Node>> {
let min_freq = read_file_usize(&freq_path.join("scaling_min_freq")).unwrap_or(0); let min_freq = read_file_usize(&freq_path.join("scaling_min_freq")).unwrap_or(0);
let max_freq = read_file_usize(&freq_path.join("scaling_max_freq")).unwrap_or(0); let max_freq = read_file_usize(&freq_path.join("scaling_max_freq")).unwrap_or(0);
// Hotplug information
let online = online_mask.test_cpu(cpu_id);
if !node.llcs.contains_key(&llc_id) { if !node.llcs.contains_key(&llc_id) {
let cache = Cache { let cache = Cache {
id: llc_id, id: llc_id,
@ -358,7 +356,6 @@ fn create_numa_nodes(online_mask: &Cpumask) -> Result<Vec<Node>> {
cpu_id, cpu_id,
Cpu { Cpu {
id: cpu_id, id: cpu_id,
online: online,
min_freq: min_freq, min_freq: min_freq,
max_freq: max_freq, max_freq: max_freq,
}, },