diff options
author | Yabin Cui <yabinc@google.com> | 2016-06-10 12:15:11 -0700 |
---|---|---|
committer | Yabin Cui <yabinc@google.com> | 2016-06-10 18:55:29 -0700 |
commit | 97ad035360ebcc3a4e34edd1b09fd628c8660537 (patch) | |
tree | 83afff22e324e9ed29bd1f37d0f4384728bf4696 | |
parent | 600c6341e62c165c60f526174d965cc7f1b30c38 (diff) | |
download | extras-97ad035360ebcc3a4e34edd1b09fd628c8660537.tar.gz |
simpleperf: restore perf_harden after simpleperf cts test.
Bug: 29264324
Change-Id: Ia78ef924f049630968d222729cf3c1f378105b8a
(cherry picked from commit 5896132e00c7e49d2468d7ebd5372654df29b872)
-rw-r--r-- | simpleperf/gtest_main.cpp | 49 |
1 files changed, 49 insertions, 0 deletions
diff --git a/simpleperf/gtest_main.cpp b/simpleperf/gtest_main.cpp index c9a066ed..b56da277 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", + ¶noid_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", + ¶noid_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]); |