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