simpleperf: adjust sample_freq based on max_sample_rate file.
Starting from kernel 4.4, perf_event_max_sample_rate can be
adjusted dynamically by the kernel to limit the cpu percentage
used to dump records.
Bug: http://b/35554543
Test: echo 100 >/proc/sys/kernel/perf_event_max_sample_rate &&
Test: run CtsSimpleperfTestCases
Change-Id: I75f6cbc124c545d05fd56b07c6a868b7ca15cd8a
diff --git a/simpleperf/event_fd.cpp b/simpleperf/event_fd.cpp
index b78da4c..18eff2d 100644
--- a/simpleperf/event_fd.cpp
+++ b/simpleperf/event_fd.cpp
@@ -32,6 +32,7 @@
#include <android-base/logging.h>
#include <android-base/stringprintf.h>
+#include "environment.h"
#include "event_attr.h"
#include "event_type.h"
#include "perf_event.h"
@@ -51,7 +52,15 @@
if (group_event_fd != nullptr) {
group_fd = group_event_fd->perf_event_fd_;
}
- int perf_event_fd = perf_event_open(attr, tid, cpu, group_fd, 0);
+ perf_event_attr real_attr = attr;
+ if (attr.freq) {
+ uint64_t max_sample_freq;
+ if (GetMaxSampleFrequency(&max_sample_freq) && max_sample_freq < attr.sample_freq) {
+ PLOG(INFO) << "Adjust sample freq to max allowed sample freq " << max_sample_freq;
+ real_attr.sample_freq = max_sample_freq;
+ }
+ }
+ int perf_event_fd = perf_event_open(real_attr, tid, cpu, group_fd, 0);
if (perf_event_fd == -1) {
if (report_error) {
PLOG(ERROR) << "open perf_event_file (event " << event_name << ", tid "
@@ -77,7 +86,7 @@
return nullptr;
}
return std::unique_ptr<EventFd>(
- new EventFd(attr, perf_event_fd, event_name, tid, cpu));
+ new EventFd(real_attr, perf_event_fd, event_name, tid, cpu));
}
EventFd::~EventFd() {