summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorYabin Cui <yabinc@google.com>2016-06-11 03:53:11 +0000
committerAndroid (Google) Code Review <android-gerrit@google.com>2016-06-11 03:53:12 +0000
commit4d9e9c66fbc82b5f024b6457de591fe75e4a417e (patch)
treea43d39be0dc5f5cc3b0940e8b7fad580e3ff5b69
parent92c688b1f744dbded59f2df547f31db1638e316b (diff)
parent97ad035360ebcc3a4e34edd1b09fd628c8660537 (diff)
downloadextras-4d9e9c66fbc82b5f024b6457de591fe75e4a417e.tar.gz
Merge "simpleperf: restore perf_harden after simpleperf cts test." into nyc-dev
-rw-r--r--simpleperf/gtest_main.cpp49
1 files changed, 49 insertions, 0 deletions
diff --git a/simpleperf/gtest_main.cpp b/simpleperf/gtest_main.cpp
index ec4768fc..444a1c2a 100644
--- a/simpleperf/gtest_main.cpp
+++ b/simpleperf/gtest_main.cpp
@@ -23,6 +23,10 @@
#include <android-base/test_utils.h>
#include <ziparchive/zip_archive.h>
+#if defined(__ANDROID__)
+#include <sys/system_properties.h>
+#endif
+
#include "get_test_data.h"
#include "read_elf.h"
#include "utils.h"
@@ -90,6 +94,44 @@ static bool ExtractTestDataFromElfSection() {
}
return true;
}
+
+#if defined(__ANDROID__)
+class SavedPerfHardenProperty {
+ public:
+ SavedPerfHardenProperty() {
+ __system_property_get("security.perf_harden", prop_value_);
+ if (!android::base::ReadFileToString("/proc/sys/kernel/perf_event_paranoid",
+ &paranoid_value_)) {
+ PLOG(ERROR) << "failed to read /proc/sys/kernel/perf_event_paranoid";
+ }
+ }
+
+ ~SavedPerfHardenProperty() {
+ if (strlen(prop_value_) != 0) {
+ if (__system_property_set("security.perf_harden", prop_value_) != 0) {
+ PLOG(ERROR) << "failed to set security.perf_harden";
+ return;
+ }
+ // Sleep one second to wait for security.perf_harden changing
+ // /proc/sys/kernel/perf_event_paranoid.
+ sleep(1);
+ std::string paranoid_value;
+ if (!android::base::ReadFileToString("/proc/sys/kernel/perf_event_paranoid",
+ &paranoid_value)) {
+ PLOG(ERROR) << "failed to read /proc/sys/kernel/perf_event_paranoid";
+ return;
+ }
+ if (paranoid_value_ != paranoid_value) {
+ LOG(ERROR) << "failed to restore /proc/sys/kernel/perf_event_paranoid";
+ }
+ }
+ }
+
+ private:
+ char prop_value_[PROP_VALUE_MAX];
+ std::string paranoid_value_;
+};
+#endif // defined(__ANDROID__)
#endif // defined(IN_CTS_TEST)
int main(int argc, char** argv) {
@@ -126,6 +168,13 @@ int main(int argc, char** argv) {
return 1;
}
}
+
+#if defined(__ANDROID__)
+ // A cts test PerfEventParanoidTest.java is testing if
+ // /proc/sys/kernel/perf_event_paranoid is 3, so restore perf_harden
+ // value after current test to not break that test.
+ SavedPerfHardenProperty saved_perf_harden;
+#endif
#endif
if (!::testing::GTEST_FLAG(list_tests) && testdata_dir.empty()) {
printf("Usage: %s -t <testdata_dir>\n", argv[0]);