diff options
author | David Dai <davidai@google.com> | 2024-04-19 20:57:00 +0000 |
---|---|---|
committer | David Dai <davidai@google.com> | 2024-04-30 15:33:44 -0700 |
commit | f6a502d760c7eb53111d82bf36b6bcf88cab7712 (patch) | |
tree | f47ffc430eb61caa59710d8799ab652cffde3108 | |
parent | 2390b1a47a950f0397862ff50c74e01ca5d9b714 (diff) | |
download | crosvm-f6a502d760c7eb53111d82bf36b6bcf88cab7712.tar.gz |
UPSTREAM: Revert "aarch64: Use cpu_capacity to determine clustering instead"
This reverts commit b7e72de084373e426a9b5de8535d657c27fd99b4.
Reason for revert: It turns out some devices intentionally flattens out their cpu-map topology to improve scheduling behavior. Revert back to using package id to determine clustering info.
Original change's description:
> aarch64: Use cpu_capacity to determine clustering instead
>
> Some systems do not populate cpu-map information and
> use other ways of grouping CPUs in a frequency/topology
> domain instead. Use normalized cpu_capacity information
> to determine clustering instead.
>
> BUG=b:326170473
> Test=./tools/presubmit
> Change-Id: If4ba7d224338798fcf2c0ffbaa91547dc2f2e16d
> Signed-off-by: David Dai <davidai@google.com>
> Reviewed-on: https://chromium-review.googlesource.com/c/crosvm/crosvm/+/5319790
> Reviewed-by: Daniel Verkamp <dverkamp@chromium.org>
Test: Boots microdroid with protected mode
Bug: b:335130218
Change-Id: I1a601e65a79aacb68c1244127420b2e395f12d5d
Reviewed-on: https://chromium-review.googlesource.com/c/crosvm/crosvm/+/5467699
Commit-Queue: David Dai <davidai@google.com>
Reviewed-by: Daniel Verkamp <dverkamp@chromium.org>
-rw-r--r-- | aarch64/src/lib.rs | 14 | ||||
-rw-r--r-- | base/src/lib.rs | 1 | ||||
-rw-r--r-- | base/src/sys/linux/mod.rs | 5 |
3 files changed, 8 insertions, 12 deletions
diff --git a/aarch64/src/lib.rs b/aarch64/src/lib.rs index c88ad14d2..4154445f7 100644 --- a/aarch64/src/lib.rs +++ b/aarch64/src/lib.rs @@ -879,18 +879,8 @@ impl arch::LinuxArch for AArch64 { // Creates CPU cluster mask for each CPU in the host system. fn get_host_cpu_clusters() -> std::result::Result<Vec<CpuSet>, Self::Error> { - let cpu_capacities = - Self::collect_for_each_cpu(base::logical_core_capacity).map_err(Error::CpuTopology)?; - let mut unique_caps = Vec::new(); - let mut cluster_ids = Vec::new(); - for capacity in cpu_capacities { - if !unique_caps.contains(&capacity) { - unique_caps.push(capacity); - } - let idx = unique_caps.iter().position(|&r| r == capacity).unwrap(); - cluster_ids.push(idx); - } - + let cluster_ids = Self::collect_for_each_cpu(base::logical_core_cluster_id) + .map_err(Error::CpuTopology)?; let mut unique_clusters: Vec<CpuSet> = cluster_ids .iter() .map(|&vcpu_cluster_id| { diff --git a/base/src/lib.rs b/base/src/lib.rs index e23f2876e..f4e9af826 100644 --- a/base/src/lib.rs +++ b/base/src/lib.rs @@ -109,6 +109,7 @@ cfg_if::cfg_if! { pub use linux::{getegid, geteuid}; pub use linux::{gettid, kill_process_group, reap_child}; pub use linux::logical_core_capacity; + pub use linux::logical_core_cluster_id; pub use linux::logical_core_frequencies_khz; pub use linux::sched_attr; pub use linux::sched_setattr; diff --git a/base/src/sys/linux/mod.rs b/base/src/sys/linux/mod.rs index 4ec605e70..bd72d5e7c 100644 --- a/base/src/sys/linux/mod.rs +++ b/base/src/sys/linux/mod.rs @@ -641,6 +641,11 @@ pub fn logical_core_capacity(cpu_id: usize) -> Result<u32> { } } +/// Returns the cluster ID of a given logical core. +pub fn logical_core_cluster_id(cpu_id: usize) -> Result<u32> { + parse_sysfs_cpu_info(cpu_id, "topology/physical_package_id") +} + /// Returns the maximum frequency (in kHz) of a given logical core. fn logical_core_max_freq_khz(cpu_id: usize) -> Result<u32> { parse_sysfs_cpu_info(cpu_id, "cpufreq/cpuinfo_max_freq") |