From 8f296eb24cbe8855ff5c5530dd1143cf970847bf Mon Sep 17 00:00:00 2001 From: Connor O'Brien Date: Tue, 1 Oct 2019 17:58:38 -0700 Subject: libtimeinstate: add getCpuFreqs() function Currently the KernelCpuUidFreqTimeReader reads the first line of /proc/uid_time_in_state to determine a device's available CPU frequencies, but libtimeinstate already reads this information from sysfs files that are supported upstream. Add a function to provide this information to libtimeinstate's users & eliminate the need to read the proc file for this data. Add a sanity check in libtimeinstate_test to confirm that getCpuFreqs() and getUidCpuFreqTimes() report the same number of frequencies for each cluster. Bug: 138317993 Test: libtimeinstate_test passes Change-Id: I3e8c632d14bbeb552d7e52bd83a9b4a64dec408d Signed-off-by: Connor O'Brien --- libs/cputimeinstate/cputimeinstate.cpp | 5 +++++ libs/cputimeinstate/cputimeinstate.h | 1 + libs/cputimeinstate/testtimeinstate.cpp | 11 +++++++++++ 3 files changed, 17 insertions(+) diff --git a/libs/cputimeinstate/cputimeinstate.cpp b/libs/cputimeinstate/cputimeinstate.cpp index 7b7a7e370e..037846b4a4 100644 --- a/libs/cputimeinstate/cputimeinstate.cpp +++ b/libs/cputimeinstate/cputimeinstate.cpp @@ -213,6 +213,11 @@ bool startTrackingUidTimes() { attachTracepointProgram("power", "cpu_frequency"); } +std::optional>> getCpuFreqs() { + if (!gInitialized && !initGlobals()) return {}; + return gPolicyFreqs; +} + // Retrieve the times in ns that uid spent running at each CPU frequency. // Return contains no value on error, otherwise it contains a vector of vectors using the format: // [[t0_0, t0_1, ...], diff --git a/libs/cputimeinstate/cputimeinstate.h b/libs/cputimeinstate/cputimeinstate.h index f620715dab..49469d8e04 100644 --- a/libs/cputimeinstate/cputimeinstate.h +++ b/libs/cputimeinstate/cputimeinstate.h @@ -26,6 +26,7 @@ bool startTrackingUidTimes(); std::optional>> getUidCpuFreqTimes(uint32_t uid); std::optional>>> getUidsCpuFreqTimes(); +std::optional>> getCpuFreqs(); struct concurrent_time_t { std::vector active; diff --git a/libs/cputimeinstate/testtimeinstate.cpp b/libs/cputimeinstate/testtimeinstate.cpp index c0cd3e07ff..30722de0c1 100644 --- a/libs/cputimeinstate/testtimeinstate.cpp +++ b/libs/cputimeinstate/testtimeinstate.cpp @@ -351,5 +351,16 @@ TEST(TimeInStateTest, RemoveUid) { ASSERT_EQ(allConcurrentTimes->find(uid), allConcurrentTimes->end()); } +TEST(TimeInStateTest, GetCpuFreqs) { + auto freqs = getCpuFreqs(); + ASSERT_TRUE(freqs.has_value()); + + auto times = getUidCpuFreqTimes(0); + ASSERT_TRUE(times.has_value()); + + ASSERT_EQ(freqs->size(), times->size()); + for (size_t i = 0; i < freqs->size(); ++i) EXPECT_EQ((*freqs)[i].size(), (*times)[i].size()); +} + } // namespace bpf } // namespace android -- cgit v1.2.3-59-g8ed1b