Loading storaged/include/storaged.h +3 −0 Original line number Diff line number Diff line Loading @@ -256,6 +256,7 @@ private: uid_monitor mUidm; time_t mStarttime; sp<IBatteryPropertiesRegistrar> battery_properties; std::unique_ptr<storage_info_t> storage_info; public: storaged_t(void); ~storaged_t() {} Loading Loading @@ -285,6 +286,8 @@ public: void init_battery_service(); virtual void batteryPropertiesChanged(struct BatteryProperties props); void binderDied(const wp<IBinder>& who); void report_storage_info(); }; // Eventlog tag Loading storaged/include/storaged_info.h +22 −15 Original line number Diff line number Diff line Loading @@ -27,39 +27,46 @@ using namespace std; class storage_info_t { protected: FRIEND_TEST(storaged_test, storage_info_t); // emmc lifetime uint16_t eol; // pre-eol (end of life) information uint16_t lifetime_a; // device life time estimation (type A) uint16_t lifetime_b; // device life time estimation (type B) string version; // version string // free space const string userdata_path = "/data"; uint64_t userdata_total_kb; uint64_t userdata_free_kb; storage_info_t() : eol(0), lifetime_a(0), lifetime_b(0), userdata_total_kb(0), userdata_free_kb(0) {} void publish(); storage_info_t* s_info; public: storage_info_t() : eol(0), lifetime_a(0), lifetime_b(0) {} static storage_info_t* get_storage_info(); virtual ~storage_info_t() {} virtual bool report() = 0; virtual void report() {}; void refresh(); }; class emmc_info_t : public storage_info_t { private: const string emmc_sysfs = "/sys/bus/mmc/devices/mmc0:0001/"; const string emmc_debugfs = "/d/mmc0/mmc0:0001/ext_csd"; const char* emmc_ver_str[9] = { "4.0", "4.1", "4.2", "4.3", "Obsolete", "4.41", "4.5", "5.0", "5.1" }; public: virtual ~emmc_info_t() {} bool report(); bool report_sysfs(); bool report_debugfs(); public: static const string emmc_sysfs; static const string emmc_debugfs; static const char* emmc_ver_str[]; virtual ~emmc_info_t() {} virtual void report(); }; class ufs_info_t : public storage_info_t { private: const string health_file = "/sys/devices/soc/624000.ufshc/health"; public: static const string health_file; virtual ~ufs_info_t() {} bool report(); virtual void report(); }; void report_storage_health(); #endif /* _STORAGED_INFO_H_ */ storaged/main.cpp +1 −1 Original line number Diff line number Diff line Loading @@ -49,6 +49,7 @@ void* storaged_main(void* /* unused */) { storaged = new storaged_t(); storaged->init_battery_service(); storaged->report_storage_info(); LOG_TO(SYSTEM, INFO) << "storaged: Start"; Loading Loading @@ -113,7 +114,6 @@ int main(int argc, char** argv) { } if (flag_main_service) { // start main thread report_storage_health(); // Start the main thread of storaged pthread_t storaged_main_thread; errno = pthread_create(&storaged_main_thread, NULL, storaged_main, NULL); Loading storaged/storaged.cpp +7 −0 Original line number Diff line number Diff line Loading @@ -200,6 +200,10 @@ void storaged_t::binderDied(const wp<IBinder>& who) { } } void storaged_t::report_storage_info() { storage_info->report(); } /* storaged_t */ storaged_t::storaged_t(void) { if (access(MMC_DISK_STATS_PATH, R_OK) < 0 && access(SDA_DISK_STATS_PATH, R_OK) < 0) { Loading @@ -222,6 +226,8 @@ storaged_t::storaged_t(void) { mConfig.periodic_chores_interval_uid_io = property_get_int32("ro.storaged.uid_io.interval", DEFAULT_PERIODIC_CHORES_INTERVAL_UID_IO); storage_info.reset(storage_info_t::get_storage_info()); mStarttime = time(NULL); } Loading @@ -229,6 +235,7 @@ void storaged_t::event(void) { if (mConfig.diskstats_available) { mDiskStats.update(); mDsm.update(); storage_info->refresh(); if (mTimer && (mTimer % mConfig.periodic_chores_interval_disk_stats_publish) == 0) { mDiskStats.publish(); } Loading storaged/storaged_info.cpp +42 −14 Original line number Diff line number Diff line Loading @@ -18,6 +18,7 @@ #include <stdio.h> #include <string.h> #include <sys/statvfs.h> #include <android-base/file.h> #include <android-base/parseint.h> Loading @@ -30,13 +31,42 @@ using namespace std; using namespace android::base; void report_storage_health() const string emmc_info_t::emmc_sysfs = "/sys/bus/mmc/devices/mmc0:0001/"; const string emmc_info_t::emmc_debugfs = "/d/mmc0/mmc0:0001/ext_csd"; const char* emmc_info_t::emmc_ver_str[9] = { "4.0", "4.1", "4.2", "4.3", "Obsolete", "4.41", "4.5", "5.0", "5.1" }; const string ufs_info_t::health_file = "/sys/devices/soc/624000.ufshc/health"; static bool FileExists(const std::string& filename) { struct stat buffer; return stat(filename.c_str(), &buffer) == 0; } storage_info_t* storage_info_t::get_storage_info() { if (FileExists(emmc_info_t::emmc_sysfs) || FileExists(emmc_info_t::emmc_debugfs)) { return new emmc_info_t; } if (FileExists(ufs_info_t::health_file)) { return new ufs_info_t; } return new storage_info_t; } void storage_info_t::refresh() { emmc_info_t mmc; ufs_info_t ufs; struct statvfs buf; if (statvfs(userdata_path.c_str(), &buf) != 0) { PLOG_TO(SYSTEM, WARNING) << "Failed to get userdata info"; return; } mmc.report(); ufs.report(); userdata_total_kb = buf.f_bsize * buf.f_blocks >> 10; userdata_free_kb = buf.f_bfree * buf.f_blocks >> 10; } void storage_info_t::publish() Loading @@ -46,13 +76,12 @@ void storage_info_t::publish() << LOG_ID_EVENTS; } bool emmc_info_t::report() void emmc_info_t::report() { if (!report_sysfs() && !report_debugfs()) return false; return; publish(); return true; } bool emmc_info_t::report_sysfs() Loading Loading @@ -136,21 +165,21 @@ bool emmc_info_t::report_debugfs() return true; } bool ufs_info_t::report() void ufs_info_t::report() { string buffer; if (!ReadFileToString(health_file, &buffer)) { return false; return; } vector<string> lines = Split(buffer, "\n"); if (lines.empty()) { return false; return; } char rev[8]; if (sscanf(lines[0].c_str(), "ufs version: 0x%7s\n", rev) < 1) { return false; return; } version = "ufs " + string(rev); Loading @@ -175,10 +204,9 @@ bool ufs_info_t::report() } if (eol == 0 || (lifetime_a == 0 && lifetime_b == 0)) { return false; return; } publish(); return true; } Loading
storaged/include/storaged.h +3 −0 Original line number Diff line number Diff line Loading @@ -256,6 +256,7 @@ private: uid_monitor mUidm; time_t mStarttime; sp<IBatteryPropertiesRegistrar> battery_properties; std::unique_ptr<storage_info_t> storage_info; public: storaged_t(void); ~storaged_t() {} Loading Loading @@ -285,6 +286,8 @@ public: void init_battery_service(); virtual void batteryPropertiesChanged(struct BatteryProperties props); void binderDied(const wp<IBinder>& who); void report_storage_info(); }; // Eventlog tag Loading
storaged/include/storaged_info.h +22 −15 Original line number Diff line number Diff line Loading @@ -27,39 +27,46 @@ using namespace std; class storage_info_t { protected: FRIEND_TEST(storaged_test, storage_info_t); // emmc lifetime uint16_t eol; // pre-eol (end of life) information uint16_t lifetime_a; // device life time estimation (type A) uint16_t lifetime_b; // device life time estimation (type B) string version; // version string // free space const string userdata_path = "/data"; uint64_t userdata_total_kb; uint64_t userdata_free_kb; storage_info_t() : eol(0), lifetime_a(0), lifetime_b(0), userdata_total_kb(0), userdata_free_kb(0) {} void publish(); storage_info_t* s_info; public: storage_info_t() : eol(0), lifetime_a(0), lifetime_b(0) {} static storage_info_t* get_storage_info(); virtual ~storage_info_t() {} virtual bool report() = 0; virtual void report() {}; void refresh(); }; class emmc_info_t : public storage_info_t { private: const string emmc_sysfs = "/sys/bus/mmc/devices/mmc0:0001/"; const string emmc_debugfs = "/d/mmc0/mmc0:0001/ext_csd"; const char* emmc_ver_str[9] = { "4.0", "4.1", "4.2", "4.3", "Obsolete", "4.41", "4.5", "5.0", "5.1" }; public: virtual ~emmc_info_t() {} bool report(); bool report_sysfs(); bool report_debugfs(); public: static const string emmc_sysfs; static const string emmc_debugfs; static const char* emmc_ver_str[]; virtual ~emmc_info_t() {} virtual void report(); }; class ufs_info_t : public storage_info_t { private: const string health_file = "/sys/devices/soc/624000.ufshc/health"; public: static const string health_file; virtual ~ufs_info_t() {} bool report(); virtual void report(); }; void report_storage_health(); #endif /* _STORAGED_INFO_H_ */
storaged/main.cpp +1 −1 Original line number Diff line number Diff line Loading @@ -49,6 +49,7 @@ void* storaged_main(void* /* unused */) { storaged = new storaged_t(); storaged->init_battery_service(); storaged->report_storage_info(); LOG_TO(SYSTEM, INFO) << "storaged: Start"; Loading Loading @@ -113,7 +114,6 @@ int main(int argc, char** argv) { } if (flag_main_service) { // start main thread report_storage_health(); // Start the main thread of storaged pthread_t storaged_main_thread; errno = pthread_create(&storaged_main_thread, NULL, storaged_main, NULL); Loading
storaged/storaged.cpp +7 −0 Original line number Diff line number Diff line Loading @@ -200,6 +200,10 @@ void storaged_t::binderDied(const wp<IBinder>& who) { } } void storaged_t::report_storage_info() { storage_info->report(); } /* storaged_t */ storaged_t::storaged_t(void) { if (access(MMC_DISK_STATS_PATH, R_OK) < 0 && access(SDA_DISK_STATS_PATH, R_OK) < 0) { Loading @@ -222,6 +226,8 @@ storaged_t::storaged_t(void) { mConfig.periodic_chores_interval_uid_io = property_get_int32("ro.storaged.uid_io.interval", DEFAULT_PERIODIC_CHORES_INTERVAL_UID_IO); storage_info.reset(storage_info_t::get_storage_info()); mStarttime = time(NULL); } Loading @@ -229,6 +235,7 @@ void storaged_t::event(void) { if (mConfig.diskstats_available) { mDiskStats.update(); mDsm.update(); storage_info->refresh(); if (mTimer && (mTimer % mConfig.periodic_chores_interval_disk_stats_publish) == 0) { mDiskStats.publish(); } Loading
storaged/storaged_info.cpp +42 −14 Original line number Diff line number Diff line Loading @@ -18,6 +18,7 @@ #include <stdio.h> #include <string.h> #include <sys/statvfs.h> #include <android-base/file.h> #include <android-base/parseint.h> Loading @@ -30,13 +31,42 @@ using namespace std; using namespace android::base; void report_storage_health() const string emmc_info_t::emmc_sysfs = "/sys/bus/mmc/devices/mmc0:0001/"; const string emmc_info_t::emmc_debugfs = "/d/mmc0/mmc0:0001/ext_csd"; const char* emmc_info_t::emmc_ver_str[9] = { "4.0", "4.1", "4.2", "4.3", "Obsolete", "4.41", "4.5", "5.0", "5.1" }; const string ufs_info_t::health_file = "/sys/devices/soc/624000.ufshc/health"; static bool FileExists(const std::string& filename) { struct stat buffer; return stat(filename.c_str(), &buffer) == 0; } storage_info_t* storage_info_t::get_storage_info() { if (FileExists(emmc_info_t::emmc_sysfs) || FileExists(emmc_info_t::emmc_debugfs)) { return new emmc_info_t; } if (FileExists(ufs_info_t::health_file)) { return new ufs_info_t; } return new storage_info_t; } void storage_info_t::refresh() { emmc_info_t mmc; ufs_info_t ufs; struct statvfs buf; if (statvfs(userdata_path.c_str(), &buf) != 0) { PLOG_TO(SYSTEM, WARNING) << "Failed to get userdata info"; return; } mmc.report(); ufs.report(); userdata_total_kb = buf.f_bsize * buf.f_blocks >> 10; userdata_free_kb = buf.f_bfree * buf.f_blocks >> 10; } void storage_info_t::publish() Loading @@ -46,13 +76,12 @@ void storage_info_t::publish() << LOG_ID_EVENTS; } bool emmc_info_t::report() void emmc_info_t::report() { if (!report_sysfs() && !report_debugfs()) return false; return; publish(); return true; } bool emmc_info_t::report_sysfs() Loading Loading @@ -136,21 +165,21 @@ bool emmc_info_t::report_debugfs() return true; } bool ufs_info_t::report() void ufs_info_t::report() { string buffer; if (!ReadFileToString(health_file, &buffer)) { return false; return; } vector<string> lines = Split(buffer, "\n"); if (lines.empty()) { return false; return; } char rev[8]; if (sscanf(lines[0].c_str(), "ufs version: 0x%7s\n", rev) < 1) { return false; return; } version = "ufs " + string(rev); Loading @@ -175,10 +204,9 @@ bool ufs_info_t::report() } if (eol == 0 || (lifetime_a == 0 && lifetime_b == 0)) { return false; return; } publish(); return true; }