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() {