diff options
author | Hungyen Weng <hungyenweng@google.com> | 2020-02-25 13:04:00 +0800 |
---|---|---|
committer | Cyan_Hsieh <cyanhsieh@google.com> | 2020-05-29 21:20:59 +0800 |
commit | e7b7e29dabdfaf30938324a0ebd1d3acd55aaf9b (patch) | |
tree | e04512c4597298f7edccc089daf1f512b49b5207 /dumpstate | |
parent | 51d10663f5ff7d22a60d37f74c1348f6e600895c (diff) | |
download | redfin-e7b7e29dabdfaf30938324a0ebd1d3acd55aaf9b.tar.gz |
dumpstate: Use thread to dump modem logs
Bug: 150185396
Change-Id: I9d989d5e42158b8d85dfd05761eca2516be9a1d6
Diffstat (limited to 'dumpstate')
-rwxr-xr-x | dumpstate/DumpstateDevice.cpp | 119 | ||||
-rw-r--r-- | dumpstate/DumpstateDevice.h | 4 |
2 files changed, 59 insertions, 64 deletions
diff --git a/dumpstate/DumpstateDevice.cpp b/dumpstate/DumpstateDevice.cpp index e4643e0..1a593bf 100755 --- a/dumpstate/DumpstateDevice.cpp +++ b/dumpstate/DumpstateDevice.cpp @@ -24,6 +24,7 @@ #include <hidl/HidlBinderSupport.h> #include <log/log.h> +#include <pthread.h> #include <string.h> #define _SVID_SOURCE @@ -65,34 +66,8 @@ namespace implementation { #define TCPDUMP_LOG_PREFIX "tcpdump" #define EXTENDED_LOG_PREFIX "extended_log_" -static bool isModemLoggingEnabled() { - return android::base::GetBoolProperty(DIAG_MDLOG_PERSIST_PROPERTY, false); -} - -static bool isModemLoggingRunning() { - return android::base::GetBoolProperty(DIAG_MDLOG_STATUS_PROPERTY, false); -} - -static void stopModemLogging() { - if (PropertiesHelper::IsUserBuild()) { - return; - } - - android::base::SetProperty(DIAG_MDLOG_PROPERTY, "false"); - ALOGD("Stopping diag_mdlog...\n"); -} - -static void startModemLogging() { - if (PropertiesHelper::IsUserBuild()) { - return; - } - - ALOGD("Starting diag_mdlog...\n"); - android::base::SetProperty(DIAG_MDLOG_PROPERTY, "true"); -} - -void DumpstateDevice::dumpLogs(int fd, std::string srcDir, std::string destDir, - int maxFileNum, const char *logPrefix) { +static void dumpLogs(int fd, std::string srcDir, std::string destDir, + int maxFileNum, const char *logPrefix) { struct dirent **dirent_list = NULL; int num_entries = scandir(srcDir.c_str(), &dirent_list, @@ -137,39 +112,61 @@ void DumpstateDevice::dumpLogs(int fd, std::string srcDir, std::string destDir, free(dirent_list); } -void DumpstateDevice::dumpModem(int fd, int fdModem) +static void *dumpModemThread(void *data) { + long fdModem = (long)data; + + ALOGD("dumpModemThread started\n"); + std::string modemLogDir = android::base::GetProperty(MODEM_LOG_LOC_PROPERTY, ""); if (modemLogDir.empty()) { ALOGD("No modem log place is set"); - return; + return NULL; } std::string filePrefix = android::base::GetProperty(MODEM_LOG_PREFIX_PROPERTY, ""); if (filePrefix.empty()) { ALOGD("Modem log prefix is not set"); - return; + return NULL; } + sleep(1); + ALOGD("Waited modem for 1 second to flush logs"); + const std::string modemLogCombined = modemLogDir + "/" + filePrefix + "all.tar"; const std::string modemLogAllDir = modemLogDir + "/modem_log"; - RunCommandToFd(fd, "MKDIR MODEM LOG", {"/vendor/bin/mkdir", "-p", modemLogAllDir.c_str()}, CommandOptions::WithTimeout(2).Build()); + RunCommandToFd(STDOUT_FILENO, "MKDIR MODEM LOG", {"/vendor/bin/mkdir", "-p", modemLogAllDir.c_str()}, CommandOptions::WithTimeout(2).Build()); const std::string diagLogDir = "/data/vendor/radio/diag_logs/logs"; const std::string diagPoweronLogPath = "/data/vendor/radio/diag_logs/logs/diag_poweron_log.qmdl"; - if (isModemLoggingEnabled()) { - if (isModemLoggingRunning()) { - ALOGD("diag_mdlog is running"); + bool diagLogEnabled = android::base::GetBoolProperty(DIAG_MDLOG_PERSIST_PROPERTY, false); + + if (diagLogEnabled) { + bool diagLogStarted = android::base::GetBoolProperty( DIAG_MDLOG_STATUS_PROPERTY, false); + + if (diagLogStarted) { + android::base::SetProperty(DIAG_MDLOG_PROPERTY, "false"); + ALOGD("Stopping diag_mdlog...\n"); + if (android::base::WaitForProperty(DIAG_MDLOG_STATUS_PROPERTY, "false", std::chrono::seconds(10))) { + ALOGD("diag_mdlog exited"); + } else { + ALOGE("Waited mdlog timeout after 10 second"); + } } else { ALOGD("diag_mdlog is not running"); } - dumpLogs(fd, diagLogDir, modemLogAllDir, android::base::GetIntProperty(DIAG_MDLOG_NUMBER_BUGREPORT, 100), DIAG_LOG_PREFIX); + dumpLogs(STDOUT_FILENO, diagLogDir, modemLogAllDir, android::base::GetIntProperty(DIAG_MDLOG_NUMBER_BUGREPORT, 100), DIAG_LOG_PREFIX); + + if (diagLogStarted) { + ALOGD("Restarting diag_mdlog..."); + android::base::SetProperty(DIAG_MDLOG_PROPERTY, "true"); + } } - RunCommandToFd(fd, "CP MODEM POWERON LOG", {"/vendor/bin/cp", diagPoweronLogPath.c_str(), modemLogAllDir.c_str()}, CommandOptions::WithTimeout(2).Build()); + RunCommandToFd(STDOUT_FILENO, "CP MODEM POWERON LOG", {"/vendor/bin/cp", diagPoweronLogPath.c_str(), modemLogAllDir.c_str()}, CommandOptions::WithTimeout(2).Build()); if (!PropertiesHelper::IsUserBuild()) { char cmd[256] = { 0 }; @@ -204,27 +201,26 @@ void DumpstateDevice::dumpModem(int fd, int fdModem) }; bool tcpdumpEnabled = android::base::GetBoolProperty(TCPDUMP_PERSIST_PROPERTY, false); - if (tcpdumpEnabled) { - dumpLogs(fd, tcpdumpLogDir, modemLogAllDir, android::base::GetIntProperty(TCPDUMP_NUMBER_BUGREPORT, 5), TCPDUMP_LOG_PREFIX); + dumpLogs(STDOUT_FILENO, tcpdumpLogDir, modemLogAllDir, android::base::GetIntProperty(TCPDUMP_NUMBER_BUGREPORT, 5), TCPDUMP_LOG_PREFIX); } for (const auto& logFile : rilAndNetmgrLogs) { - RunCommandToFd(fd, "CP MODEM LOG", {"/vendor/bin/cp", logFile.c_str(), modemLogAllDir.c_str()}, CommandOptions::WithTimeout(2).Build()); + RunCommandToFd(STDOUT_FILENO, "CP MODEM LOG", {"/vendor/bin/cp", logFile.c_str(), modemLogAllDir.c_str()}, CommandOptions::WithTimeout(2).Build()); } //Dump IPA log snprintf(cmd, sizeof(cmd), "cat /d/ipc_logging/ipa/log > %s/ipa_log", modemLogAllDir.c_str()); - RunCommandToFd(fd, "Dump IPA log", {"/vendor/bin/sh", "-c", cmd}); + RunCommandToFd(STDOUT_FILENO, "Dump IPA log", {"/vendor/bin/sh", "-c", cmd}); - dumpLogs(fd, extendedLogDir, modemLogAllDir, 100, EXTENDED_LOG_PREFIX); + dumpLogs(STDOUT_FILENO, extendedLogDir, modemLogAllDir, 100, EXTENDED_LOG_PREFIX); android::base::SetProperty(MODEM_EFS_DUMP_PROPERTY, "false"); } - RunCommandToFd(fd, "TAR LOG", {"/vendor/bin/tar", "cvf", modemLogCombined.c_str(), "-C", modemLogAllDir.c_str(), "."}, CommandOptions::WithTimeout(120).Build()); - RunCommandToFd(fd, "CHG PERM", {"/vendor/bin/chmod", "a+w", modemLogCombined.c_str()}, CommandOptions::WithTimeout(2).Build()); + RunCommandToFd(STDOUT_FILENO, "TAR LOG", {"/vendor/bin/tar", "cvf", modemLogCombined.c_str(), "-C", modemLogAllDir.c_str(), "."}, CommandOptions::WithTimeout(20).Build()); + RunCommandToFd(STDOUT_FILENO, "CHG PERM", {"/vendor/bin/chmod", "a+w", modemLogCombined.c_str()}, CommandOptions::WithTimeout(2).Build()); std::vector<uint8_t> buffer(65536); android::base::unique_fd fdLog(TEMP_FAILURE_RETRY(open(modemLogCombined.c_str(), O_RDONLY | O_CLOEXEC | O_NONBLOCK))); @@ -249,8 +245,12 @@ void DumpstateDevice::dumpModem(int fd, int fdModem) } } - RunCommandToFd(fd, "RM MODEM DIR", { "/vendor/bin/rm", "-r", modemLogAllDir.c_str()}, CommandOptions::WithTimeout(2).Build()); - RunCommandToFd(fd, "RM LOG", { "/vendor/bin/rm", modemLogCombined.c_str()}, CommandOptions::WithTimeout(2).Build()); + RunCommandToFd(STDOUT_FILENO, "RM MODEM DIR", { "/vendor/bin/rm", "-r", modemLogAllDir.c_str()}, CommandOptions::WithTimeout(2).Build()); + RunCommandToFd(STDOUT_FILENO, "RM LOG", { "/vendor/bin/rm", modemLogCombined.c_str()}, CommandOptions::WithTimeout(2).Build()); + + ALOGD("dumpModemThread finished\n"); + + return NULL; } static void DumpTouch(int fd) { @@ -450,13 +450,18 @@ Return<DumpstateStatus> DumpstateDevice::dumpstateBoard_1_1(const hidl_handle& h return DumpstateStatus::ILLEGAL_ARGUMENT; } - bool modemLogging = isModemLoggingRunning(); + RunCommandToFd(fd, "Notify modem", {"/vendor/bin/modem_svc", "-s"}, CommandOptions::WithTimeout(1).Build()); - if (isModemLoggingEnabled() && modemLogging) { - stopModemLogging(); + pthread_t modemThreadHandle = 0; + if (handle->numFds < 2) { + ALOGE("no FD for modem\n"); + } else { + int fdModem = handle->data[1]; + if (pthread_create(&modemThreadHandle, NULL, dumpModemThread, (void *)((long)fdModem)) != 0) { + ALOGE("could not create thread for dumpModem\n"); + } } - RunCommandToFd(fd, "Notify modem", {"/vendor/bin/modem_svc", "-s"}, CommandOptions::WithTimeout(1).Build()); RunCommandToFd(fd, "VENDOR PROPERTIES", {"/vendor/bin/getprop"}); DumpFileToFd(fd, "SoC serial number", "/sys/devices/soc0/serial_number"); DumpFileToFd(fd, "CPU present", "/sys/devices/system/cpu/present"); @@ -524,16 +529,6 @@ Return<DumpstateStatus> DumpstateDevice::dumpstateBoard_1_1(const hidl_handle& h // Slower dump put later in case stuck the rest of dump // Timeout after 3s as TZ log missing EOF RunCommandToFd(fd, "QSEE logs", {"/vendor/bin/sh", "-c", "/vendor/bin/timeout 3 cat /d/tzdbg/qsee_log"}); - if (handle->numFds < 2) { - ALOGE("no FD for modem\n"); - } else { - int fdModem = handle->data[1]; - dumpModem(fd, fdModem); - } - - if (isModemLoggingEnabled() && modemLogging) { - startModemLogging(); - } // Citadel info RunCommandToFd(fd, "Citadel VERSION", {"/vendor/bin/hw/citadel_updater", "-lv"}); @@ -546,6 +541,10 @@ Return<DumpstateStatus> DumpstateDevice::dumpstateBoard_1_1(const hidl_handle& h // Keep this at the end as very long on not for humans DumpFileToFd(fd, "WLAN FW Log Symbol Table", "/vendor/firmware/Data.msc"); + if (modemThreadHandle) { + pthread_join(modemThreadHandle, NULL); + } + return DumpstateStatus::OK; } diff --git a/dumpstate/DumpstateDevice.h b/dumpstate/DumpstateDevice.h index 6c3476d..353a938 100644 --- a/dumpstate/DumpstateDevice.h +++ b/dumpstate/DumpstateDevice.h @@ -48,10 +48,6 @@ struct DumpstateDevice : public IDumpstateDevice { const uint64_t timeoutMillis) override; Return<void> setVerboseLoggingEnabled(const bool enable) override; Return<bool> getVerboseLoggingEnabled() override; - - void dumpLogs(int fd, std::string srcDir, std::string destDir, int maxFileNum, - const char *logPrefix); - void dumpModem(int fd, int fdModem); }; } // namespace implementation |