From d00bcae624567ec3e566e58b202eb5c5f7e98e0d Mon Sep 17 00:00:00 2001 From: Ethan Lee Date: Thu, 1 Jun 2023 20:29:33 +0000 Subject: [PATCH] Dynamically read scaling_max_freq for each CPU frequency policy. scaling_max_freq is updated by the Kernel based on the current scaling governor. This value must not be read statically because this value is updated dynamically. So, update the CpuInfoReader to read scaling_max_freq on each polling. Test: atest CpuInfoReaderTest Fixes: 280077715 Change-Id: Ifd4245b937d6546ad46a35a0d464c3a2d85b883f --- .../com/android/server/cpu/CpuInfoReader.java | 40 +++++++++---------- .../policy0/scaling_max_freq | 2 +- .../policy1/scaling_max_freq | 2 +- .../policy2/scaling_max_freq | 2 +- .../android/server/cpu/CpuInfoReaderTest.java | 14 +++---- 5 files changed, 30 insertions(+), 30 deletions(-) diff --git a/services/core/java/com/android/server/cpu/CpuInfoReader.java b/services/core/java/com/android/server/cpu/CpuInfoReader.java index 70d7bde2e53a0..92bbfab63b427 100644 --- a/services/core/java/com/android/server/cpu/CpuInfoReader.java +++ b/services/core/java/com/android/server/cpu/CpuInfoReader.java @@ -203,15 +203,15 @@ public final class CpuInfoReader { continue; } if (dynamicPolicyInfo.curCpuFreqKHz == CpuInfo.MISSING_FREQUENCY - || staticPolicyInfo.maxCpuFreqKHz == CpuInfo.MISSING_FREQUENCY) { + || dynamicPolicyInfo.maxCpuFreqKHz == CpuInfo.MISSING_FREQUENCY) { Slogf.w(TAG, "Current and maximum CPU frequency information mismatch/missing for" + " policy ID %d", policyId); continue; } - if (dynamicPolicyInfo.curCpuFreqKHz > staticPolicyInfo.maxCpuFreqKHz) { + if (dynamicPolicyInfo.curCpuFreqKHz > dynamicPolicyInfo.maxCpuFreqKHz) { Slogf.w(TAG, "Current CPU frequency (%d) is greater than maximum CPU frequency" + " (%d) for policy ID (%d). Skipping CPU frequency policy", - dynamicPolicyInfo.curCpuFreqKHz, staticPolicyInfo.maxCpuFreqKHz, policyId); + dynamicPolicyInfo.curCpuFreqKHz, dynamicPolicyInfo.maxCpuFreqKHz, policyId); continue; } for (int coreIdx = 0; coreIdx < staticPolicyInfo.relatedCpuCores.size(); coreIdx++) { @@ -234,7 +234,8 @@ public final class CpuInfoReader { if (dynamicPolicyInfo.affectedCpuCores.indexOf(relatedCpuCore) < 0) { cpuInfoByCpus.append(relatedCpuCore, new CpuInfo(relatedCpuCore, cpusetCategories, /* isOnline= */false, CpuInfo.MISSING_FREQUENCY, - staticPolicyInfo.maxCpuFreqKHz, CpuInfo.MISSING_FREQUENCY, usageStats)); + dynamicPolicyInfo.maxCpuFreqKHz, CpuInfo.MISSING_FREQUENCY, + usageStats)); continue; } // If a CPU core is online, it must have the usage stats. When the usage stats is @@ -245,7 +246,7 @@ public final class CpuInfoReader { continue; } CpuInfo cpuInfo = new CpuInfo(relatedCpuCore, cpusetCategories, /* isOnline= */true, - dynamicPolicyInfo.curCpuFreqKHz, staticPolicyInfo.maxCpuFreqKHz, + dynamicPolicyInfo.curCpuFreqKHz, dynamicPolicyInfo.maxCpuFreqKHz, dynamicPolicyInfo.avgTimeInStateCpuFreqKHz, usageStats); cpuInfoByCpus.append(relatedCpuCore, cpuInfo); if (DEBUG) { @@ -423,12 +424,6 @@ public final class CpuInfoReader { for (int i = 0; i < mCpuFreqPolicyDirsById.size(); i++) { int policyId = mCpuFreqPolicyDirsById.keyAt(i); File policyDir = mCpuFreqPolicyDirsById.valueAt(i); - long maxCpuFreqKHz = readCpuFreqKHz(new File(policyDir, MAX_SCALING_FREQ_FILE)); - if (maxCpuFreqKHz == CpuInfo.MISSING_FREQUENCY) { - Slogf.w(TAG, "Missing max CPU frequency information at %s", - policyDir.getAbsolutePath()); - continue; - } File cpuCoresFile = new File(policyDir, RELATED_CPUS_FILE); IntArray relatedCpuCores = readCpuCores(cpuCoresFile); if (relatedCpuCores == null || relatedCpuCores.size() == 0) { @@ -436,8 +431,7 @@ public final class CpuInfoReader { cpuCoresFile.getAbsolutePath()); continue; } - StaticPolicyInfo staticPolicyInfo = new StaticPolicyInfo(maxCpuFreqKHz, - relatedCpuCores); + StaticPolicyInfo staticPolicyInfo = new StaticPolicyInfo(relatedCpuCores); mStaticPolicyInfoById.append(policyId, staticPolicyInfo); if (DEBUG) { Slogf.d(TAG, "Added static policy info %s for policy id %d", staticPolicyInfo, @@ -464,8 +458,14 @@ public final class CpuInfoReader { Slogf.e(TAG, "Failed to read CPU cores from %s", cpuCoresFile.getAbsolutePath()); continue; } + long maxCpuFreqKHz = readCpuFreqKHz(new File(policyDir, MAX_SCALING_FREQ_FILE)); + if (maxCpuFreqKHz == CpuInfo.MISSING_FREQUENCY) { + Slogf.w(TAG, "Missing max CPU frequency information at %s", + policyDir.getAbsolutePath()); + continue; + } DynamicPolicyInfo dynamicPolicyInfo = new DynamicPolicyInfo(curCpuFreqKHz, - avgTimeInStateCpuFreqKHz, affectedCpuCores); + maxCpuFreqKHz, avgTimeInStateCpuFreqKHz, affectedCpuCores); dynamicPolicyInfoById.append(policyId, dynamicPolicyInfo); if (DEBUG) { Slogf.d(TAG, "Read dynamic policy info %s for policy id %d", dynamicPolicyInfo, @@ -889,29 +889,28 @@ public final class CpuInfoReader { } private static final class StaticPolicyInfo { - public final long maxCpuFreqKHz; public final IntArray relatedCpuCores; - StaticPolicyInfo(long maxCpuFreqKHz, IntArray relatedCpuCores) { - this.maxCpuFreqKHz = maxCpuFreqKHz; + StaticPolicyInfo(IntArray relatedCpuCores) { this.relatedCpuCores = relatedCpuCores; } @Override public String toString() { - return "StaticPolicyInfo{maxCpuFreqKHz = " + maxCpuFreqKHz + ", relatedCpuCores = " - + relatedCpuCores + '}'; + return "StaticPolicyInfo{relatedCpuCores = " + relatedCpuCores + '}'; } } private static final class DynamicPolicyInfo { public final long curCpuFreqKHz; + public final long maxCpuFreqKHz; public final long avgTimeInStateCpuFreqKHz; public final IntArray affectedCpuCores; - DynamicPolicyInfo(long curCpuFreqKHz, long avgTimeInStateCpuFreqKHz, + DynamicPolicyInfo(long curCpuFreqKHz, long maxCpuFreqKHz, long avgTimeInStateCpuFreqKHz, IntArray affectedCpuCores) { this.curCpuFreqKHz = curCpuFreqKHz; + this.maxCpuFreqKHz = maxCpuFreqKHz; this.avgTimeInStateCpuFreqKHz = avgTimeInStateCpuFreqKHz; this.affectedCpuCores = affectedCpuCores; } @@ -919,6 +918,7 @@ public final class CpuInfoReader { @Override public String toString() { return "DynamicPolicyInfo{curCpuFreqKHz = " + curCpuFreqKHz + + ", maxCpuFreqKHz = " + maxCpuFreqKHz + ", avgTimeInStateCpuFreqKHz = " + avgTimeInStateCpuFreqKHz + ", affectedCpuCores = " + affectedCpuCores + '}'; } diff --git a/services/tests/mockingservicestests/assets/CpuInfoReaderTest/valid_cpufreq_with_time_in_state_2/policy0/scaling_max_freq b/services/tests/mockingservicestests/assets/CpuInfoReaderTest/valid_cpufreq_with_time_in_state_2/policy0/scaling_max_freq index a93d6f7b2c09a..d17275fcb4fc5 100644 --- a/services/tests/mockingservicestests/assets/CpuInfoReaderTest/valid_cpufreq_with_time_in_state_2/policy0/scaling_max_freq +++ b/services/tests/mockingservicestests/assets/CpuInfoReaderTest/valid_cpufreq_with_time_in_state_2/policy0/scaling_max_freq @@ -1 +1 @@ -2500000 +2600000 diff --git a/services/tests/mockingservicestests/assets/CpuInfoReaderTest/valid_cpufreq_with_time_in_state_2/policy1/scaling_max_freq b/services/tests/mockingservicestests/assets/CpuInfoReaderTest/valid_cpufreq_with_time_in_state_2/policy1/scaling_max_freq index c754f1a461ab6..79c41c7d3c281 100644 --- a/services/tests/mockingservicestests/assets/CpuInfoReaderTest/valid_cpufreq_with_time_in_state_2/policy1/scaling_max_freq +++ b/services/tests/mockingservicestests/assets/CpuInfoReaderTest/valid_cpufreq_with_time_in_state_2/policy1/scaling_max_freq @@ -1 +1 @@ -2800000 +2900000 diff --git a/services/tests/mockingservicestests/assets/CpuInfoReaderTest/valid_cpufreq_with_time_in_state_2/policy2/scaling_max_freq b/services/tests/mockingservicestests/assets/CpuInfoReaderTest/valid_cpufreq_with_time_in_state_2/policy2/scaling_max_freq index deebb18c2f77e..526a7175060af 100644 --- a/services/tests/mockingservicestests/assets/CpuInfoReaderTest/valid_cpufreq_with_time_in_state_2/policy2/scaling_max_freq +++ b/services/tests/mockingservicestests/assets/CpuInfoReaderTest/valid_cpufreq_with_time_in_state_2/policy2/scaling_max_freq @@ -1 +1 @@ -2000000 +2100000 diff --git a/services/tests/mockingservicestests/src/com/android/server/cpu/CpuInfoReaderTest.java b/services/tests/mockingservicestests/src/com/android/server/cpu/CpuInfoReaderTest.java index 04f6f8b2e9f0b..e2c2bec729ad3 100644 --- a/services/tests/mockingservicestests/src/com/android/server/cpu/CpuInfoReaderTest.java +++ b/services/tests/mockingservicestests/src/com/android/server/cpu/CpuInfoReaderTest.java @@ -142,8 +142,8 @@ public final class CpuInfoReaderTest extends ExpectableTestCase { expectedCpuInfos.clear(); expectedCpuInfos.append(0, new CpuInfoReader.CpuInfo(/* cpuCore= */ 0, FLAG_CPUSET_CATEGORY_TOP_APP, /* isOnline= */ true, /* curCpuFreqKHz= */ 1_000_000, - /* maxCpuFreqKHz= */ 2_500_000, /* avgTimeInStateCpuFreqKHz= */ 419_354, - /* normalizedAvailableCpuFreqKHz= */ 2_425_919, + /* maxCpuFreqKHz= */ 2_600_000, /* avgTimeInStateCpuFreqKHz= */ 419_354, + /* normalizedAvailableCpuFreqKHz= */ 2_525_919, new CpuInfoReader.CpuUsageStats(/* userTimeMillis= */ 10_000_000, /* niceTimeMillis= */ 1_000_000, /* systemTimeMillis= */ 10_000_000, /* idleTimeMillis= */ 110_000_000, /* iowaitTimeMillis= */ 1_100_000, @@ -152,8 +152,8 @@ public final class CpuInfoReaderTest extends ExpectableTestCase { /* guestNiceTimeMillis= */ 0))); expectedCpuInfos.append(1, new CpuInfoReader.CpuInfo(/* cpuCore= */ 1, FLAG_CPUSET_CATEGORY_TOP_APP, /* isOnline= */ true, /* curCpuFreqKHz= */ 2_800_000, - /* maxCpuFreqKHz= */ 2_800_000, /* avgTimeInStateCpuFreqKHz= */ 429_032, - /* normalizedAvailableCpuFreqKHz= */ 2_403_009, + /* maxCpuFreqKHz= */ 2_900_000, /* avgTimeInStateCpuFreqKHz= */ 429_032, + /* normalizedAvailableCpuFreqKHz= */ 2_503_009, new CpuInfoReader.CpuUsageStats(/* userTimeMillis= */ 900_000, /* niceTimeMillis= */ 1_000_000, /* systemTimeMillis= */ 10_000_000, /* idleTimeMillis= */ 1_000_000, /* iowaitTimeMillis= */ 90_000, @@ -163,8 +163,8 @@ public final class CpuInfoReaderTest extends ExpectableTestCase { expectedCpuInfos.append(2, new CpuInfoReader.CpuInfo(/* cpuCore= */ 2, FLAG_CPUSET_CATEGORY_TOP_APP | FLAG_CPUSET_CATEGORY_BACKGROUND, /* isOnline= */ true, /* curCpuFreqKHz= */ 2_000_000, - /* maxCpuFreqKHz= */ 2_000_000, /* avgTimeInStateCpuFreqKHz= */ 403_225, - /* normalizedAvailableCpuFreqKHz= */ 1_688_209, + /* maxCpuFreqKHz= */ 2_100_000, /* avgTimeInStateCpuFreqKHz= */ 403_225, + /* normalizedAvailableCpuFreqKHz= */ 1_788_209, new CpuInfoReader.CpuUsageStats(/* userTimeMillis= */ 10_000_000, /* niceTimeMillis= */ 2_000_000, /* systemTimeMillis= */ 0, /* idleTimeMillis= */ 10_000_000, /* iowaitTimeMillis= */ 1_000_000, @@ -174,7 +174,7 @@ public final class CpuInfoReaderTest extends ExpectableTestCase { expectedCpuInfos.append(3, new CpuInfoReader.CpuInfo(/* cpuCore= */ 3, FLAG_CPUSET_CATEGORY_TOP_APP | FLAG_CPUSET_CATEGORY_BACKGROUND, /* isOnline= */ false, /* curCpuFreqKHz= */ MISSING_FREQUENCY, - /* maxCpuFreqKHz= */ 2_000_000, /* avgTimeInStateCpuFreqKHz= */ MISSING_FREQUENCY, + /* maxCpuFreqKHz= */ 2_100_000, /* avgTimeInStateCpuFreqKHz= */ MISSING_FREQUENCY, /* normalizedAvailableCpuFreqKHz= */ MISSING_FREQUENCY, new CpuInfoReader.CpuUsageStats(/* userTimeMillis= */ 2_000_000, /* niceTimeMillis= */ 1_000_000, /* systemTimeMillis= */ 1_000_000,