162cb372279f0237f759d3fe8a7e03d8272ba327fynwang/* 262cb372279f0237f759d3fe8a7e03d8272ba327fynwang * Copyright (C) 2016 The Android Open Source Project 362cb372279f0237f759d3fe8a7e03d8272ba327fynwang * 462cb372279f0237f759d3fe8a7e03d8272ba327fynwang * Licensed under the Apache License, Version 2.0 (the "License"); 562cb372279f0237f759d3fe8a7e03d8272ba327fynwang * you may not use this file except in compliance with the License. 662cb372279f0237f759d3fe8a7e03d8272ba327fynwang * You may obtain a copy of the License at 762cb372279f0237f759d3fe8a7e03d8272ba327fynwang * 862cb372279f0237f759d3fe8a7e03d8272ba327fynwang * http://www.apache.org/licenses/LICENSE-2.0 962cb372279f0237f759d3fe8a7e03d8272ba327fynwang * 1062cb372279f0237f759d3fe8a7e03d8272ba327fynwang * Unless required by applicable law or agreed to in writing, software 1162cb372279f0237f759d3fe8a7e03d8272ba327fynwang * distributed under the License is distributed on an "AS IS" BASIS, 1262cb372279f0237f759d3fe8a7e03d8272ba327fynwang * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1362cb372279f0237f759d3fe8a7e03d8272ba327fynwang * See the License for the specific language governing permissions and 1462cb372279f0237f759d3fe8a7e03d8272ba327fynwang * limitations under the License. 1562cb372279f0237f759d3fe8a7e03d8272ba327fynwang */ 1662cb372279f0237f759d3fe8a7e03d8272ba327fynwang 1762cb372279f0237f759d3fe8a7e03d8272ba327fynwang#define LOG_TAG "storaged" 1862cb372279f0237f759d3fe8a7e03d8272ba327fynwang 1962cb372279f0237f759d3fe8a7e03d8272ba327fynwang#include <stdlib.h> 2062cb372279f0237f759d3fe8a7e03d8272ba327fynwang#include <time.h> 2162cb372279f0237f759d3fe8a7e03d8272ba327fynwang#include <unistd.h> 2262cb372279f0237f759d3fe8a7e03d8272ba327fynwang 2362cb372279f0237f759d3fe8a7e03d8272ba327fynwang#include <android-base/logging.h> 245b962c6dbd305946ece05ffbd81d29c2ea211673Jin Qian#include <batteryservice/BatteryServiceConstants.h> 255b962c6dbd305946ece05ffbd81d29c2ea211673Jin Qian#include <batteryservice/IBatteryPropertiesRegistrar.h> 2626b2be0d3036df04853f908ffd3d776db2b98ac2Jin Qian#include <binder/IPCThreadState.h> 275b962c6dbd305946ece05ffbd81d29c2ea211673Jin Qian#include <binder/IServiceManager.h> 283790f5bfafc52ca881b9350b922ffe94e6a537bbJin Qian#include <cutils/properties.h> 29f42d7c833c4e719a5a5e2a5661ef21abf927a885Jin Qian#include <log/log.h> 3062cb372279f0237f759d3fe8a7e03d8272ba327fynwang 3162cb372279f0237f759d3fe8a7e03d8272ba327fynwang#include <storaged.h> 3262cb372279f0237f759d3fe8a7e03d8272ba327fynwang#include <storaged_utils.h> 3362cb372279f0237f759d3fe8a7e03d8272ba327fynwang 3462cb372279f0237f759d3fe8a7e03d8272ba327fynwang/* disk_stats_publisher */ 3562cb372279f0237f759d3fe8a7e03d8272ba327fynwangvoid disk_stats_publisher::publish(void) { 3662cb372279f0237f759d3fe8a7e03d8272ba327fynwang // Logging 3762cb372279f0237f759d3fe8a7e03d8272ba327fynwang struct disk_perf perf = get_disk_perf(&mAccumulate); 3827506fa41f7b07714b49eb3d36760a2f8c0708d0Jin Qian log_debug_disk_perf(&perf, "regular"); 3962cb372279f0237f759d3fe8a7e03d8272ba327fynwang log_event_disk_stats(&mAccumulate, "regular"); 4062cb372279f0237f759d3fe8a7e03d8272ba327fynwang // Reset global structures 4162cb372279f0237f759d3fe8a7e03d8272ba327fynwang memset(&mAccumulate, 0, sizeof(struct disk_stats)); 4262cb372279f0237f759d3fe8a7e03d8272ba327fynwang} 4362cb372279f0237f759d3fe8a7e03d8272ba327fynwang 4462cb372279f0237f759d3fe8a7e03d8272ba327fynwangvoid disk_stats_publisher::update(void) { 4562cb372279f0237f759d3fe8a7e03d8272ba327fynwang struct disk_stats curr; 4662cb372279f0237f759d3fe8a7e03d8272ba327fynwang if (parse_disk_stats(DISK_STATS_PATH, &curr)) { 4762cb372279f0237f759d3fe8a7e03d8272ba327fynwang struct disk_stats inc = get_inc_disk_stats(&mPrevious, &curr); 4862cb372279f0237f759d3fe8a7e03d8272ba327fynwang add_disk_stats(&inc, &mAccumulate); 49af49d9756f8b0e29be517101c83c696031cd1dd9ynwang#ifdef DEBUG 5062cb372279f0237f759d3fe8a7e03d8272ba327fynwang// log_kernel_disk_stats(&mPrevious, "prev stats"); 5162cb372279f0237f759d3fe8a7e03d8272ba327fynwang// log_kernel_disk_stats(&curr, "curr stats"); 5262cb372279f0237f759d3fe8a7e03d8272ba327fynwang// log_kernel_disk_stats(&inc, "inc stats"); 5362cb372279f0237f759d3fe8a7e03d8272ba327fynwang// log_kernel_disk_stats(&mAccumulate, "accumulated stats"); 54af49d9756f8b0e29be517101c83c696031cd1dd9ynwang#endif 5562cb372279f0237f759d3fe8a7e03d8272ba327fynwang mPrevious = curr; 5662cb372279f0237f759d3fe8a7e03d8272ba327fynwang } 5762cb372279f0237f759d3fe8a7e03d8272ba327fynwang} 5862cb372279f0237f759d3fe8a7e03d8272ba327fynwang 5962cb372279f0237f759d3fe8a7e03d8272ba327fynwang/* disk_stats_monitor */ 6062cb372279f0237f759d3fe8a7e03d8272ba327fynwangvoid disk_stats_monitor::update_mean() { 6162cb372279f0237f759d3fe8a7e03d8272ba327fynwang CHECK(mValid); 6262cb372279f0237f759d3fe8a7e03d8272ba327fynwang mMean.read_perf = (uint32_t)mStats.read_perf.get_mean(); 6362cb372279f0237f759d3fe8a7e03d8272ba327fynwang mMean.read_ios = (uint32_t)mStats.read_ios.get_mean(); 6462cb372279f0237f759d3fe8a7e03d8272ba327fynwang mMean.write_perf = (uint32_t)mStats.write_perf.get_mean(); 6562cb372279f0237f759d3fe8a7e03d8272ba327fynwang mMean.write_ios = (uint32_t)mStats.write_ios.get_mean(); 6662cb372279f0237f759d3fe8a7e03d8272ba327fynwang mMean.queue = (uint32_t)mStats.queue.get_mean(); 6762cb372279f0237f759d3fe8a7e03d8272ba327fynwang} 6862cb372279f0237f759d3fe8a7e03d8272ba327fynwang 6962cb372279f0237f759d3fe8a7e03d8272ba327fynwangvoid disk_stats_monitor::update_std() { 7062cb372279f0237f759d3fe8a7e03d8272ba327fynwang CHECK(mValid); 7162cb372279f0237f759d3fe8a7e03d8272ba327fynwang mStd.read_perf = (uint32_t)mStats.read_perf.get_std(); 7262cb372279f0237f759d3fe8a7e03d8272ba327fynwang mStd.read_ios = (uint32_t)mStats.read_ios.get_std(); 7362cb372279f0237f759d3fe8a7e03d8272ba327fynwang mStd.write_perf = (uint32_t)mStats.write_perf.get_std(); 7462cb372279f0237f759d3fe8a7e03d8272ba327fynwang mStd.write_ios = (uint32_t)mStats.write_ios.get_std(); 7562cb372279f0237f759d3fe8a7e03d8272ba327fynwang mStd.queue = (uint32_t)mStats.queue.get_std(); 7662cb372279f0237f759d3fe8a7e03d8272ba327fynwang} 7762cb372279f0237f759d3fe8a7e03d8272ba327fynwang 7862cb372279f0237f759d3fe8a7e03d8272ba327fynwangvoid disk_stats_monitor::add(struct disk_perf* perf) { 7962cb372279f0237f759d3fe8a7e03d8272ba327fynwang mStats.read_perf.add(perf->read_perf); 8062cb372279f0237f759d3fe8a7e03d8272ba327fynwang mStats.read_ios.add(perf->read_ios); 8162cb372279f0237f759d3fe8a7e03d8272ba327fynwang mStats.write_perf.add(perf->write_perf); 8262cb372279f0237f759d3fe8a7e03d8272ba327fynwang mStats.write_ios.add(perf->write_ios); 8362cb372279f0237f759d3fe8a7e03d8272ba327fynwang mStats.queue.add(perf->queue); 8462cb372279f0237f759d3fe8a7e03d8272ba327fynwang} 8562cb372279f0237f759d3fe8a7e03d8272ba327fynwang 8662cb372279f0237f759d3fe8a7e03d8272ba327fynwangvoid disk_stats_monitor::evict(struct disk_perf* perf) { 8762cb372279f0237f759d3fe8a7e03d8272ba327fynwang mStats.read_perf.evict(perf->read_perf); 8862cb372279f0237f759d3fe8a7e03d8272ba327fynwang mStats.read_ios.evict(perf->read_ios); 8962cb372279f0237f759d3fe8a7e03d8272ba327fynwang mStats.write_perf.evict(perf->write_perf); 9062cb372279f0237f759d3fe8a7e03d8272ba327fynwang mStats.write_ios.evict(perf->write_ios); 9162cb372279f0237f759d3fe8a7e03d8272ba327fynwang mStats.queue.evict(perf->queue); 9262cb372279f0237f759d3fe8a7e03d8272ba327fynwang} 9362cb372279f0237f759d3fe8a7e03d8272ba327fynwang 9462cb372279f0237f759d3fe8a7e03d8272ba327fynwangbool disk_stats_monitor::detect(struct disk_perf* perf) { 9562cb372279f0237f759d3fe8a7e03d8272ba327fynwang return ((double)perf->queue >= (double)mMean.queue + mSigma * (double)mStd.queue) && 9662cb372279f0237f759d3fe8a7e03d8272ba327fynwang ((double)perf->read_perf < (double)mMean.read_perf - mSigma * (double)mStd.read_perf) && 9762cb372279f0237f759d3fe8a7e03d8272ba327fynwang ((double)perf->write_perf < (double)mMean.write_perf - mSigma * (double)mStd.write_perf); 9862cb372279f0237f759d3fe8a7e03d8272ba327fynwang} 9962cb372279f0237f759d3fe8a7e03d8272ba327fynwang 10062cb372279f0237f759d3fe8a7e03d8272ba327fynwangvoid disk_stats_monitor::update(struct disk_stats* stats) { 10162cb372279f0237f759d3fe8a7e03d8272ba327fynwang struct disk_stats inc = get_inc_disk_stats(&mPrevious, stats); 10262cb372279f0237f759d3fe8a7e03d8272ba327fynwang struct disk_perf perf = get_disk_perf(&inc); 10362cb372279f0237f759d3fe8a7e03d8272ba327fynwang // Update internal data structures 10462cb372279f0237f759d3fe8a7e03d8272ba327fynwang if (LIKELY(mValid)) { 10562cb372279f0237f759d3fe8a7e03d8272ba327fynwang CHECK_EQ(mBuffer.size(), mWindow); 10662cb372279f0237f759d3fe8a7e03d8272ba327fynwang 10762cb372279f0237f759d3fe8a7e03d8272ba327fynwang if (UNLIKELY(detect(&perf))) { 10862cb372279f0237f759d3fe8a7e03d8272ba327fynwang mStall = true; 10962cb372279f0237f759d3fe8a7e03d8272ba327fynwang add_disk_stats(&inc, &mAccumulate); 11027506fa41f7b07714b49eb3d36760a2f8c0708d0Jin Qian log_debug_disk_perf(&mMean, "stalled_mean"); 11127506fa41f7b07714b49eb3d36760a2f8c0708d0Jin Qian log_debug_disk_perf(&mStd, "stalled_std"); 11262cb372279f0237f759d3fe8a7e03d8272ba327fynwang } else { 11362cb372279f0237f759d3fe8a7e03d8272ba327fynwang if (mStall) { 11462cb372279f0237f759d3fe8a7e03d8272ba327fynwang struct disk_perf acc_perf = get_disk_perf(&mAccumulate); 11527506fa41f7b07714b49eb3d36760a2f8c0708d0Jin Qian log_debug_disk_perf(&acc_perf, "stalled"); 11662cb372279f0237f759d3fe8a7e03d8272ba327fynwang log_event_disk_stats(&mAccumulate, "stalled"); 11762cb372279f0237f759d3fe8a7e03d8272ba327fynwang mStall = false; 11862cb372279f0237f759d3fe8a7e03d8272ba327fynwang memset(&mAccumulate, 0, sizeof(mAccumulate)); 11962cb372279f0237f759d3fe8a7e03d8272ba327fynwang } 12062cb372279f0237f759d3fe8a7e03d8272ba327fynwang } 12162cb372279f0237f759d3fe8a7e03d8272ba327fynwang 12262cb372279f0237f759d3fe8a7e03d8272ba327fynwang evict(&mBuffer.front()); 12362cb372279f0237f759d3fe8a7e03d8272ba327fynwang mBuffer.pop(); 12462cb372279f0237f759d3fe8a7e03d8272ba327fynwang add(&perf); 12562cb372279f0237f759d3fe8a7e03d8272ba327fynwang mBuffer.push(perf); 12662cb372279f0237f759d3fe8a7e03d8272ba327fynwang 12762cb372279f0237f759d3fe8a7e03d8272ba327fynwang update_mean(); 12862cb372279f0237f759d3fe8a7e03d8272ba327fynwang update_std(); 12962cb372279f0237f759d3fe8a7e03d8272ba327fynwang 13062cb372279f0237f759d3fe8a7e03d8272ba327fynwang } else { /* mValid == false */ 13162cb372279f0237f759d3fe8a7e03d8272ba327fynwang CHECK_LT(mBuffer.size(), mWindow); 13262cb372279f0237f759d3fe8a7e03d8272ba327fynwang add(&perf); 13362cb372279f0237f759d3fe8a7e03d8272ba327fynwang mBuffer.push(perf); 13462cb372279f0237f759d3fe8a7e03d8272ba327fynwang if (mBuffer.size() == mWindow) { 13562cb372279f0237f759d3fe8a7e03d8272ba327fynwang mValid = true; 13662cb372279f0237f759d3fe8a7e03d8272ba327fynwang update_mean(); 13762cb372279f0237f759d3fe8a7e03d8272ba327fynwang update_std(); 13862cb372279f0237f759d3fe8a7e03d8272ba327fynwang } 13962cb372279f0237f759d3fe8a7e03d8272ba327fynwang } 14062cb372279f0237f759d3fe8a7e03d8272ba327fynwang 14162cb372279f0237f759d3fe8a7e03d8272ba327fynwang mPrevious = *stats; 14262cb372279f0237f759d3fe8a7e03d8272ba327fynwang} 14362cb372279f0237f759d3fe8a7e03d8272ba327fynwang 14462cb372279f0237f759d3fe8a7e03d8272ba327fynwangvoid disk_stats_monitor::update(void) { 14562cb372279f0237f759d3fe8a7e03d8272ba327fynwang struct disk_stats curr; 14662cb372279f0237f759d3fe8a7e03d8272ba327fynwang if (LIKELY(parse_disk_stats(DISK_STATS_PATH, &curr))) { 14762cb372279f0237f759d3fe8a7e03d8272ba327fynwang update(&curr); 14862cb372279f0237f759d3fe8a7e03d8272ba327fynwang } 14962cb372279f0237f759d3fe8a7e03d8272ba327fynwang} 15062cb372279f0237f759d3fe8a7e03d8272ba327fynwang 1515b962c6dbd305946ece05ffbd81d29c2ea211673Jin Qianstatic sp<IBatteryPropertiesRegistrar> get_battery_properties_service() { 1525b962c6dbd305946ece05ffbd81d29c2ea211673Jin Qian sp<IServiceManager> sm = defaultServiceManager(); 1535b962c6dbd305946ece05ffbd81d29c2ea211673Jin Qian if (sm == NULL) return NULL; 1545b962c6dbd305946ece05ffbd81d29c2ea211673Jin Qian 1555b962c6dbd305946ece05ffbd81d29c2ea211673Jin Qian sp<IBinder> binder = sm->getService(String16("batteryproperties")); 1565b962c6dbd305946ece05ffbd81d29c2ea211673Jin Qian if (binder == NULL) return NULL; 1575b962c6dbd305946ece05ffbd81d29c2ea211673Jin Qian 1585b962c6dbd305946ece05ffbd81d29c2ea211673Jin Qian sp<IBatteryPropertiesRegistrar> battery_properties = 1595b962c6dbd305946ece05ffbd81d29c2ea211673Jin Qian interface_cast<IBatteryPropertiesRegistrar>(binder); 1605b962c6dbd305946ece05ffbd81d29c2ea211673Jin Qian 1615b962c6dbd305946ece05ffbd81d29c2ea211673Jin Qian return battery_properties; 1625b962c6dbd305946ece05ffbd81d29c2ea211673Jin Qian} 1635b962c6dbd305946ece05ffbd81d29c2ea211673Jin Qian 1645b962c6dbd305946ece05ffbd81d29c2ea211673Jin Qianstatic inline charger_stat_t is_charger_on(int64_t prop) { 1655b962c6dbd305946ece05ffbd81d29c2ea211673Jin Qian return (prop == BATTERY_STATUS_CHARGING || prop == BATTERY_STATUS_FULL) ? 1665b962c6dbd305946ece05ffbd81d29c2ea211673Jin Qian CHARGER_ON : CHARGER_OFF; 1675b962c6dbd305946ece05ffbd81d29c2ea211673Jin Qian} 1685b962c6dbd305946ece05ffbd81d29c2ea211673Jin Qian 1695b962c6dbd305946ece05ffbd81d29c2ea211673Jin Qianvoid storaged_t::batteryPropertiesChanged(struct BatteryProperties props) { 1705b962c6dbd305946ece05ffbd81d29c2ea211673Jin Qian mUidm.set_charger_state(is_charger_on(props.batteryStatus)); 1715b962c6dbd305946ece05ffbd81d29c2ea211673Jin Qian} 1725b962c6dbd305946ece05ffbd81d29c2ea211673Jin Qian 1735b962c6dbd305946ece05ffbd81d29c2ea211673Jin Qianvoid storaged_t::init_battery_service() { 174ba27df4d0fe02be6b0f60bfe0a1cf175e4e5aa91Jin Qian if (!mConfig.proc_uid_io_available) 175ba27df4d0fe02be6b0f60bfe0a1cf175e4e5aa91Jin Qian return; 176ba27df4d0fe02be6b0f60bfe0a1cf175e4e5aa91Jin Qian 177566e63da538b627f00e35c5f80b4215534c7d6cbJin Qian battery_properties = get_battery_properties_service(); 1785b962c6dbd305946ece05ffbd81d29c2ea211673Jin Qian if (battery_properties == NULL) { 1795b962c6dbd305946ece05ffbd81d29c2ea211673Jin Qian LOG_TO(SYSTEM, WARNING) << "failed to find batteryproperties service"; 1805b962c6dbd305946ece05ffbd81d29c2ea211673Jin Qian return; 1815b962c6dbd305946ece05ffbd81d29c2ea211673Jin Qian } 1825b962c6dbd305946ece05ffbd81d29c2ea211673Jin Qian 1835b962c6dbd305946ece05ffbd81d29c2ea211673Jin Qian struct BatteryProperty val; 1845b962c6dbd305946ece05ffbd81d29c2ea211673Jin Qian battery_properties->getProperty(BATTERY_PROP_BATTERY_STATUS, &val); 1855b962c6dbd305946ece05ffbd81d29c2ea211673Jin Qian mUidm.init(is_charger_on(val.valueInt64)); 1865b962c6dbd305946ece05ffbd81d29c2ea211673Jin Qian 1875b962c6dbd305946ece05ffbd81d29c2ea211673Jin Qian // register listener after init uid_monitor 1885b962c6dbd305946ece05ffbd81d29c2ea211673Jin Qian battery_properties->registerListener(this); 189566e63da538b627f00e35c5f80b4215534c7d6cbJin Qian IInterface::asBinder(battery_properties)->linkToDeath(this); 190566e63da538b627f00e35c5f80b4215534c7d6cbJin Qian} 191566e63da538b627f00e35c5f80b4215534c7d6cbJin Qian 192566e63da538b627f00e35c5f80b4215534c7d6cbJin Qianvoid storaged_t::binderDied(const wp<IBinder>& who) { 193566e63da538b627f00e35c5f80b4215534c7d6cbJin Qian if (battery_properties != NULL && 194566e63da538b627f00e35c5f80b4215534c7d6cbJin Qian IInterface::asBinder(battery_properties) == who) { 195566e63da538b627f00e35c5f80b4215534c7d6cbJin Qian LOG_TO(SYSTEM, ERROR) << "batteryproperties service died, exiting"; 19626b2be0d3036df04853f908ffd3d776db2b98ac2Jin Qian IPCThreadState::self()->stopProcess(); 197566e63da538b627f00e35c5f80b4215534c7d6cbJin Qian exit(1); 198566e63da538b627f00e35c5f80b4215534c7d6cbJin Qian } else { 199566e63da538b627f00e35c5f80b4215534c7d6cbJin Qian LOG_TO(SYSTEM, ERROR) << "unknown service died"; 200566e63da538b627f00e35c5f80b4215534c7d6cbJin Qian } 2015b962c6dbd305946ece05ffbd81d29c2ea211673Jin Qian} 2025b962c6dbd305946ece05ffbd81d29c2ea211673Jin Qian 2038847c62579282cd67a80d7354ccf26064aaed4e5Jin Qianvoid storaged_t::report_storage_info() { 2048847c62579282cd67a80d7354ccf26064aaed4e5Jin Qian storage_info->report(); 2058847c62579282cd67a80d7354ccf26064aaed4e5Jin Qian} 2068847c62579282cd67a80d7354ccf26064aaed4e5Jin Qian 20762cb372279f0237f759d3fe8a7e03d8272ba327fynwang/* storaged_t */ 20862cb372279f0237f759d3fe8a7e03d8272ba327fynwangstoraged_t::storaged_t(void) { 20962cb372279f0237f759d3fe8a7e03d8272ba327fynwang if (access(MMC_DISK_STATS_PATH, R_OK) < 0 && access(SDA_DISK_STATS_PATH, R_OK) < 0) { 21062cb372279f0237f759d3fe8a7e03d8272ba327fynwang mConfig.diskstats_available = false; 21162cb372279f0237f759d3fe8a7e03d8272ba327fynwang } else { 21262cb372279f0237f759d3fe8a7e03d8272ba327fynwang mConfig.diskstats_available = true; 21362cb372279f0237f759d3fe8a7e03d8272ba327fynwang } 21462cb372279f0237f759d3fe8a7e03d8272ba327fynwang 215bcd6e3b9d92b2eea3b054372c9adf00a1e6235bcJin Qian mConfig.proc_uid_io_available = (access(UID_IO_STATS_PATH, R_OK) == 0); 216bcd6e3b9d92b2eea3b054372c9adf00a1e6235bcJin Qian 2173790f5bfafc52ca881b9350b922ffe94e6a537bbJin Qian mConfig.periodic_chores_interval_unit = 2183790f5bfafc52ca881b9350b922ffe94e6a537bbJin Qian property_get_int32("ro.storaged.event.interval", DEFAULT_PERIODIC_CHORES_INTERVAL_UNIT); 2193790f5bfafc52ca881b9350b922ffe94e6a537bbJin Qian 2203790f5bfafc52ca881b9350b922ffe94e6a537bbJin Qian mConfig.event_time_check_usec = 2213790f5bfafc52ca881b9350b922ffe94e6a537bbJin Qian property_get_int32("ro.storaged.event.perf_check", 0); 2223790f5bfafc52ca881b9350b922ffe94e6a537bbJin Qian 2233790f5bfafc52ca881b9350b922ffe94e6a537bbJin Qian mConfig.periodic_chores_interval_disk_stats_publish = 2243790f5bfafc52ca881b9350b922ffe94e6a537bbJin Qian property_get_int32("ro.storaged.disk_stats_pub", DEFAULT_PERIODIC_CHORES_INTERVAL_DISK_STATS_PUBLISH); 2253790f5bfafc52ca881b9350b922ffe94e6a537bbJin Qian 2265b962c6dbd305946ece05ffbd81d29c2ea211673Jin Qian mConfig.periodic_chores_interval_uid_io = 2275b962c6dbd305946ece05ffbd81d29c2ea211673Jin Qian property_get_int32("ro.storaged.uid_io.interval", DEFAULT_PERIODIC_CHORES_INTERVAL_UID_IO); 22862cb372279f0237f759d3fe8a7e03d8272ba327fynwang 2298847c62579282cd67a80d7354ccf26064aaed4e5Jin Qian storage_info.reset(storage_info_t::get_storage_info()); 2308847c62579282cd67a80d7354ccf26064aaed4e5Jin Qian 23162cb372279f0237f759d3fe8a7e03d8272ba327fynwang mStarttime = time(NULL); 23262cb372279f0237f759d3fe8a7e03d8272ba327fynwang} 23362cb372279f0237f759d3fe8a7e03d8272ba327fynwang 23462cb372279f0237f759d3fe8a7e03d8272ba327fynwangvoid storaged_t::event(void) { 23562cb372279f0237f759d3fe8a7e03d8272ba327fynwang if (mConfig.diskstats_available) { 23662cb372279f0237f759d3fe8a7e03d8272ba327fynwang mDiskStats.update(); 23762cb372279f0237f759d3fe8a7e03d8272ba327fynwang mDsm.update(); 2388847c62579282cd67a80d7354ccf26064aaed4e5Jin Qian storage_info->refresh(); 23962cb372279f0237f759d3fe8a7e03d8272ba327fynwang if (mTimer && (mTimer % mConfig.periodic_chores_interval_disk_stats_publish) == 0) { 24062cb372279f0237f759d3fe8a7e03d8272ba327fynwang mDiskStats.publish(); 24162cb372279f0237f759d3fe8a7e03d8272ba327fynwang } 24262cb372279f0237f759d3fe8a7e03d8272ba327fynwang } 24362cb372279f0237f759d3fe8a7e03d8272ba327fynwang 244bcd6e3b9d92b2eea3b054372c9adf00a1e6235bcJin Qian if (mConfig.proc_uid_io_available && mTimer && 2455b962c6dbd305946ece05ffbd81d29c2ea211673Jin Qian (mTimer % mConfig.periodic_chores_interval_uid_io) == 0) { 246bcd6e3b9d92b2eea3b054372c9adf00a1e6235bcJin Qian mUidm.report(); 247bcd6e3b9d92b2eea3b054372c9adf00a1e6235bcJin Qian } 248bcd6e3b9d92b2eea3b054372c9adf00a1e6235bcJin Qian 24962cb372279f0237f759d3fe8a7e03d8272ba327fynwang mTimer += mConfig.periodic_chores_interval_unit; 250af49d9756f8b0e29be517101c83c696031cd1dd9ynwang} 2513790f5bfafc52ca881b9350b922ffe94e6a537bbJin Qian 2523790f5bfafc52ca881b9350b922ffe94e6a537bbJin Qianvoid storaged_t::event_checked(void) { 2533790f5bfafc52ca881b9350b922ffe94e6a537bbJin Qian struct timespec start_ts, end_ts; 2543790f5bfafc52ca881b9350b922ffe94e6a537bbJin Qian bool check_time = true; 2553790f5bfafc52ca881b9350b922ffe94e6a537bbJin Qian 2563790f5bfafc52ca881b9350b922ffe94e6a537bbJin Qian if (mConfig.event_time_check_usec && 2573790f5bfafc52ca881b9350b922ffe94e6a537bbJin Qian clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &start_ts) < 0) { 2583790f5bfafc52ca881b9350b922ffe94e6a537bbJin Qian check_time = false; 259f42d7c833c4e719a5a5e2a5661ef21abf927a885Jin Qian static time_t state_a; 260f42d7c833c4e719a5a5e2a5661ef21abf927a885Jin Qian IF_ALOG_RATELIMIT_LOCAL(300, &state_a) { 261f42d7c833c4e719a5a5e2a5661ef21abf927a885Jin Qian PLOG_TO(SYSTEM, ERROR) << "clock_gettime() failed"; 262f42d7c833c4e719a5a5e2a5661ef21abf927a885Jin Qian } 2633790f5bfafc52ca881b9350b922ffe94e6a537bbJin Qian } 2643790f5bfafc52ca881b9350b922ffe94e6a537bbJin Qian 2653790f5bfafc52ca881b9350b922ffe94e6a537bbJin Qian event(); 2663790f5bfafc52ca881b9350b922ffe94e6a537bbJin Qian 267f42d7c833c4e719a5a5e2a5661ef21abf927a885Jin Qian if (mConfig.event_time_check_usec && check_time) { 2683790f5bfafc52ca881b9350b922ffe94e6a537bbJin Qian if (clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &end_ts) < 0) { 269f42d7c833c4e719a5a5e2a5661ef21abf927a885Jin Qian static time_t state_b; 270f42d7c833c4e719a5a5e2a5661ef21abf927a885Jin Qian IF_ALOG_RATELIMIT_LOCAL(300, &state_b) { 271f42d7c833c4e719a5a5e2a5661ef21abf927a885Jin Qian PLOG_TO(SYSTEM, ERROR) << "clock_gettime() failed"; 272f42d7c833c4e719a5a5e2a5661ef21abf927a885Jin Qian } 2733790f5bfafc52ca881b9350b922ffe94e6a537bbJin Qian return; 2743790f5bfafc52ca881b9350b922ffe94e6a537bbJin Qian } 2753790f5bfafc52ca881b9350b922ffe94e6a537bbJin Qian int64_t cost = (end_ts.tv_sec - start_ts.tv_sec) * SEC_TO_USEC + 2763790f5bfafc52ca881b9350b922ffe94e6a537bbJin Qian (end_ts.tv_nsec - start_ts.tv_nsec) / USEC_TO_NSEC; 2773790f5bfafc52ca881b9350b922ffe94e6a537bbJin Qian if (cost > mConfig.event_time_check_usec) { 2783790f5bfafc52ca881b9350b922ffe94e6a537bbJin Qian LOG_TO(SYSTEM, ERROR) 2793790f5bfafc52ca881b9350b922ffe94e6a537bbJin Qian << "event loop spent " << cost << " usec, threshold " 2803790f5bfafc52ca881b9350b922ffe94e6a537bbJin Qian << mConfig.event_time_check_usec << " usec"; 2813790f5bfafc52ca881b9350b922ffe94e6a537bbJin Qian } 2823790f5bfafc52ca881b9350b922ffe94e6a537bbJin Qian } 2833790f5bfafc52ca881b9350b922ffe94e6a537bbJin Qian} 284