From f1707975d41a45a59031edc8167874857bcbd75f Mon Sep 17 00:00:00 2001 From: Lakshman Annadorai Date: Mon, 28 Nov 2022 12:49:27 -0800 Subject: [PATCH] Read current CPU frequencies and populate CpuInfo. - CPU time in state file provides information on the time spent by CPU cores in a specific frequency since system bootup. This time is monotonically increasing since system bootup. - Use the time in state information to calculate the average frequency of a CPU core between two polling periods. - The unit tests require test files to read the CPU info. The test files in the test APK are not accessible by the implementation. Thus, copy the test files from the APK into the test app's cache directory during setup and remove them from the cache directory during teardown. Test: atest CpuInfoReaderTest Bug: 217422127 Bug: 242722241 (cherry-picked from commit c1057fef03d755e35e6d6723480dc7a9cbbeb3c8) Change-Id: Iadb234a56b48dcba3c8dc77411b175de5046ce89 --- .../com/android/server/cpu/CpuInfoReader.java | 164 ++++++- .../corrupted_cpufreq/policy0/affected_cpus | 1 + .../policy0/cpuinfo_cur_freq | 1 + .../policy0/cpuinfo_max_freq | 1 + .../corrupted_cpufreq/policy0/related_cpus | 1 + .../policy0/scaling_cur_freq | 1 + .../policy0/scaling_max_freq | 1 + .../corrupted_cpufreq/policy1/affected_cpus | 1 + .../policy1/cpuinfo_cur_freq | 1 + .../policy1/cpuinfo_max_freq | 1 + .../corrupted_cpufreq/policy1/related_cpus | 1 + .../corrupted_cpufreq/policy2/affected_cpus | 2 + .../policy2/cpuinfo_cur_freq | 0 .../policy2/cpuinfo_max_freq | 0 .../corrupted_cpufreq/policy2/related_cpus | 2 + .../policy2/scaling_cur_freq | 1 + .../policy2/scaling_max_freq | 1 + .../corrupted_cpuset/background/cpus | 2 + .../corrupted_cpuset/top-app/cpus | 2 + .../CpuInfoReaderTest/corrupted_proc_stat | 12 + .../policy0/affected_cpus | 1 + .../policy0/cpuinfo_cur_freq | 1 + .../policy0/cpuinfo_max_freq | 1 + .../policy0/related_cpus | 1 + .../policy0/scaling_cur_freq | 1 + .../policy0/scaling_max_freq | 1 + .../policy0/stats/time_in_state | 4 + .../policy1/affected_cpus | 1 + .../policy1/cpuinfo_cur_freq | 1 + .../policy1/cpuinfo_max_freq | 1 + .../policy1/related_cpus | 1 + .../policy1/stats/time_in_state | 4 + .../policy2/affected_cpus | 1 + .../policy2/cpuinfo_cur_freq | 0 .../policy2/cpuinfo_max_freq | 0 .../policy2/related_cpus | 1 + .../policy2/scaling_cur_freq | 1 + .../policy2/scaling_max_freq | 1 + .../policy2/stats/time_in_state | 4 + .../policy0/affected_cpus | 1 + .../policy0/cpuinfo_cur_freq | 1 + .../policy0/cpuinfo_max_freq | 1 + .../policy0/scaling_cur_freq | 1 + .../policy0/scaling_max_freq | 1 + .../policy0/stats/time_in_state | 4 + .../policy1/affected_cpus | 1 + .../policy1/cpuinfo_cur_freq | 1 + .../policy1/cpuinfo_max_freq | 1 + .../policy1/stats/time_in_state | 4 + .../policy2/affected_cpus | 1 + .../policy2/cpuinfo_cur_freq | 0 .../policy2/cpuinfo_max_freq | 0 .../policy2/scaling_cur_freq | 1 + .../policy2/scaling_max_freq | 1 + .../policy2/stats/time_in_state | 4 + .../policy0/affected_cpus | 1 + .../policy0/cpuinfo_cur_freq | 1 + .../policy0/cpuinfo_max_freq | 1 + .../policy0/related_cpus | 1 + .../policy0/scaling_cur_freq | 1 + .../policy0/scaling_max_freq | 1 + .../policy1/affected_cpus | 1 + .../policy1/cpuinfo_cur_freq | 1 + .../policy1/cpuinfo_max_freq | 1 + .../policy1/related_cpus | 1 + .../policy2/affected_cpus | 1 + .../policy2/cpuinfo_cur_freq | 0 .../policy2/cpuinfo_max_freq | 0 .../policy2/related_cpus | 1 + .../policy2/scaling_cur_freq | 1 + .../policy2/scaling_max_freq | 1 + .../policy0/affected_cpus | 1 + .../policy0/cpuinfo_cur_freq | 1 + .../policy0/cpuinfo_max_freq | 1 + .../policy0/scaling_cur_freq | 1 + .../policy0/scaling_max_freq | 1 + .../policy1/affected_cpus | 1 + .../policy1/cpuinfo_cur_freq | 1 + .../policy1/cpuinfo_max_freq | 1 + .../policy2/affected_cpus | 1 + .../policy2/cpuinfo_cur_freq | 0 .../policy2/cpuinfo_max_freq | 0 .../policy2/scaling_cur_freq | 1 + .../policy2/scaling_max_freq | 1 + .../valid_cpuset/background/cpus | 2 + .../valid_cpuset/top-app/cpus | 1 + .../assets/CpuInfoReaderTest/valid_proc_stat | 12 + .../CpuInfoReaderTest/valid_proc_stat_2 | 12 + .../android/server/cpu/CpuInfoReaderTest.java | 445 ++++++++++++++++++ 89 files changed, 736 insertions(+), 6 deletions(-) create mode 100644 services/tests/mockingservicestests/assets/CpuInfoReaderTest/corrupted_cpufreq/policy0/affected_cpus create mode 100644 services/tests/mockingservicestests/assets/CpuInfoReaderTest/corrupted_cpufreq/policy0/cpuinfo_cur_freq create mode 100644 services/tests/mockingservicestests/assets/CpuInfoReaderTest/corrupted_cpufreq/policy0/cpuinfo_max_freq create mode 100644 services/tests/mockingservicestests/assets/CpuInfoReaderTest/corrupted_cpufreq/policy0/related_cpus create mode 100644 services/tests/mockingservicestests/assets/CpuInfoReaderTest/corrupted_cpufreq/policy0/scaling_cur_freq create mode 100644 services/tests/mockingservicestests/assets/CpuInfoReaderTest/corrupted_cpufreq/policy0/scaling_max_freq create mode 100644 services/tests/mockingservicestests/assets/CpuInfoReaderTest/corrupted_cpufreq/policy1/affected_cpus create mode 100644 services/tests/mockingservicestests/assets/CpuInfoReaderTest/corrupted_cpufreq/policy1/cpuinfo_cur_freq create mode 100644 services/tests/mockingservicestests/assets/CpuInfoReaderTest/corrupted_cpufreq/policy1/cpuinfo_max_freq create mode 100644 services/tests/mockingservicestests/assets/CpuInfoReaderTest/corrupted_cpufreq/policy1/related_cpus create mode 100644 services/tests/mockingservicestests/assets/CpuInfoReaderTest/corrupted_cpufreq/policy2/affected_cpus create mode 100644 services/tests/mockingservicestests/assets/CpuInfoReaderTest/corrupted_cpufreq/policy2/cpuinfo_cur_freq create mode 100644 services/tests/mockingservicestests/assets/CpuInfoReaderTest/corrupted_cpufreq/policy2/cpuinfo_max_freq create mode 100644 services/tests/mockingservicestests/assets/CpuInfoReaderTest/corrupted_cpufreq/policy2/related_cpus create mode 100644 services/tests/mockingservicestests/assets/CpuInfoReaderTest/corrupted_cpufreq/policy2/scaling_cur_freq create mode 100644 services/tests/mockingservicestests/assets/CpuInfoReaderTest/corrupted_cpufreq/policy2/scaling_max_freq create mode 100644 services/tests/mockingservicestests/assets/CpuInfoReaderTest/corrupted_cpuset/background/cpus create mode 100644 services/tests/mockingservicestests/assets/CpuInfoReaderTest/corrupted_cpuset/top-app/cpus create mode 100644 services/tests/mockingservicestests/assets/CpuInfoReaderTest/corrupted_proc_stat create mode 100644 services/tests/mockingservicestests/assets/CpuInfoReaderTest/valid_cpufreq_with_time_in_state/policy0/affected_cpus create mode 100644 services/tests/mockingservicestests/assets/CpuInfoReaderTest/valid_cpufreq_with_time_in_state/policy0/cpuinfo_cur_freq create mode 100644 services/tests/mockingservicestests/assets/CpuInfoReaderTest/valid_cpufreq_with_time_in_state/policy0/cpuinfo_max_freq create mode 100644 services/tests/mockingservicestests/assets/CpuInfoReaderTest/valid_cpufreq_with_time_in_state/policy0/related_cpus create mode 100644 services/tests/mockingservicestests/assets/CpuInfoReaderTest/valid_cpufreq_with_time_in_state/policy0/scaling_cur_freq create mode 100644 services/tests/mockingservicestests/assets/CpuInfoReaderTest/valid_cpufreq_with_time_in_state/policy0/scaling_max_freq create mode 100644 services/tests/mockingservicestests/assets/CpuInfoReaderTest/valid_cpufreq_with_time_in_state/policy0/stats/time_in_state create mode 100644 services/tests/mockingservicestests/assets/CpuInfoReaderTest/valid_cpufreq_with_time_in_state/policy1/affected_cpus create mode 100644 services/tests/mockingservicestests/assets/CpuInfoReaderTest/valid_cpufreq_with_time_in_state/policy1/cpuinfo_cur_freq create mode 100644 services/tests/mockingservicestests/assets/CpuInfoReaderTest/valid_cpufreq_with_time_in_state/policy1/cpuinfo_max_freq create mode 100644 services/tests/mockingservicestests/assets/CpuInfoReaderTest/valid_cpufreq_with_time_in_state/policy1/related_cpus create mode 100644 services/tests/mockingservicestests/assets/CpuInfoReaderTest/valid_cpufreq_with_time_in_state/policy1/stats/time_in_state create mode 100644 services/tests/mockingservicestests/assets/CpuInfoReaderTest/valid_cpufreq_with_time_in_state/policy2/affected_cpus create mode 100644 services/tests/mockingservicestests/assets/CpuInfoReaderTest/valid_cpufreq_with_time_in_state/policy2/cpuinfo_cur_freq create mode 100644 services/tests/mockingservicestests/assets/CpuInfoReaderTest/valid_cpufreq_with_time_in_state/policy2/cpuinfo_max_freq create mode 100644 services/tests/mockingservicestests/assets/CpuInfoReaderTest/valid_cpufreq_with_time_in_state/policy2/related_cpus create mode 100644 services/tests/mockingservicestests/assets/CpuInfoReaderTest/valid_cpufreq_with_time_in_state/policy2/scaling_cur_freq create mode 100644 services/tests/mockingservicestests/assets/CpuInfoReaderTest/valid_cpufreq_with_time_in_state/policy2/scaling_max_freq create mode 100644 services/tests/mockingservicestests/assets/CpuInfoReaderTest/valid_cpufreq_with_time_in_state/policy2/stats/time_in_state create mode 100644 services/tests/mockingservicestests/assets/CpuInfoReaderTest/valid_cpufreq_with_time_in_state_2/policy0/affected_cpus create mode 100644 services/tests/mockingservicestests/assets/CpuInfoReaderTest/valid_cpufreq_with_time_in_state_2/policy0/cpuinfo_cur_freq create mode 100644 services/tests/mockingservicestests/assets/CpuInfoReaderTest/valid_cpufreq_with_time_in_state_2/policy0/cpuinfo_max_freq create mode 100644 services/tests/mockingservicestests/assets/CpuInfoReaderTest/valid_cpufreq_with_time_in_state_2/policy0/scaling_cur_freq create mode 100644 services/tests/mockingservicestests/assets/CpuInfoReaderTest/valid_cpufreq_with_time_in_state_2/policy0/scaling_max_freq create mode 100644 services/tests/mockingservicestests/assets/CpuInfoReaderTest/valid_cpufreq_with_time_in_state_2/policy0/stats/time_in_state create mode 100644 services/tests/mockingservicestests/assets/CpuInfoReaderTest/valid_cpufreq_with_time_in_state_2/policy1/affected_cpus create mode 100644 services/tests/mockingservicestests/assets/CpuInfoReaderTest/valid_cpufreq_with_time_in_state_2/policy1/cpuinfo_cur_freq create mode 100644 services/tests/mockingservicestests/assets/CpuInfoReaderTest/valid_cpufreq_with_time_in_state_2/policy1/cpuinfo_max_freq create mode 100644 services/tests/mockingservicestests/assets/CpuInfoReaderTest/valid_cpufreq_with_time_in_state_2/policy1/stats/time_in_state create mode 100644 services/tests/mockingservicestests/assets/CpuInfoReaderTest/valid_cpufreq_with_time_in_state_2/policy2/affected_cpus create mode 100644 services/tests/mockingservicestests/assets/CpuInfoReaderTest/valid_cpufreq_with_time_in_state_2/policy2/cpuinfo_cur_freq create mode 100644 services/tests/mockingservicestests/assets/CpuInfoReaderTest/valid_cpufreq_with_time_in_state_2/policy2/cpuinfo_max_freq create mode 100644 services/tests/mockingservicestests/assets/CpuInfoReaderTest/valid_cpufreq_with_time_in_state_2/policy2/scaling_cur_freq create mode 100644 services/tests/mockingservicestests/assets/CpuInfoReaderTest/valid_cpufreq_with_time_in_state_2/policy2/scaling_max_freq create mode 100644 services/tests/mockingservicestests/assets/CpuInfoReaderTest/valid_cpufreq_with_time_in_state_2/policy2/stats/time_in_state create mode 100644 services/tests/mockingservicestests/assets/CpuInfoReaderTest/valid_cpufreq_without_time_in_state/policy0/affected_cpus create mode 100644 services/tests/mockingservicestests/assets/CpuInfoReaderTest/valid_cpufreq_without_time_in_state/policy0/cpuinfo_cur_freq create mode 100644 services/tests/mockingservicestests/assets/CpuInfoReaderTest/valid_cpufreq_without_time_in_state/policy0/cpuinfo_max_freq create mode 100644 services/tests/mockingservicestests/assets/CpuInfoReaderTest/valid_cpufreq_without_time_in_state/policy0/related_cpus create mode 100644 services/tests/mockingservicestests/assets/CpuInfoReaderTest/valid_cpufreq_without_time_in_state/policy0/scaling_cur_freq create mode 100644 services/tests/mockingservicestests/assets/CpuInfoReaderTest/valid_cpufreq_without_time_in_state/policy0/scaling_max_freq create mode 100644 services/tests/mockingservicestests/assets/CpuInfoReaderTest/valid_cpufreq_without_time_in_state/policy1/affected_cpus create mode 100644 services/tests/mockingservicestests/assets/CpuInfoReaderTest/valid_cpufreq_without_time_in_state/policy1/cpuinfo_cur_freq create mode 100644 services/tests/mockingservicestests/assets/CpuInfoReaderTest/valid_cpufreq_without_time_in_state/policy1/cpuinfo_max_freq create mode 100644 services/tests/mockingservicestests/assets/CpuInfoReaderTest/valid_cpufreq_without_time_in_state/policy1/related_cpus create mode 100644 services/tests/mockingservicestests/assets/CpuInfoReaderTest/valid_cpufreq_without_time_in_state/policy2/affected_cpus create mode 100644 services/tests/mockingservicestests/assets/CpuInfoReaderTest/valid_cpufreq_without_time_in_state/policy2/cpuinfo_cur_freq create mode 100644 services/tests/mockingservicestests/assets/CpuInfoReaderTest/valid_cpufreq_without_time_in_state/policy2/cpuinfo_max_freq create mode 100644 services/tests/mockingservicestests/assets/CpuInfoReaderTest/valid_cpufreq_without_time_in_state/policy2/related_cpus create mode 100644 services/tests/mockingservicestests/assets/CpuInfoReaderTest/valid_cpufreq_without_time_in_state/policy2/scaling_cur_freq create mode 100644 services/tests/mockingservicestests/assets/CpuInfoReaderTest/valid_cpufreq_without_time_in_state/policy2/scaling_max_freq create mode 100644 services/tests/mockingservicestests/assets/CpuInfoReaderTest/valid_cpufreq_without_time_in_state_2/policy0/affected_cpus create mode 100644 services/tests/mockingservicestests/assets/CpuInfoReaderTest/valid_cpufreq_without_time_in_state_2/policy0/cpuinfo_cur_freq create mode 100644 services/tests/mockingservicestests/assets/CpuInfoReaderTest/valid_cpufreq_without_time_in_state_2/policy0/cpuinfo_max_freq create mode 100644 services/tests/mockingservicestests/assets/CpuInfoReaderTest/valid_cpufreq_without_time_in_state_2/policy0/scaling_cur_freq create mode 100644 services/tests/mockingservicestests/assets/CpuInfoReaderTest/valid_cpufreq_without_time_in_state_2/policy0/scaling_max_freq create mode 100644 services/tests/mockingservicestests/assets/CpuInfoReaderTest/valid_cpufreq_without_time_in_state_2/policy1/affected_cpus create mode 100644 services/tests/mockingservicestests/assets/CpuInfoReaderTest/valid_cpufreq_without_time_in_state_2/policy1/cpuinfo_cur_freq create mode 100644 services/tests/mockingservicestests/assets/CpuInfoReaderTest/valid_cpufreq_without_time_in_state_2/policy1/cpuinfo_max_freq create mode 100644 services/tests/mockingservicestests/assets/CpuInfoReaderTest/valid_cpufreq_without_time_in_state_2/policy2/affected_cpus create mode 100644 services/tests/mockingservicestests/assets/CpuInfoReaderTest/valid_cpufreq_without_time_in_state_2/policy2/cpuinfo_cur_freq create mode 100644 services/tests/mockingservicestests/assets/CpuInfoReaderTest/valid_cpufreq_without_time_in_state_2/policy2/cpuinfo_max_freq create mode 100644 services/tests/mockingservicestests/assets/CpuInfoReaderTest/valid_cpufreq_without_time_in_state_2/policy2/scaling_cur_freq create mode 100644 services/tests/mockingservicestests/assets/CpuInfoReaderTest/valid_cpufreq_without_time_in_state_2/policy2/scaling_max_freq create mode 100644 services/tests/mockingservicestests/assets/CpuInfoReaderTest/valid_cpuset/background/cpus create mode 100644 services/tests/mockingservicestests/assets/CpuInfoReaderTest/valid_cpuset/top-app/cpus create mode 100644 services/tests/mockingservicestests/assets/CpuInfoReaderTest/valid_proc_stat create mode 100644 services/tests/mockingservicestests/assets/CpuInfoReaderTest/valid_proc_stat_2 create mode 100644 services/tests/mockingservicestests/src/com/android/server/cpu/CpuInfoReaderTest.java diff --git a/services/core/java/com/android/server/cpu/CpuInfoReader.java b/services/core/java/com/android/server/cpu/CpuInfoReader.java index 680829d2bfc30..b13d7533f29bb 100644 --- a/services/core/java/com/android/server/cpu/CpuInfoReader.java +++ b/services/core/java/com/android/server/cpu/CpuInfoReader.java @@ -20,6 +20,7 @@ import android.annotation.IntDef; import android.annotation.Nullable; import android.system.Os; import android.system.OsConstants; +import android.util.ArrayMap; import android.util.SparseArray; import android.util.SparseIntArray; @@ -46,8 +47,12 @@ public final class CpuInfoReader { private static final String CPUFREQ_DIR_PATH = "/sys/devices/system/cpu/cpufreq"; private static final String POLICY_DIR_PREFIX = "policy"; private static final String RELATED_CPUS_FILE = "related_cpus"; + private static final String AFFECTED_CPUS_FILE = "affected_cpus"; + private static final String CUR_CPUFREQ_FILE = "cpuinfo_cur_freq"; private static final String MAX_CPUFREQ_FILE = "cpuinfo_max_freq"; + private static final String CUR_SCALING_FREQ_FILE = "scaling_cur_freq"; private static final String MAX_SCALING_FREQ_FILE = "scaling_max_freq"; + private static final String TIME_IN_STATE_FILE = "stats/time_in_state"; private static final String CPUSET_DIR_PATH = "/dev/cpuset"; private static final String CPUSET_TOP_APP_DIR = "top-app"; private static final String CPUSET_BACKGROUND_DIR = "background"; @@ -60,6 +65,8 @@ public final class CpuInfoReader { + "(?[0-9]+)\\s(?[0-9]+)\\s" + "(?[0-9]+)\\s(?[0-9]+)\\s" + "(?[0-9]+)"); + private static final Pattern TIME_IN_STATE_PATTERN = + Pattern.compile("(?[0-9]+)\\s(?