diff --git a/src/uu/lscpu/src/lscpu.rs b/src/uu/lscpu/src/lscpu.rs index 1f32a1c..19cce4e 100644 --- a/src/uu/lscpu/src/lscpu.rs +++ b/src/uu/lscpu/src/lscpu.rs @@ -122,6 +122,15 @@ pub fn uumain(args: impl uucore::Args) -> UResult<()> { model_name_info.add_child(CpuInfo::new("Model", &model, None)); } + let socket_count = &cpu_topology.socket_count(); + let core_count = &cpu_topology.core_count(); + model_name_info.add_child(CpuInfo::new( + "Core(s) per socket", + &(core_count / socket_count).to_string(), + None, + )); + model_name_info.add_child(CpuInfo::new("Socket(s)", &socket_count.to_string(), None)); + if let Some(freq_boost_enabled) = sysfs::read_freq_boost_state() { let s = if freq_boost_enabled { "enabled" @@ -131,12 +140,6 @@ pub fn uumain(args: impl uucore::Args) -> UResult<()> { model_name_info.add_child(CpuInfo::new("Frequency boost", s, None)); } - model_name_info.add_child(CpuInfo::new( - "Socket(s)", - &cpu_topology.socket_count().to_string(), - None, - )); - vendor_info.add_child(model_name_info); } diff --git a/src/uu/lscpu/src/sysfs.rs b/src/uu/lscpu/src/sysfs.rs index f710a65..787e0b7 100644 --- a/src/uu/lscpu/src/sysfs.rs +++ b/src/uu/lscpu/src/sysfs.rs @@ -14,6 +14,7 @@ pub struct CpuTopology { pub struct Cpu { _index: usize, pub pkg_id: usize, + pub core_id: usize, pub caches: Vec<CpuCache>, } @@ -41,7 +42,13 @@ impl CpuTopology { for cpu_index in online_cpus { let cpu_dir = PathBuf::from(format!("/sys/devices/system/cpu/cpu{}/", cpu_index)); - let physical_pkg_id = fs::read_to_string(cpu_dir.join("topology/physical_package_id")) + let pkg_id = fs::read_to_string(cpu_dir.join("topology/physical_package_id")) + .unwrap() + .trim() + .parse::<usize>() + .unwrap(); + + let core_id = fs::read_to_string(cpu_dir.join("topology/core_id")) .unwrap() .trim() .parse::<usize>() @@ -51,7 +58,8 @@ impl CpuTopology { out.push(Cpu { _index: cpu_index, - pkg_id: physical_pkg_id, + pkg_id, + core_id, caches, }) } @@ -61,10 +69,15 @@ impl CpuTopology { pub fn socket_count(&self) -> usize { // Each physical socket is represented as its own package_id, so amount of unique pkg_ids = sockets // https://www.kernel.org/doc/html/latest/admin-guide/abi-stable.html#abi-sys-devices-system-cpu-cpux-topology-physical-package-id - let physical_sockets: HashSet<usize> = self.cpus.iter().map(|cpu| cpu.pkg_id).collect(); + let physical_sockets: HashSet<_> = self.cpus.iter().map(|cpu| cpu.pkg_id).collect(); physical_sockets.len() } + + pub fn core_count(&self) -> usize { + let core_ids: HashSet<_> = self.cpus.iter().map(|cpu| cpu.core_id).collect(); + core_ids.len() + } } // TODO: respect `--hex` option and output the bitmask instead of human-readable range