aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDavid Dai <davidai@google.com>2024-04-19 20:57:00 +0000
committerDavid Dai <davidai@google.com>2024-04-30 15:33:44 -0700
commitf6a502d760c7eb53111d82bf36b6bcf88cab7712 (patch)
treef47ffc430eb61caa59710d8799ab652cffde3108
parent2390b1a47a950f0397862ff50c74e01ca5d9b714 (diff)
downloadcrosvm-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.rs14
-rw-r--r--base/src/lib.rs1
-rw-r--r--base/src/sys/linux/mod.rs5
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")