summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--libs/cputimeinstate/cputimeinstate.cpp19
1 files changed, 13 insertions, 6 deletions
diff --git a/libs/cputimeinstate/cputimeinstate.cpp b/libs/cputimeinstate/cputimeinstate.cpp
index 0e68e628b6..a02b28551e 100644
--- a/libs/cputimeinstate/cputimeinstate.cpp
+++ b/libs/cputimeinstate/cputimeinstate.cpp
@@ -22,6 +22,7 @@
#include <dirent.h>
#include <errno.h>
#include <inttypes.h>
+#include <sys/sysinfo.h>
#include <mutex>
#include <optional>
@@ -167,9 +168,12 @@ std::optional<std::vector<std::vector<uint64_t>>> getUidCpuFreqTimes(uint32_t ui
return {};
}
for (uint32_t i = 0; i < gNPolicies; ++i) {
- if (idxs[i] == gPolicyFreqs[i].size() || freq != gPolicyFreqs[i][idxs[i]]) continue;
uint64_t time = 0;
for (uint32_t cpu : gPolicyCpus[i]) time += value.ar[cpu];
+ if (idxs[i] == gPolicyFreqs[i].size() || freq != gPolicyFreqs[i][idxs[i]]) {
+ if (time != 0) return {};
+ else continue;
+ }
idxs[i] += 1;
out[i].emplace_back(time);
}
@@ -209,10 +213,12 @@ getUidsCpuFreqTimes() {
}
for (size_t policy = 0; policy < gNPolicies; ++policy) {
- for (const auto &cpu : gPolicyCpus[policy]) {
- auto freqIdx = policyFreqIdxs[policy][key.freq];
- map[key.uid][policy][freqIdx] += val.ar[cpu];
- }
+ uint64_t time = 0;
+ for (const auto &cpu : gPolicyCpus[policy]) time += val.ar[cpu];
+ if (!time) continue;
+ auto it = policyFreqIdxs[policy].find(key.freq);
+ if (it == policyFreqIdxs[policy].end()) return android::netdutils::Status(-1);
+ map[key.uid][policy][it->second] += time;
}
return android::netdutils::status::ok;
};
@@ -225,9 +231,10 @@ bool clearUidCpuFreqTimes(uint32_t uid) {
if (!gInitialized && !initGlobals()) return false;
time_key_t key = {.uid = uid, .freq = 0};
- std::vector<uint32_t> idxs(gNPolicies, 0);
+ std::vector<uint64_t> vals(get_nprocs_conf(), 0);
for (auto freq : gAllFreqs) {
key.freq = freq;
+ if (writeToMapEntry(gMapFd, &key, vals.data(), BPF_EXIST) && errno != ENOENT) return false;
if (deleteMapEntry(gMapFd, &key) && errno != ENOENT) return false;
}
return true;