1 /* 2 * Copyright (c) 2021 Huawei Device Co., Ltd. 3 * Licensed under the Apache License, Version 2.0 (the "License"); 4 * you may not use this file except in compliance with the License. 5 * You may obtain a copy of the License at 6 * 7 * http://www.apache.org/licenses/LICENSE-2.0 8 * 9 * Unless required by applicable law or agreed to in writing, software 10 * distributed under the License is distributed on an "AS IS" BASIS, 11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 * See the License for the specific language governing permissions and 13 * limitations under the License. 14 */ 15 #ifndef HTRACE_EVENT_PARSER_H 16 #define HTRACE_EVENT_PARSER_H 17 #include <cstdint> 18 #include <functional> 19 #include <limits> 20 #include <stdexcept> 21 #include <string> 22 #include <unordered_set> 23 #include <vector> 24 #include <mutex> 25 26 #include "event_parser_base.h" 27 #include "ftrace_event.pbreader.h" 28 #include "google/protobuf/message_lite.h" 29 #include "log.h" 30 #include "print_event_parser.h" 31 #include "trace_data/trace_data_cache.h" 32 #include "trace_plugin_result.pbreader.h" 33 #include "trace_streamer_config.h" 34 #include "trace_streamer_filters.h" 35 #include "ts_common.h" 36 37 namespace SysTuning { 38 namespace TraceStreamer { 39 using namespace google::protobuf; 40 class HtraceEventParser : private EventParserBase { 41 public: 42 HtraceEventParser(TraceDataCache* dataCache, const TraceStreamerFilters* filter); 43 ~HtraceEventParser(); 44 void ParseDataItem(HtraceDataSegment& tracePacket, 45 ProtoReader::TracePluginResult_Reader& tracePluginResult, 46 bool& haveSplitSeg); 47 void FilterAllEventsReader(); 48 void FilterAllEvents(); 49 void Clear(); 50 51 private: 52 struct EventInfo { 53 int32_t pid_ = 0; 54 int32_t tgid_ = 0; 55 uint32_t cpu_ = 0; 56 SupportedTraceEventType eventType_ = TRACE_EVENT_OTHER; 57 uint64_t timeStamp_ = INVALID_UINT64; 58 DataIndex taskNameIndex_; 59 std::string detail_; 60 }; 61 62 // Initialization 63 void InterruptEventInitialization(); 64 void ClockEventInitialization(); 65 void CpuEventInitialization(); 66 void LockEventInitialization(); 67 void BinderEventInitialization(); 68 void StackEventsInitialization(); 69 70 bool BytesViewEventInfo(ProtoReader::BytesView& bytesView, 71 ProtoReader::BytesView bytesViewChange, 72 EventInfo& eventInfo, 73 const SupportedTraceEventType& enumerationClass); 74 bool ConstructEventSet(const ProtoReader::FtraceEvent_Reader& event, 75 EventInfo& eventInfo, 76 ProtoReader::BytesView& bytesView); 77 78 bool InterruptEventSet(const ProtoReader::FtraceEvent_Reader& event, 79 EventInfo& eventInfo, 80 ProtoReader::BytesView& bytesView); 81 bool ClockEventSet(const ProtoReader::FtraceEvent_Reader& event, 82 EventInfo& eventInfo, 83 ProtoReader::BytesView& bytesView); 84 bool CpuEventSet(const ProtoReader::FtraceEvent_Reader& event, 85 EventInfo& eventInfo, 86 ProtoReader::BytesView& bytesView); 87 bool LockEventSet(const ProtoReader::FtraceEvent_Reader& event, 88 EventInfo& eventInfo, 89 ProtoReader::BytesView& bytesView); 90 bool BinderEventSet(const ProtoReader::FtraceEvent_Reader& event, 91 EventInfo& eventInfo, 92 ProtoReader::BytesView& bytesView); 93 bool StackEventSet(const ProtoReader::FtraceEvent_Reader& event, 94 EventInfo& eventInfo, 95 ProtoReader::BytesView& bytesView); 96 97 bool SetEventType(const ProtoReader::FtraceEvent_Reader& event, 98 EventInfo& eventInfo, 99 ProtoReader::BytesView& bytesView); 100 void ProtoReaderDealEvent(EventInfo* eventInfo); 101 102 void ParserCpuEvent(HtraceDataSegment& tracePacket, 103 SysTuning::ProtoReader::FtraceCpuDetailMsg_Reader& msg, 104 bool& haveSplitSeg); 105 bool BinderTractionEvent(const EventInfo& event) const; 106 bool BinderTractionReceivedEvent(const EventInfo& event) const; 107 bool BinderTractionAllocBufEvent(const EventInfo& event) const; 108 bool BinderTractionLockEvent(const EventInfo& event) const; 109 bool BinderTractionLockedEvent(const EventInfo& event) const; 110 bool BinderTractionUnLockEvent(const EventInfo& event) const; 111 bool SchedSwitchEvent(const EventInfo& event); 112 bool SchedBlockReasonEvent(const EventInfo& event); 113 bool ProcessExitEvent(const EventInfo& event) const; 114 bool ProcessFreeEvent(const EventInfo& event) const; 115 bool TaskRenameEvent(const EventInfo& event) const; 116 bool TaskNewtaskEvent(const EventInfo& event) const; 117 bool ParsePrintEvent(const EventInfo& event); 118 bool SchedWakeupEvent(const EventInfo& event) const; 119 bool SchedWakeupNewEvent(const EventInfo& event) const; 120 bool SchedWakingEvent(const EventInfo& event) const; 121 bool CpuIdleEvent(const EventInfo& event) const; 122 bool CpuFrequencyEvent(const EventInfo& event) const; 123 bool CpuFrequencyLimitsEvent(const EventInfo& event) const; 124 bool SuspendResumeEvent(const EventInfo& event) const; 125 bool WorkqueueExecuteStartEvent(const EventInfo& event) const; 126 bool WorkqueueExecuteEndEvent(const EventInfo& event) const; 127 bool ClockSetRateEvent(const EventInfo& event) const; 128 bool ClockEnableEvent(const EventInfo& event) const; 129 bool ClockDisableEvent(const EventInfo& event) const; 130 bool ClkSetRateEvent(const EventInfo& event) const; 131 bool ClkEnableEvent(const EventInfo& event) const; 132 bool ClkDisableEvent(const EventInfo& event) const; 133 bool IrqHandlerEntryEvent(const EventInfo& event) const; 134 bool IrqHandlerExitEvent(const EventInfo& event) const; 135 bool IpiHandlerEntryEvent(const EventInfo& event) const; 136 bool IpiHandlerExitEvent(const EventInfo& event) const; 137 bool SoftIrqEntryEvent(const EventInfo& event) const; 138 bool SoftIrqRaiseEvent(const EventInfo& event) const; 139 bool SoftIrqExitEvent(const EventInfo& event) const; 140 bool SysEnterEvent(const EventInfo& event) const; 141 bool SysExitEvent(const EventInfo& event) const; 142 bool OomScoreAdjUpdate(const EventInfo& event) const; 143 using FuncCall = std::function<bool(const EventInfo& event)>; 144 std::map<uint32_t, FuncCall> eventToFunctionMap_ = {}; 145 std::unordered_set<uint32_t> tids_ = {}; 146 std::unordered_set<uint32_t> pids_ = {}; 147 DataIndex workQueueId_ = 0; 148 PrintEventParser printEventParser_; 149 std::atomic<uint64_t> lastOverwrite_{0}; 150 std::atomic<uint64_t> ftraceStartTime_{std::numeric_limits<uint64_t>::max()}; 151 std::atomic<uint64_t> ftraceEndTime_{0}; 152 std::atomic<uint64_t> ftraceOriginStartTime_{std::numeric_limits<uint64_t>::max()}; 153 std::atomic<uint64_t> ftraceOriginEndTime_{0}; 154 std::deque<std::unique_ptr<EventInfo>> htraceEventList_ = {}; 155 const DataIndex signalGenerateId_ = traceDataCache_->GetDataIndex("signal_generate"); 156 const DataIndex signalDeliverId_ = traceDataCache_->GetDataIndex("signal_deliver"); 157 const DataIndex schedWakeupName_ = traceDataCache_->GetDataIndex("sched_wakeup"); 158 const DataIndex schedWakingName_ = traceDataCache_->GetDataIndex("sched_waking"); 159 const DataIndex schedWakeupNewName_ = traceDataCache_->GetDataIndex("sched_wakeup_new"); 160 const DataIndex cpuIdleName_ = traceDataCache_->GetDataIndex("cpu_idle"); 161 const DataIndex cpuFrequencyName_ = traceDataCache_->GetDataIndex("cpu_frequency"); 162 const DataIndex cpuFrequencyLimitMaxNameId = traceDataCache_->GetDataIndex("cpu_frequency_limits_max"); 163 const DataIndex cpuFrequencyLimitMinNameId = traceDataCache_->GetDataIndex("cpu_frequency_limits_min"); 164 const DataIndex sysEnterName_ = traceDataCache_->GetDataIndex("sys_enter"); 165 const DataIndex sysExitName_ = traceDataCache_->GetDataIndex("sys_exit"); 166 const DataIndex oomScoreAdjName_ = traceDataCache_->GetDataIndex("oom_score_adj"); 167 TraceStreamerConfig config_{}; 168 std::atomic<BuiltinClocks> clock_{TS_CLOCK_BOOTTIME}; 169 std::mutex mutex_; 170 }; 171 } // namespace TraceStreamer 172 } // namespace SysTuning 173 174 #endif // HTRACE_EVENT_PARSER_H_ 175