Loading libs/cputimeinstate/cputimeinstate.cpp +23 −9 Original line number Diff line number Diff line Loading @@ -55,6 +55,7 @@ static uint32_t gNPolicies = 0; static uint32_t gNCpus = 0; static std::vector<std::vector<uint32_t>> gPolicyFreqs; static std::vector<std::vector<uint32_t>> gPolicyCpus; static std::vector<uint32_t> gCpuIndexMap; static std::set<uint32_t> gAllFreqs; static unique_fd gTisTotalMapFd; static unique_fd gTisMapFd; Loading Loading @@ -108,7 +109,7 @@ static bool initGlobals() { free(dirlist[i]); } free(dirlist); uint32_t max_cpu_number = 0; for (const auto &policy : policyFileNames) { std::vector<uint32_t> freqs; for (const auto &name : {"available", "boost"}) { Loading @@ -127,8 +128,19 @@ static bool initGlobals() { std::string path = StringPrintf("%s/%s/%s", basepath, policy.c_str(), "related_cpus"); auto cpus = readNumbersFromFile(path); if (!cpus) return false; for (auto cpu : *cpus) { if(cpu > max_cpu_number) max_cpu_number = cpu; } gPolicyCpus.emplace_back(*cpus); } gCpuIndexMap = std::vector<uint32_t>(max_cpu_number+1, -1); uint32_t cpuorder = 0; for (const auto &cpuList : gPolicyCpus) { for (auto cpu : cpuList) { gCpuIndexMap[cpu] = cpuorder++; } } gTisTotalMapFd = unique_fd{bpf_obj_get(BPF_FS_PATH "map_timeInState_total_time_in_state_map")}; Loading Loading @@ -277,7 +289,7 @@ std::optional<std::vector<std::vector<uint64_t>>> getTotalCpuFreqTimes() { for (uint32_t policyIdx = 0; policyIdx < gNPolicies; ++policyIdx) { if (freqIdx >= gPolicyFreqs[policyIdx].size()) continue; for (const auto &cpu : gPolicyCpus[policyIdx]) { out[policyIdx][freqIdx] += vals[cpu]; out[policyIdx][freqIdx] += vals[gCpuIndexMap[cpu]]; } } } Loading Loading @@ -316,7 +328,8 @@ std::optional<std::vector<std::vector<uint64_t>>> getUidCpuFreqTimes(uint32_t ui auto end = nextOffset < gPolicyFreqs[j].size() ? begin + FREQS_PER_ENTRY : out[j].end(); for (const auto &cpu : gPolicyCpus[j]) { std::transform(begin, end, std::begin(vals[cpu].ar), begin, std::plus<uint64_t>()); std::transform(begin, end, std::begin(vals[gCpuIndexMap[cpu]].ar), begin, std::plus<uint64_t>()); } } } Loading Loading @@ -382,7 +395,8 @@ getUidsUpdatedCpuFreqTimes(uint64_t *lastUpdate) { auto end = nextOffset < gPolicyFreqs[i].size() ? begin + FREQS_PER_ENTRY : map[key.uid][i].end(); for (const auto &cpu : gPolicyCpus[i]) { std::transform(begin, end, std::begin(vals[cpu].ar), begin, std::plus<uint64_t>()); std::transform(begin, end, std::begin(vals[gCpuIndexMap[cpu]].ar), begin, std::plus<uint64_t>()); } } prevKey = key; Loading Loading @@ -437,8 +451,8 @@ std::optional<concurrent_time_t> getUidConcurrentTimes(uint32_t uid, bool retry) : ret.policy[policy].end(); for (const auto &cpu : gPolicyCpus[policy]) { std::transform(policyBegin, policyEnd, std::begin(vals[cpu].policy), policyBegin, std::plus<uint64_t>()); std::transform(policyBegin, policyEnd, std::begin(vals[gCpuIndexMap[cpu]].policy), policyBegin, std::plus<uint64_t>()); } } } Loading Loading @@ -506,8 +520,8 @@ std::optional<std::unordered_map<uint32_t, concurrent_time_t>> getUidsUpdatedCon : ret[key.uid].policy[policy].end(); for (const auto &cpu : gPolicyCpus[policy]) { std::transform(policyBegin, policyEnd, std::begin(vals[cpu].policy), policyBegin, std::plus<uint64_t>()); std::transform(policyBegin, policyEnd, std::begin(vals[gCpuIndexMap[cpu]].policy), policyBegin, std::plus<uint64_t>()); } } } while (prevKey = key, !getNextMapKey(gConcurrentMapFd, &prevKey, &key)); Loading Loading @@ -640,7 +654,7 @@ getAggregatedTaskCpuFreqTimes(pid_t tgid, const std::vector<uint16_t> &aggregati auto end = nextOffset < gPolicyFreqs[j].size() ? begin + FREQS_PER_ENTRY : map[key.aggregation_key][j].end(); for (const auto &cpu : gPolicyCpus[j]) { std::transform(begin, end, std::begin(vals[cpu].ar), begin, std::transform(begin, end, std::begin(vals[gCpuIndexMap[cpu]].ar), begin, std::plus<uint64_t>()); } } Loading Loading
libs/cputimeinstate/cputimeinstate.cpp +23 −9 Original line number Diff line number Diff line Loading @@ -55,6 +55,7 @@ static uint32_t gNPolicies = 0; static uint32_t gNCpus = 0; static std::vector<std::vector<uint32_t>> gPolicyFreqs; static std::vector<std::vector<uint32_t>> gPolicyCpus; static std::vector<uint32_t> gCpuIndexMap; static std::set<uint32_t> gAllFreqs; static unique_fd gTisTotalMapFd; static unique_fd gTisMapFd; Loading Loading @@ -108,7 +109,7 @@ static bool initGlobals() { free(dirlist[i]); } free(dirlist); uint32_t max_cpu_number = 0; for (const auto &policy : policyFileNames) { std::vector<uint32_t> freqs; for (const auto &name : {"available", "boost"}) { Loading @@ -127,8 +128,19 @@ static bool initGlobals() { std::string path = StringPrintf("%s/%s/%s", basepath, policy.c_str(), "related_cpus"); auto cpus = readNumbersFromFile(path); if (!cpus) return false; for (auto cpu : *cpus) { if(cpu > max_cpu_number) max_cpu_number = cpu; } gPolicyCpus.emplace_back(*cpus); } gCpuIndexMap = std::vector<uint32_t>(max_cpu_number+1, -1); uint32_t cpuorder = 0; for (const auto &cpuList : gPolicyCpus) { for (auto cpu : cpuList) { gCpuIndexMap[cpu] = cpuorder++; } } gTisTotalMapFd = unique_fd{bpf_obj_get(BPF_FS_PATH "map_timeInState_total_time_in_state_map")}; Loading Loading @@ -277,7 +289,7 @@ std::optional<std::vector<std::vector<uint64_t>>> getTotalCpuFreqTimes() { for (uint32_t policyIdx = 0; policyIdx < gNPolicies; ++policyIdx) { if (freqIdx >= gPolicyFreqs[policyIdx].size()) continue; for (const auto &cpu : gPolicyCpus[policyIdx]) { out[policyIdx][freqIdx] += vals[cpu]; out[policyIdx][freqIdx] += vals[gCpuIndexMap[cpu]]; } } } Loading Loading @@ -316,7 +328,8 @@ std::optional<std::vector<std::vector<uint64_t>>> getUidCpuFreqTimes(uint32_t ui auto end = nextOffset < gPolicyFreqs[j].size() ? begin + FREQS_PER_ENTRY : out[j].end(); for (const auto &cpu : gPolicyCpus[j]) { std::transform(begin, end, std::begin(vals[cpu].ar), begin, std::plus<uint64_t>()); std::transform(begin, end, std::begin(vals[gCpuIndexMap[cpu]].ar), begin, std::plus<uint64_t>()); } } } Loading Loading @@ -382,7 +395,8 @@ getUidsUpdatedCpuFreqTimes(uint64_t *lastUpdate) { auto end = nextOffset < gPolicyFreqs[i].size() ? begin + FREQS_PER_ENTRY : map[key.uid][i].end(); for (const auto &cpu : gPolicyCpus[i]) { std::transform(begin, end, std::begin(vals[cpu].ar), begin, std::plus<uint64_t>()); std::transform(begin, end, std::begin(vals[gCpuIndexMap[cpu]].ar), begin, std::plus<uint64_t>()); } } prevKey = key; Loading Loading @@ -437,8 +451,8 @@ std::optional<concurrent_time_t> getUidConcurrentTimes(uint32_t uid, bool retry) : ret.policy[policy].end(); for (const auto &cpu : gPolicyCpus[policy]) { std::transform(policyBegin, policyEnd, std::begin(vals[cpu].policy), policyBegin, std::plus<uint64_t>()); std::transform(policyBegin, policyEnd, std::begin(vals[gCpuIndexMap[cpu]].policy), policyBegin, std::plus<uint64_t>()); } } } Loading Loading @@ -506,8 +520,8 @@ std::optional<std::unordered_map<uint32_t, concurrent_time_t>> getUidsUpdatedCon : ret[key.uid].policy[policy].end(); for (const auto &cpu : gPolicyCpus[policy]) { std::transform(policyBegin, policyEnd, std::begin(vals[cpu].policy), policyBegin, std::plus<uint64_t>()); std::transform(policyBegin, policyEnd, std::begin(vals[gCpuIndexMap[cpu]].policy), policyBegin, std::plus<uint64_t>()); } } } while (prevKey = key, !getNextMapKey(gConcurrentMapFd, &prevKey, &key)); Loading Loading @@ -640,7 +654,7 @@ getAggregatedTaskCpuFreqTimes(pid_t tgid, const std::vector<uint16_t> &aggregati auto end = nextOffset < gPolicyFreqs[j].size() ? begin + FREQS_PER_ENTRY : map[key.aggregation_key][j].end(); for (const auto &cpu : gPolicyCpus[j]) { std::transform(begin, end, std::begin(vals[cpu].ar), begin, std::transform(begin, end, std::begin(vals[gCpuIndexMap[cpu]].ar), begin, std::plus<uint64_t>()); } } Loading