aboutsummaryrefslogtreecommitdiff
path: root/src/traced/probes/common/cpu_freq_info.cc
diff options
context:
space:
mode:
Diffstat (limited to 'src/traced/probes/common/cpu_freq_info.cc')
-rw-r--r--src/traced/probes/common/cpu_freq_info.cc37
1 files changed, 32 insertions, 5 deletions
diff --git a/src/traced/probes/common/cpu_freq_info.cc b/src/traced/probes/common/cpu_freq_info.cc
index 01373694d..2d3c1f946 100644
--- a/src/traced/probes/common/cpu_freq_info.cc
+++ b/src/traced/probes/common/cpu_freq_info.cc
@@ -16,6 +16,8 @@
#include "src/traced/probes/common/cpu_freq_info.h"
+#include <unistd.h>
+
#include <set>
#include "perfetto/ext/base/file_utils.h"
@@ -42,10 +44,11 @@ void ReadAndAppendFreqs(std::set<CpuAndFreq>* freqs,
} // namespace
-CpuFreqInfo::CpuFreqInfo(std::string cpu_dir_path) {
- base::ScopedDir cpu_dir(opendir(cpu_dir_path.c_str()));
+CpuFreqInfo::CpuFreqInfo(std::string sysfs_cpu_path)
+ : sysfs_cpu_path_{sysfs_cpu_path} {
+ base::ScopedDir cpu_dir(opendir(sysfs_cpu_path_.c_str()));
if (!cpu_dir) {
- PERFETTO_PLOG("Failed to opendir(%s)", cpu_dir_path.c_str());
+ PERFETTO_PLOG("Failed to opendir(%s)", sysfs_cpu_path_.c_str());
return;
}
// Accumulate cpu and freqs into a set to ensure stable order.
@@ -64,11 +67,11 @@ CpuFreqInfo::CpuFreqInfo(std::string cpu_dir_path) {
uint32_t cpu_index = maybe_cpu_index.value();
ReadAndAppendFreqs(
&freqs, cpu_index,
- ReadFile(cpu_dir_path + "/cpu" + std::to_string(cpu_index) +
+ ReadFile(sysfs_cpu_path_ + "/cpu" + std::to_string(cpu_index) +
"/cpufreq/scaling_available_frequencies"));
ReadAndAppendFreqs(
&freqs, cpu_index,
- ReadFile(cpu_dir_path + "/cpu" + std::to_string(cpu_index) +
+ ReadFile(sysfs_cpu_path_ + "/cpu" + std::to_string(cpu_index) +
"/cpufreq/scaling_boost_frequencies"));
}
@@ -118,4 +121,28 @@ std::string CpuFreqInfo::ReadFile(std::string path) {
return contents;
}
+const std::vector<uint32_t>& CpuFreqInfo::ReadCpuCurrFreq() {
+ // Check if capacity of cpu_curr_freq_ is enough for all CPUs
+ auto num_cpus = static_cast<size_t>(sysconf(_SC_NPROCESSORS_CONF));
+ if (cpu_curr_freq_.size() < num_cpus)
+ cpu_curr_freq_.resize(num_cpus);
+
+ for (uint32_t i = 0; i < cpu_curr_freq_.size(); i++) {
+ // Read CPU current frequency. Set 0 for offline/disabled cpus.
+ std::string buf(ReadFile(sysfs_cpu_path_ + "/cpu" + std::to_string(i) +
+ "/cpufreq/scaling_cur_freq"));
+ if (buf.empty()) {
+ cpu_curr_freq_[i] = 0;
+ continue;
+ }
+ auto freq = base::StringToUInt32(base::StripSuffix(buf, "\n"));
+ if (!freq.has_value()) {
+ cpu_curr_freq_[i] = 0;
+ continue;
+ }
+ cpu_curr_freq_[i] = freq.value();
+ }
+ return cpu_curr_freq_;
+}
+
} // namespace perfetto