15a6bfca1638760b87cf64c5ffb48ff3557cc0563Jeff Sharkey/* 25a6bfca1638760b87cf64c5ffb48ff3557cc0563Jeff Sharkey * Copyright (C) 2015 The Android Open Source Project 35a6bfca1638760b87cf64c5ffb48ff3557cc0563Jeff Sharkey * 45a6bfca1638760b87cf64c5ffb48ff3557cc0563Jeff Sharkey * Licensed under the Apache License, Version 2.0 (the "License"); 55a6bfca1638760b87cf64c5ffb48ff3557cc0563Jeff Sharkey * you may not use this file except in compliance with the License. 65a6bfca1638760b87cf64c5ffb48ff3557cc0563Jeff Sharkey * You may obtain a copy of the License at 75a6bfca1638760b87cf64c5ffb48ff3557cc0563Jeff Sharkey * 85a6bfca1638760b87cf64c5ffb48ff3557cc0563Jeff Sharkey * http://www.apache.org/licenses/LICENSE-2.0 95a6bfca1638760b87cf64c5ffb48ff3557cc0563Jeff Sharkey * 105a6bfca1638760b87cf64c5ffb48ff3557cc0563Jeff Sharkey * Unless required by applicable law or agreed to in writing, software 115a6bfca1638760b87cf64c5ffb48ff3557cc0563Jeff Sharkey * distributed under the License is distributed on an "AS IS" BASIS, 125a6bfca1638760b87cf64c5ffb48ff3557cc0563Jeff Sharkey * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 135a6bfca1638760b87cf64c5ffb48ff3557cc0563Jeff Sharkey * See the License for the specific language governing permissions and 145a6bfca1638760b87cf64c5ffb48ff3557cc0563Jeff Sharkey * limitations under the License. 155a6bfca1638760b87cf64c5ffb48ff3557cc0563Jeff Sharkey */ 165a6bfca1638760b87cf64c5ffb48ff3557cc0563Jeff Sharkey 175a6bfca1638760b87cf64c5ffb48ff3557cc0563Jeff Sharkey#include "Benchmark.h" 185a6bfca1638760b87cf64c5ffb48ff3557cc0563Jeff Sharkey#include "BenchmarkGen.h" 195a6bfca1638760b87cf64c5ffb48ff3557cc0563Jeff Sharkey#include "VolumeManager.h" 205a6bfca1638760b87cf64c5ffb48ff3557cc0563Jeff Sharkey#include "ResponseCode.h" 215a6bfca1638760b87cf64c5ffb48ff3557cc0563Jeff Sharkey 227e128fbe212c64492afa98bfd6d7fab6f1956831Elliott Hughes#include <android-base/file.h> 237e128fbe212c64492afa98bfd6d7fab6f1956831Elliott Hughes#include <android-base/logging.h> 245a6bfca1638760b87cf64c5ffb48ff3557cc0563Jeff Sharkey#include <cutils/iosched_policy.h> 25c86ab6f538bec63638c168d6c843fe7cf73add3bJeff Sharkey#include <private/android_filesystem_config.h> 265a6bfca1638760b87cf64c5ffb48ff3557cc0563Jeff Sharkey 275a6bfca1638760b87cf64c5ffb48ff3557cc0563Jeff Sharkey#include <sys/time.h> 285a6bfca1638760b87cf64c5ffb48ff3557cc0563Jeff Sharkey#include <sys/resource.h> 29721e5807ed28c7630c0359212cdc0544a9918aa1Jeff Sharkey#include <unistd.h> 305a6bfca1638760b87cf64c5ffb48ff3557cc0563Jeff Sharkey 3181f55c6dc1a14ed68e404fa3a2c244dd343e4990Jeff Sharkey#define ENABLE_DROP_CACHES 1 3281f55c6dc1a14ed68e404fa3a2c244dd343e4990Jeff Sharkey 335a6bfca1638760b87cf64c5ffb48ff3557cc0563Jeff Sharkeyusing android::base::ReadFileToString; 345a6bfca1638760b87cf64c5ffb48ff3557cc0563Jeff Sharkeyusing android::base::WriteStringToFile; 355a6bfca1638760b87cf64c5ffb48ff3557cc0563Jeff Sharkey 365a6bfca1638760b87cf64c5ffb48ff3557cc0563Jeff Sharkeynamespace android { 375a6bfca1638760b87cf64c5ffb48ff3557cc0563Jeff Sharkeynamespace vold { 385a6bfca1638760b87cf64c5ffb48ff3557cc0563Jeff Sharkey 39c86ab6f538bec63638c168d6c843fe7cf73add3bJeff Sharkeystatic void notifyResult(const std::string& path, int64_t create_d, 40c86ab6f538bec63638c168d6c843fe7cf73add3bJeff Sharkey int64_t drop_d, int64_t run_d, int64_t destroy_d) { 41c86ab6f538bec63638c168d6c843fe7cf73add3bJeff Sharkey std::string res(path + 42c86ab6f538bec63638c168d6c843fe7cf73add3bJeff Sharkey + " " + BenchmarkIdent() 43c86ab6f538bec63638c168d6c843fe7cf73add3bJeff Sharkey + " " + std::to_string(create_d) 44c86ab6f538bec63638c168d6c843fe7cf73add3bJeff Sharkey + " " + std::to_string(drop_d) 45c86ab6f538bec63638c168d6c843fe7cf73add3bJeff Sharkey + " " + std::to_string(run_d) 46c86ab6f538bec63638c168d6c843fe7cf73add3bJeff Sharkey + " " + std::to_string(destroy_d)); 47c86ab6f538bec63638c168d6c843fe7cf73add3bJeff Sharkey VolumeManager::Instance()->getBroadcaster()->sendBroadcast( 48c86ab6f538bec63638c168d6c843fe7cf73add3bJeff Sharkey ResponseCode::BenchmarkResult, res.c_str(), false); 495a6bfca1638760b87cf64c5ffb48ff3557cc0563Jeff Sharkey} 505a6bfca1638760b87cf64c5ffb48ff3557cc0563Jeff Sharkey 51c86ab6f538bec63638c168d6c843fe7cf73add3bJeff Sharkeystatic nsecs_t benchmark(const std::string& path) { 525a6bfca1638760b87cf64c5ffb48ff3557cc0563Jeff Sharkey errno = 0; 535a6bfca1638760b87cf64c5ffb48ff3557cc0563Jeff Sharkey int orig_prio = getpriority(PRIO_PROCESS, 0); 545a6bfca1638760b87cf64c5ffb48ff3557cc0563Jeff Sharkey if (errno != 0) { 555a6bfca1638760b87cf64c5ffb48ff3557cc0563Jeff Sharkey PLOG(ERROR) << "Failed to getpriority"; 565a6bfca1638760b87cf64c5ffb48ff3557cc0563Jeff Sharkey return -1; 575a6bfca1638760b87cf64c5ffb48ff3557cc0563Jeff Sharkey } 585a6bfca1638760b87cf64c5ffb48ff3557cc0563Jeff Sharkey if (setpriority(PRIO_PROCESS, 0, -10) != 0) { 595a6bfca1638760b87cf64c5ffb48ff3557cc0563Jeff Sharkey PLOG(ERROR) << "Failed to setpriority"; 605a6bfca1638760b87cf64c5ffb48ff3557cc0563Jeff Sharkey return -1; 615a6bfca1638760b87cf64c5ffb48ff3557cc0563Jeff Sharkey } 625a6bfca1638760b87cf64c5ffb48ff3557cc0563Jeff Sharkey 635a6bfca1638760b87cf64c5ffb48ff3557cc0563Jeff Sharkey IoSchedClass orig_clazz = IoSchedClass_NONE; 645a6bfca1638760b87cf64c5ffb48ff3557cc0563Jeff Sharkey int orig_ioprio = 0; 655a6bfca1638760b87cf64c5ffb48ff3557cc0563Jeff Sharkey if (android_get_ioprio(0, &orig_clazz, &orig_ioprio)) { 665a6bfca1638760b87cf64c5ffb48ff3557cc0563Jeff Sharkey PLOG(ERROR) << "Failed to android_get_ioprio"; 675a6bfca1638760b87cf64c5ffb48ff3557cc0563Jeff Sharkey return -1; 685a6bfca1638760b87cf64c5ffb48ff3557cc0563Jeff Sharkey } 695a6bfca1638760b87cf64c5ffb48ff3557cc0563Jeff Sharkey if (android_set_ioprio(0, IoSchedClass_RT, 0)) { 705a6bfca1638760b87cf64c5ffb48ff3557cc0563Jeff Sharkey PLOG(ERROR) << "Failed to android_set_ioprio"; 715a6bfca1638760b87cf64c5ffb48ff3557cc0563Jeff Sharkey return -1; 725a6bfca1638760b87cf64c5ffb48ff3557cc0563Jeff Sharkey } 735a6bfca1638760b87cf64c5ffb48ff3557cc0563Jeff Sharkey 745a6bfca1638760b87cf64c5ffb48ff3557cc0563Jeff Sharkey char orig_cwd[PATH_MAX]; 755a6bfca1638760b87cf64c5ffb48ff3557cc0563Jeff Sharkey if (getcwd(orig_cwd, PATH_MAX) == NULL) { 765a6bfca1638760b87cf64c5ffb48ff3557cc0563Jeff Sharkey PLOG(ERROR) << "Failed getcwd"; 775a6bfca1638760b87cf64c5ffb48ff3557cc0563Jeff Sharkey return -1; 785a6bfca1638760b87cf64c5ffb48ff3557cc0563Jeff Sharkey } 795a6bfca1638760b87cf64c5ffb48ff3557cc0563Jeff Sharkey if (chdir(path.c_str()) != 0) { 805a6bfca1638760b87cf64c5ffb48ff3557cc0563Jeff Sharkey PLOG(ERROR) << "Failed chdir"; 815a6bfca1638760b87cf64c5ffb48ff3557cc0563Jeff Sharkey return -1; 825a6bfca1638760b87cf64c5ffb48ff3557cc0563Jeff Sharkey } 835a6bfca1638760b87cf64c5ffb48ff3557cc0563Jeff Sharkey 84721e5807ed28c7630c0359212cdc0544a9918aa1Jeff Sharkey sync(); 85721e5807ed28c7630c0359212cdc0544a9918aa1Jeff Sharkey 865a6bfca1638760b87cf64c5ffb48ff3557cc0563Jeff Sharkey LOG(INFO) << "Benchmarking " << path; 875a6bfca1638760b87cf64c5ffb48ff3557cc0563Jeff Sharkey nsecs_t start = systemTime(SYSTEM_TIME_BOOTTIME); 885a6bfca1638760b87cf64c5ffb48ff3557cc0563Jeff Sharkey 895a6bfca1638760b87cf64c5ffb48ff3557cc0563Jeff Sharkey BenchmarkCreate(); 90721e5807ed28c7630c0359212cdc0544a9918aa1Jeff Sharkey sync(); 915a6bfca1638760b87cf64c5ffb48ff3557cc0563Jeff Sharkey nsecs_t create = systemTime(SYSTEM_TIME_BOOTTIME); 925a6bfca1638760b87cf64c5ffb48ff3557cc0563Jeff Sharkey 9381f55c6dc1a14ed68e404fa3a2c244dd343e4990Jeff Sharkey#if ENABLE_DROP_CACHES 94c86ab6f538bec63638c168d6c843fe7cf73add3bJeff Sharkey LOG(VERBOSE) << "Before drop_caches"; 955a6bfca1638760b87cf64c5ffb48ff3557cc0563Jeff Sharkey if (!WriteStringToFile("3", "/proc/sys/vm/drop_caches")) { 965a6bfca1638760b87cf64c5ffb48ff3557cc0563Jeff Sharkey PLOG(ERROR) << "Failed to drop_caches"; 975a6bfca1638760b87cf64c5ffb48ff3557cc0563Jeff Sharkey } 98c86ab6f538bec63638c168d6c843fe7cf73add3bJeff Sharkey LOG(VERBOSE) << "After drop_caches"; 9981f55c6dc1a14ed68e404fa3a2c244dd343e4990Jeff Sharkey#endif 1005a6bfca1638760b87cf64c5ffb48ff3557cc0563Jeff Sharkey nsecs_t drop = systemTime(SYSTEM_TIME_BOOTTIME); 1015a6bfca1638760b87cf64c5ffb48ff3557cc0563Jeff Sharkey 1025a6bfca1638760b87cf64c5ffb48ff3557cc0563Jeff Sharkey BenchmarkRun(); 103721e5807ed28c7630c0359212cdc0544a9918aa1Jeff Sharkey sync(); 1045a6bfca1638760b87cf64c5ffb48ff3557cc0563Jeff Sharkey nsecs_t run = systemTime(SYSTEM_TIME_BOOTTIME); 1055a6bfca1638760b87cf64c5ffb48ff3557cc0563Jeff Sharkey 1065a6bfca1638760b87cf64c5ffb48ff3557cc0563Jeff Sharkey BenchmarkDestroy(); 107721e5807ed28c7630c0359212cdc0544a9918aa1Jeff Sharkey sync(); 1085a6bfca1638760b87cf64c5ffb48ff3557cc0563Jeff Sharkey nsecs_t destroy = systemTime(SYSTEM_TIME_BOOTTIME); 1095a6bfca1638760b87cf64c5ffb48ff3557cc0563Jeff Sharkey 110c86ab6f538bec63638c168d6c843fe7cf73add3bJeff Sharkey if (chdir(orig_cwd) != 0) { 111c86ab6f538bec63638c168d6c843fe7cf73add3bJeff Sharkey PLOG(ERROR) << "Failed to chdir"; 112c86ab6f538bec63638c168d6c843fe7cf73add3bJeff Sharkey } 113c86ab6f538bec63638c168d6c843fe7cf73add3bJeff Sharkey if (android_set_ioprio(0, orig_clazz, orig_ioprio)) { 114c86ab6f538bec63638c168d6c843fe7cf73add3bJeff Sharkey PLOG(ERROR) << "Failed to android_set_ioprio"; 115c86ab6f538bec63638c168d6c843fe7cf73add3bJeff Sharkey } 116c86ab6f538bec63638c168d6c843fe7cf73add3bJeff Sharkey if (setpriority(PRIO_PROCESS, 0, orig_prio) != 0) { 117c86ab6f538bec63638c168d6c843fe7cf73add3bJeff Sharkey PLOG(ERROR) << "Failed to setpriority"; 118c86ab6f538bec63638c168d6c843fe7cf73add3bJeff Sharkey } 119c86ab6f538bec63638c168d6c843fe7cf73add3bJeff Sharkey 1205a6bfca1638760b87cf64c5ffb48ff3557cc0563Jeff Sharkey nsecs_t create_d = create - start; 1215a6bfca1638760b87cf64c5ffb48ff3557cc0563Jeff Sharkey nsecs_t drop_d = drop - create; 1225a6bfca1638760b87cf64c5ffb48ff3557cc0563Jeff Sharkey nsecs_t run_d = run - drop; 1235a6bfca1638760b87cf64c5ffb48ff3557cc0563Jeff Sharkey nsecs_t destroy_d = destroy - run; 1245a6bfca1638760b87cf64c5ffb48ff3557cc0563Jeff Sharkey 1255a6bfca1638760b87cf64c5ffb48ff3557cc0563Jeff Sharkey LOG(INFO) << "create took " << nanoseconds_to_milliseconds(create_d) << "ms"; 1265a6bfca1638760b87cf64c5ffb48ff3557cc0563Jeff Sharkey LOG(INFO) << "drop took " << nanoseconds_to_milliseconds(drop_d) << "ms"; 1275a6bfca1638760b87cf64c5ffb48ff3557cc0563Jeff Sharkey LOG(INFO) << "run took " << nanoseconds_to_milliseconds(run_d) << "ms"; 1285a6bfca1638760b87cf64c5ffb48ff3557cc0563Jeff Sharkey LOG(INFO) << "destroy took " << nanoseconds_to_milliseconds(destroy_d) << "ms"; 1295a6bfca1638760b87cf64c5ffb48ff3557cc0563Jeff Sharkey 130c86ab6f538bec63638c168d6c843fe7cf73add3bJeff Sharkey notifyResult(path, create_d, drop_d, run_d, destroy_d); 1315a6bfca1638760b87cf64c5ffb48ff3557cc0563Jeff Sharkey 132c86ab6f538bec63638c168d6c843fe7cf73add3bJeff Sharkey return run_d; 133c86ab6f538bec63638c168d6c843fe7cf73add3bJeff Sharkey} 1345a6bfca1638760b87cf64c5ffb48ff3557cc0563Jeff Sharkey 135c86ab6f538bec63638c168d6c843fe7cf73add3bJeff Sharkeynsecs_t BenchmarkPrivate(const std::string& path) { 136c86ab6f538bec63638c168d6c843fe7cf73add3bJeff Sharkey std::string benchPath(path); 137c86ab6f538bec63638c168d6c843fe7cf73add3bJeff Sharkey benchPath += "/misc"; 138c86ab6f538bec63638c168d6c843fe7cf73add3bJeff Sharkey if (android::vold::PrepareDir(benchPath, 01771, AID_SYSTEM, AID_MISC)) { 139c86ab6f538bec63638c168d6c843fe7cf73add3bJeff Sharkey return -1; 1405a6bfca1638760b87cf64c5ffb48ff3557cc0563Jeff Sharkey } 141c86ab6f538bec63638c168d6c843fe7cf73add3bJeff Sharkey benchPath += "/vold"; 142c86ab6f538bec63638c168d6c843fe7cf73add3bJeff Sharkey if (android::vold::PrepareDir(benchPath, 0700, AID_ROOT, AID_ROOT)) { 143c86ab6f538bec63638c168d6c843fe7cf73add3bJeff Sharkey return -1; 1445a6bfca1638760b87cf64c5ffb48ff3557cc0563Jeff Sharkey } 145c86ab6f538bec63638c168d6c843fe7cf73add3bJeff Sharkey benchPath += "/bench"; 146c86ab6f538bec63638c168d6c843fe7cf73add3bJeff Sharkey if (android::vold::PrepareDir(benchPath, 0700, AID_ROOT, AID_ROOT)) { 147c86ab6f538bec63638c168d6c843fe7cf73add3bJeff Sharkey return -1; 1485a6bfca1638760b87cf64c5ffb48ff3557cc0563Jeff Sharkey } 149c86ab6f538bec63638c168d6c843fe7cf73add3bJeff Sharkey return benchmark(benchPath); 1505a6bfca1638760b87cf64c5ffb48ff3557cc0563Jeff Sharkey} 1515a6bfca1638760b87cf64c5ffb48ff3557cc0563Jeff Sharkey 1525a6bfca1638760b87cf64c5ffb48ff3557cc0563Jeff Sharkey} // namespace vold 1535a6bfca1638760b87cf64c5ffb48ff3557cc0563Jeff Sharkey} // namespace android 154