diff --git a/.gitignore b/.gitignore index b0385219db4a2d4803659968015dfe356a0f4719..c5a81c0d9aac78f9d56865ec7b27f2efd84ea85f 100644 --- a/.gitignore +++ b/.gitignore @@ -16,4 +16,5 @@ tmp_* build-* *.pro.use* .DS_Store -._.DS_Store \ No newline at end of file +._.DS_Store +.history \ No newline at end of file diff --git a/ide/src/trace/component/SpFlags.ts b/ide/src/trace/component/SpFlags.ts index 41294fa1bb7bb064d6132a47dea06760f79b8a59..7e1cb955630819813c4197fdb3735264508ae662 100644 --- a/ide/src/trace/component/SpFlags.ts +++ b/ide/src/trace/component/SpFlags.ts @@ -249,6 +249,11 @@ export class FlagsConfig { switchOptions: [{ option: 'Enabled' }, { option: 'Disabled', selected: true }], describeContent: 'Scheduling analysis templates', }, + { + title: 'BinderRunnable', + switchOptions: [{ option: 'Enabled' }, { option: 'Disabled', selected: true }], + describeContent: 'support Cpu State Binder-Runnable', + }, ]; static getAllFlagConfig(): Array { diff --git a/ide/src/trace/component/trace/base/Utils.ts b/ide/src/trace/component/trace/base/Utils.ts index 0eb1ce7c96f6303a41320fc43d6dca5005d8472a..06e44d443b42438c1184c0a0044ae793342a99c9 100644 --- a/ide/src/trace/component/trace/base/Utils.ts +++ b/ide/src/trace/component/trace/base/Utils.ts @@ -43,6 +43,7 @@ export class Utils { Utils.statusMap.set('R', 'Runnable'); Utils.statusMap.set('Running', 'Running'); Utils.statusMap.set('R+', 'Runnable (Preempted)'); + Utils.statusMap.set('R-B', 'Runnable (Binder)') Utils.statusMap.set('I', 'Task Dead'); Utils.statusMap.set('T', 'Traced'); Utils.statusMap.set('t', 'Traced'); @@ -85,6 +86,8 @@ export class Utils { return '#f19b38'; } else if (state == 'R' || state == 'R+') { return '#a0b84d'; + } else if (state == 'R-B') { + return '#87CEFA'; } else if (state == 'I') { return '#673ab7'; } else if (state == 'Running') { diff --git a/trace_streamer/src/base/ts_common.h b/trace_streamer/src/base/ts_common.h index 908c8fbe9722c536b66777dd1bd549e9a3ef9b68..def2368cb87b0c1c8e348dba906302533bea4d5f 100644 --- a/trace_streamer/src/base/ts_common.h +++ b/trace_streamer/src/base/ts_common.h @@ -103,6 +103,8 @@ enum EndState { TASK_PARKED = 512, // (R+) Process groups in the foreground TASK_FOREGROUND = 2048, + // Hisi spec state + TASK_RUNNABLE_BINDER = 2049, TASK_MAX = 4096, TASK_INVALID = 9999 }; diff --git a/trace_streamer/src/filter/binder_filter.cpp b/trace_streamer/src/filter/binder_filter.cpp index 6a961fd4e22a187b5cd64bf43a84cdfb44b97c74..50188f2d94fbc0fac5ab9aa5c8d66dd9c76d67f3 100644 --- a/trace_streamer/src/filter/binder_filter.cpp +++ b/trace_streamer/src/filter/binder_filter.cpp @@ -190,6 +190,10 @@ void BinderFilter::TractionUnlock(int64_t ts, uint32_t pid, const std::string& t lastEventTs_.erase(pid); lastEventTs_[pid] = ts; } +bool BinderFilter::IsAsync(int32_t flags) const +{ + return (flags & noReturnMsgFlag_) == noReturnMsgFlag_; +} void BinderFilter::Clear() { lastEventTs_.clear(); diff --git a/trace_streamer/src/filter/binder_filter.h b/trace_streamer/src/filter/binder_filter.h index d50d391df3f356877ba5a9022c579eea0fbbf3f5..457dee0b9d123de2dc4ea9598614772e18347e68 100644 --- a/trace_streamer/src/filter/binder_filter.h +++ b/trace_streamer/src/filter/binder_filter.h @@ -45,6 +45,7 @@ public: void TractionLock(int64_t ts, uint32_t pid, const std::string& tag); void TractionLocked(int64_t ts, uint32_t pid, const std::string& tag); void TractionUnlock(int64_t ts, uint32_t pid, const std::string& tag); + bool IsAsync(int32_t flags) const; void Clear(); private: diff --git a/trace_streamer/src/filter/cpu_filter.cpp b/trace_streamer/src/filter/cpu_filter.cpp index dfb354ddad992e6bce54f46f3a85f650eaf3aa7b..6be217a233b06bc2a8161658e2321b80faa5adcb 100644 --- a/trace_streamer/src/filter/cpu_filter.cpp +++ b/trace_streamer/src/filter/cpu_filter.cpp @@ -31,10 +31,12 @@ void CpuFilter::InsertSwitchEvent(uint64_t ts, uint64_t nextPior, DataIndex nextInfo) { + BinderTransactionInfo btInfo = {prevPid, nextPid, INVALID_UINT64, INVALID_UINT64}; auto index = traceDataCache_->GetSchedSliceData()->AppendSchedSlice(ts, 0, cpu, nextPid, 0, nextPior); auto prevTidOnCpu = cpuToRowSched_.find(cpu); if (prevTidOnCpu != cpuToRowSched_.end()) { traceDataCache_->GetSchedSliceData()->Update(prevTidOnCpu->second.row, ts, prevState); + btInfo.schedSliceRow = prevTidOnCpu->second.row; cpuToRowSched_.at(cpu).row = index; } else { cpuToRowSched_.insert(std::make_pair(cpu, RowPos{nextPid, index})); @@ -83,6 +85,7 @@ void CpuFilter::InsertSwitchEvent(uint64_t ts, } auto threadStateRow = traceDataCache_->GetThreadStateData()->AppendThreadState(ts, INVALID_TIME, INVALID_CPU, prevPid, prevState); + btInfo.threadStateRow = threadStateRow; if (prevState == TASK_UNINTERRUPTIBLE || prevState == TASK_DK) { if (!pidToThreadSliceRow.count(prevPid)) { pidToThreadSliceRow.emplace(std::make_pair(prevPid, threadStateRow)); @@ -92,6 +95,16 @@ void CpuFilter::InsertSwitchEvent(uint64_t ts, } (void)RemberInternalTidInStateTable(prevPid, threadStateRow, prevState); } + if (traceDataCache_->BinderRunnableTraceEnabled() && iTidToTransaction_.find(prevPid) != iTidToTransaction_.end()) { + uint64_t transactionId = iTidToTransaction_.at(prevPid); + auto iter = transactionIdToInfo_.find(transactionId); + if (prevState != TASK_FOREGROUND || iter == transactionIdToInfo_.end() || iter->second.iTidFrom != prevPid || + btInfo.schedSliceRow == INVALID_UINT64 || btInfo.threadStateRow == INVALID_UINT64) { + TransactionClear(prevState, transactionId); + return; + } + transactionIdToInfo_[transactionId] = btInfo; + } } bool CpuFilter::InsertBlockedReasonEvent(uint64_t ts, @@ -196,6 +209,8 @@ void CpuFilter::Clear() cpuToRowSched_.clear(); lastWakeUpMsg_.clear(); internalTidToRowThreadState_.clear(); + iTidToTransaction_.clear(); + transactionIdToInfo_.clear(); } void CpuFilter::InsertWakeupEvent(uint64_t ts, uint32_t internalTid, bool isWaking) { @@ -256,5 +271,46 @@ void CpuFilter::CheckWakeupEvent(uint32_t internalTid) } return; } + +void CpuFilter::InsertRunnableBinderEvent(uint32_t transactionId, uint32_t iTid) +{ + if (iTidToTransaction_.find(iTid) != iTidToTransaction_.end()) { + iTidToTransaction_.erase(iTid); + } + iTidToTransaction_.emplace(iTid, transactionId); + if (transactionIdToInfo_.find(transactionId) != transactionIdToInfo_.end()) { + transactionIdToInfo_.erase(transactionId); + } + transactionIdToInfo_.emplace(transactionId, + BinderTransactionInfo{iTid, INVALID_UINT32, INVALID_UINT64, INVALID_UINT64}); +} + +void CpuFilter::InsertRunnableBinderRecvEvent(uint32_t transactionId, uint32_t iTid) +{ + auto iter = transactionIdToInfo_.find(transactionId); + if (iter == transactionIdToInfo_.end()) { + return; + } + if (iter->second.iTidTo == iTid && iter->second.schedSliceRow != INVALID_UINT64 && + iter->second.threadStateRow != INVALID_UINT64) { + traceDataCache_->GetSchedSliceData()->UpdateEndState(iter->second.schedSliceRow, TASK_RUNNABLE_BINDER); + traceDataCache_->GetThreadStateData()->UpdateState(iter->second.threadStateRow, TASK_RUNNABLE_BINDER); + } + TransactionClear(INVALID_UINT32, transactionId); +} + +void CpuFilter::TransactionClear(uint32_t iTidFrom, uint32_t transactionId) +{ + if (iTidToTransaction_.find(iTidFrom) != iTidToTransaction_.end()) { + iTidToTransaction_.erase(iTidFrom); + } + auto iter = transactionIdToInfo_.find(transactionId); + if (iter != transactionIdToInfo_.end()) { + if (iTidToTransaction_.find(iter->second.iTidFrom) != iTidToTransaction_.end()) { + iTidToTransaction_.erase(iter->second.iTidFrom); + } + transactionIdToInfo_.erase(transactionId); + } +} } // namespace TraceStreamer } // namespace SysTuning diff --git a/trace_streamer/src/filter/cpu_filter.h b/trace_streamer/src/filter/cpu_filter.h index 0c46d93c609f5829369fc090c59219ab7c35ad3c..701bfe1b0c6f298da97f4d7219c75dfd9887df4b 100644 --- a/trace_streamer/src/filter/cpu_filter.h +++ b/trace_streamer/src/filter/cpu_filter.h @@ -21,6 +21,7 @@ #include #include #include +#include #include "filter_base.h" #include "trace_data_cache.h" @@ -55,6 +56,8 @@ public: void InsertWakeupEvent(uint64_t ts, uint32_t internalTid, bool isWaking = false); bool InsertProcessExitEvent(uint64_t ts, uint64_t cpu, uint32_t pid); bool InsertProcessFreeEvent(uint64_t ts, uint32_t pid); + void InsertRunnableBinderEvent(uint32_t transactionId, uint32_t iTid); + void InsertRunnableBinderRecvEvent(uint32_t transactionId, uint32_t iTid); void Finish() const; void Clear(); @@ -64,6 +67,7 @@ private: uint64_t RowOfInternalTidInStateTable(uint32_t uid) const; void ClearInternalTidInStateTable(uint32_t uid); uint64_t StateOfInternalTidInStateTable(uint32_t uid) const; + void TransactionClear(uint32_t iTidFrom, uint32_t transactionId); std::map cpuToRowThreadState_ = {}; typedef struct { uint32_t iTid; @@ -83,6 +87,15 @@ private: const DataIndex caller_ = traceDataCache_->GetDataIndex("caller"); const DataIndex delay_ = traceDataCache_->GetDataIndex("delay"); std::map toRunnableTid_ = {}; + + struct BinderTransactionInfo { + uint32_t iTidFrom; + uint32_t iTidTo; + uint64_t schedSliceRow; + uint64_t threadStateRow; + }; + std::unordered_map iTidToTransaction_; + std::unordered_map transactionIdToInfo_; }; } // namespace TraceStreamer } // namespace SysTuning diff --git a/trace_streamer/src/parser/bytrace_parser/bytrace_event_parser.cpp b/trace_streamer/src/parser/bytrace_parser/bytrace_event_parser.cpp index 90067a300a2dd8b8a94782373406d8f6bc5906a3..1ed61fff3305a3f35d6355b6a1846a4cc0dd5665 100644 --- a/trace_streamer/src/parser/bytrace_parser/bytrace_event_parser.cpp +++ b/trace_streamer/src/parser/bytrace_parser/bytrace_event_parser.cpp @@ -611,6 +611,11 @@ bool BytraceEventParser::BinderTransaction(const ArgsMap& args, const BytraceLin streamFilters_->binderFilter_->SendTraction(line.ts, line.pid, transactionId.value(), destNode.value(), destProc.value(), destThread.value(), isReply.value(), flags.value(), codeStr.value()); + if (traceDataCache_->BinderRunnableTraceEnabled() && transactionId.has_value() && flags.has_value() && + !streamFilters_->binderFilter_->IsAsync(flags.value())) { + streamFilters_->cpuFilter_->InsertRunnableBinderEvent(transactionId.value(), + streamFilters_->processFilter_->GetInternalTid(line.pid)); + } return true; } bool BytraceEventParser::BinderTransactionReceived(const ArgsMap& args, const BytraceLine& line) const @@ -623,6 +628,10 @@ bool BytraceEventParser::BinderTransactionReceived(const ArgsMap& args, const By streamFilters_->statFilter_->IncreaseStat(TRACE_EVENT_BINDER_TRANSACTION_RECEIVED, STAT_EVENT_RECEIVED); auto transactionId = base::StrToInt(args.at("transaction")); streamFilters_->binderFilter_->ReceiveTraction(line.ts, line.pid, transactionId.value()); + if (traceDataCache_->BinderRunnableTraceEnabled() && transactionId.has_value()) { + streamFilters_->cpuFilter_->InsertRunnableBinderRecvEvent( + transactionId.value(), streamFilters_->processFilter_->GetInternalTid(line.pid)); + } TS_LOGD("ts:%lu, pid:%u, transactionId:%lu", line.ts, line.pid, transactionId.value()); return true; } diff --git a/trace_streamer/src/parser/htrace_pbreader_parser/htrace_event_parser/htrace_event_parser.cpp b/trace_streamer/src/parser/htrace_pbreader_parser/htrace_event_parser/htrace_event_parser.cpp index e17571464f13889c695fb2f0ce4231fcf3dc0ab5..ee4bbdbf75145c00e8d78fc7a4b65820ec397eef 100644 --- a/trace_streamer/src/parser/htrace_pbreader_parser/htrace_event_parser/htrace_event_parser.cpp +++ b/trace_streamer/src/parser/htrace_pbreader_parser/htrace_event_parser/htrace_event_parser.cpp @@ -339,6 +339,10 @@ bool HtraceEventParser::BinderTractionEvent(const ProtoReader::DataArea& event) destTid, transactionId, isReply, flags, msg.code()); streamFilters_->binderFilter_->SendTraction(eventTimeStamp_, eventTid_, transactionId, destNode, destTgid, destTid, isReply, flags, msg.code()); + if (traceDataCache_->BinderRunnableTraceEnabled() && !streamFilters_->binderFilter_->IsAsync(flags)) { + streamFilters_->cpuFilter_->InsertRunnableBinderEvent( + transactionId, streamFilters_->processFilter_->GetInternalTid(eventTid_)); + } return true; } bool HtraceEventParser::BinderTractionReceivedEvent(const ProtoReader::DataArea& event) const @@ -347,6 +351,10 @@ bool HtraceEventParser::BinderTractionReceivedEvent(const ProtoReader::DataArea& ProtoReader::BinderTransactionReceivedFormat_Reader msg(event.Data(), event.Size()); int32_t transactionId = msg.debug_id(); streamFilters_->binderFilter_->ReceiveTraction(eventTimeStamp_, eventTid_, transactionId); + if (traceDataCache_->BinderRunnableTraceEnabled()) { + streamFilters_->cpuFilter_->InsertRunnableBinderRecvEvent( + transactionId, streamFilters_->processFilter_->GetInternalTid(eventTid_)); + } TS_LOGD("transactionId:%d", transactionId); return true; } diff --git a/trace_streamer/src/rpc/rpc_server.cpp b/trace_streamer/src/rpc/rpc_server.cpp index f73103de24264d7486f32524aef4586a123eaf0f..4534e46a76e828c9f60f082548b8866118235e3e 100644 --- a/trace_streamer/src/rpc/rpc_server.cpp +++ b/trace_streamer/src/rpc/rpc_server.cpp @@ -40,12 +40,14 @@ struct ParserConfig { int32_t taskConfigValue; int32_t appConfigValue; int32_t aniConfigValue; + int32_t binderConfigValue; }; void from_json(const json& j, ParserConfig& v) { j.at("TaskPool").get_to(v.taskConfigValue); j.at("AppStartup").get_to(v.appConfigValue); j.at("AnimationAnalysis").get_to(v.aniConfigValue); + j.at("BinderRunnable").get_to(v.binderConfigValue); } } // namespace jsonns bool RpcServer::ParseData(const uint8_t* data, size_t len, ResultCallBack resultCallBack) @@ -283,6 +285,7 @@ bool RpcServer::ParserConfig(std::string parserConfigJson) ts_->UpdateAppStartTraceStatus(parserConfig.appConfigValue); ts_->UpdateAnimationTraceStatus(parserConfig.aniConfigValue); ts_->UpdateTaskPoolTraceStatus(parserConfig.taskConfigValue); + ts_->UpdateBinderRunnableTraceStatus(parserConfig.binderConfigValue); return true; } } // namespace TraceStreamer diff --git a/trace_streamer/src/trace_data/trace_data_cache.cpp b/trace_streamer/src/trace_data/trace_data_cache.cpp index 90fbcb26de207e8719bc0fcbe296978590f91d29..aee57a4fdadac4875771184f2a31079516b984c6 100644 --- a/trace_streamer/src/trace_data/trace_data_cache.cpp +++ b/trace_streamer/src/trace_data/trace_data_cache.cpp @@ -321,5 +321,13 @@ void TraceDataCache::UpdateAppStartTraceStatus(bool status) { appStartTraceEnabled_ = status; } +bool TraceDataCache::BinderRunnableTraceEnabled() +{ + return binderRunnableTraceEnabled_; +} +void TraceDataCache::UpdateBinderRunnableTraceStatus(bool status) +{ + binderRunnableTraceEnabled_ = status; +} } // namespace TraceStreamer } // namespace SysTuning diff --git a/trace_streamer/src/trace_data/trace_data_cache.h b/trace_streamer/src/trace_data/trace_data_cache.h index 3311a02cfaf8bcfbaf135e239b7591cf45e71cae..34821819b4289ed5a8f91c4b1b1bc5beff3061b7 100644 --- a/trace_streamer/src/trace_data/trace_data_cache.h +++ b/trace_streamer/src/trace_data/trace_data_cache.h @@ -37,6 +37,8 @@ public: void UpdateTaskPoolTraceStatus(bool status); bool AppStartTraceEnabled(); void UpdateAppStartTraceStatus(bool status); + bool BinderRunnableTraceEnabled(); + void UpdateBinderRunnableTraceStatus(bool status); private: void InitDB() override; @@ -44,6 +46,7 @@ private: bool animationTraceEnabled_ = false; bool taskPoolTraceEnabled_ = false; bool appStartTraceEnabled_ = false; + bool binderRunnableTraceEnabled_ = false; }; } // namespace TraceStreamer } // namespace SysTuning diff --git a/trace_streamer/src/trace_data/trace_data_cache_base.h b/trace_streamer/src/trace_data/trace_data_cache_base.h index bbb05dd64c8abaf87d1739a52b40356adbbc92d5..1c10105f989faf84a58240a599b03ffe02864ece 100644 --- a/trace_streamer/src/trace_data/trace_data_cache_base.h +++ b/trace_streamer/src/trace_data/trace_data_cache_base.h @@ -23,6 +23,7 @@ #include #include #include "trace_stdtype.h" +#include "ts_common.h" namespace SysTuning { namespace TraceStreamer { using namespace TraceStdtype; @@ -80,6 +81,7 @@ public: {TASK_WAKEKILL, "R"}, {TASK_PARKED, "P"}, {TASK_FOREGROUND, "R+"}, + {TASK_RUNNABLE_BINDER, "R-B"}, {TASK_MAX, "S"}, {TASK_INVALID, "U"}}; std::map threadStatus2Value_ = {}; diff --git a/trace_streamer/src/trace_data/trace_stdtype.cpp b/trace_streamer/src/trace_data/trace_stdtype.cpp index 8928913a6472328b6a6eaef4d8e1303d8a5fe76d..a4a8ae17a4bf75a3ef098d438f265dfc03d98a62 100644 --- a/trace_streamer/src/trace_data/trace_stdtype.cpp +++ b/trace_streamer/src/trace_data/trace_stdtype.cpp @@ -142,6 +142,11 @@ void SchedSlice::Update(uint64_t index, uint64_t ts, uint64_t state) endStates_[index] = state; } +void SchedSlice::UpdateEndState(uint64_t index, uint64_t state) +{ + endStates_[index] = state; +} + void SchedSlice::UpdateArg(uint64_t index, uint32_t argsetId) { argSets_[index] = argsetId; diff --git a/trace_streamer/src/trace_data/trace_stdtype.h b/trace_streamer/src/trace_data/trace_stdtype.h index 24c3419519686c979ebda9c2da75ec474a4bbcc9..edc6b41210a232b676aef7d3bed5fe241ca37abc 100644 --- a/trace_streamer/src/trace_data/trace_stdtype.h +++ b/trace_streamer/src/trace_data/trace_stdtype.h @@ -202,6 +202,7 @@ public: uint64_t priority); void SetDuration(size_t index, uint64_t duration); void Update(uint64_t index, uint64_t ts, uint64_t state); + void UpdateEndState(uint64_t index, uint64_t state); void UpdateArg(uint64_t index, uint32_t argsetId); const std::deque& EndStatesData() const diff --git a/trace_streamer/src/trace_streamer/trace_streamer_selector.cpp b/trace_streamer/src/trace_streamer/trace_streamer_selector.cpp index 785808d7822c5cabf3f86a2577f243bb9e5700c1..2d37483555cb8d5dadc6b3e184c69c2887cb3084 100644 --- a/trace_streamer/src/trace_streamer/trace_streamer_selector.cpp +++ b/trace_streamer/src/trace_streamer/trace_streamer_selector.cpp @@ -301,5 +301,9 @@ void TraceStreamerSelector::UpdateAppStartTraceStatus(bool status) { traceDataCache_->UpdateAppStartTraceStatus(status); } +void TraceStreamerSelector::UpdateBinderRunnableTraceStatus(bool status) +{ + traceDataCache_->UpdateBinderRunnableTraceStatus(status); +} } // namespace TraceStreamer } // namespace SysTuning diff --git a/trace_streamer/src/trace_streamer/trace_streamer_selector.h b/trace_streamer/src/trace_streamer/trace_streamer_selector.h index d71a479add4fa6ba3d76544369f11e1ebf9f74a1..5f7bd52b21a13370e713442459f6b7b08e6f731f 100644 --- a/trace_streamer/src/trace_streamer/trace_streamer_selector.h +++ b/trace_streamer/src/trace_streamer/trace_streamer_selector.h @@ -52,6 +52,7 @@ public: void UpdateAnimationTraceStatus(bool status); void UpdateTaskPoolTraceStatus(bool status); void UpdateAppStartTraceStatus(bool status); + void UpdateBinderRunnableTraceStatus(bool status); private: void InitFilter();