1 /* 2 * Copyright (c) Huawei Technologies Co., Ltd. 2023. All rights reserved. 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 "print_event_parser.h" 29 #include "trace_data_cache.h" 30 #include "trace_plugin_result.pbreader.h" 31 #include "trace_streamer_config.h" 32 #include "trace_streamer_filters.h" 33 #include "ts_common.h" 34 35 namespace SysTuning { 36 namespace TraceStreamer { 37 class HtraceEventParser : private EventParserBase { 38 public: 39 struct EventInfo { 40 int32_t pid = 0; 41 int32_t tgid = 0; 42 uint32_t cpu = 0; 43 SupportedTraceEventType eventType = TRACE_EVENT_OTHER; 44 uint64_t timeStamp = INVALID_UINT64; 45 DataIndex taskNameIndex; 46 std::string detail; 47 }; 48 49 public: 50 HtraceEventParser(TraceDataCache *dataCache, const TraceStreamerFilters *filter); 51 ~HtraceEventParser(); 52 void ParseDataItem(PbreaderDataSegment &tracePacket, 53 ProtoReader::TracePluginResult_Reader &tracePluginResult, 54 bool &haveSplitSeg); 55 void AppendEvent(std::unique_ptr<EventInfo> event); 56 void FilterAllEventsReader(); 57 void FilterAllEvents(); 58 void Clear(); 59 60 private: 61 // Initialization 62 void InterruptEventInitialization(); 63 void ClockEventInitialization(); 64 void CpuEventInitialization(); 65 void LockEventInitialization(); 66 void BinderEventInitialization(); 67 void StackEventsInitialization(); 68 69 bool BytesViewEventInfo(ProtoReader::BytesView &bytesView, 70 ProtoReader::BytesView bytesViewChange, 71 EventInfo &eventInfo, 72 const SupportedTraceEventType &enumerationClass); 73 bool ConstructEventSet(const ProtoReader::FtraceEvent_Reader &event, 74 EventInfo &eventInfo, 75 ProtoReader::BytesView &bytesView); 76 77 bool InterruptEventSet(const ProtoReader::FtraceEvent_Reader &event, 78 EventInfo &eventInfo, 79 ProtoReader::BytesView &bytesView); 80 bool ClockEventSet(const ProtoReader::FtraceEvent_Reader &event, 81 EventInfo &eventInfo, 82 ProtoReader::BytesView &bytesView); 83 bool CpuEventSet(const ProtoReader::FtraceEvent_Reader &event, 84 EventInfo &eventInfo, 85 ProtoReader::BytesView &bytesView); 86 bool LockEventSet(const ProtoReader::FtraceEvent_Reader &event, 87 EventInfo &eventInfo, 88 ProtoReader::BytesView &bytesView); 89 bool BinderEventSet(const ProtoReader::FtraceEvent_Reader &event, 90 EventInfo &eventInfo, 91 ProtoReader::BytesView &bytesView); 92 bool StackEventSet(const ProtoReader::FtraceEvent_Reader &event, 93 EventInfo &eventInfo, 94 ProtoReader::BytesView &bytesView); 95 96 bool SetEventType(const ProtoReader::FtraceEvent_Reader &event, 97 EventInfo &eventInfo, 98 ProtoReader::BytesView &bytesView); 99 void ProtoReaderDealEvent(EventInfo *eventInfo); 100 101 void ParserCpuEvent(PbreaderDataSegment &tracePacket, 102 SysTuning::ProtoReader::FtraceCpuDetailMsg_Reader &msg, 103 bool &haveSplitSeg); 104 bool BinderTractionEvent(const EventInfo &event) const; 105 bool BinderTractionReceivedEvent(const EventInfo &event) const; 106 bool BinderTractionAllocBufEvent(const EventInfo &event) const; 107 bool BinderTractionLockEvent(const EventInfo &event) const; 108 bool BinderTractionLockedEvent(const EventInfo &event) const; 109 bool BinderTractionUnLockEvent(const EventInfo &event) const; 110 bool SchedSwitchEvent(const EventInfo &event); 111 bool SchedBlockReasonEvent(const EventInfo &event); 112 bool ProcessExitEvent(const EventInfo &event) const; 113 bool ProcessFreeEvent(const EventInfo &event) const; 114 bool TaskRenameEvent(const EventInfo &event) const; 115 bool TaskNewtaskEvent(const EventInfo &event) const; 116 void DealPrintEvent(const EventInfo &event, const std::string &bufferLine); 117 bool ParsePrintEvent(const EventInfo &event); 118 #ifdef ENABLE_FFRT 119 bool ParseFfrtEvent(const EventInfo &event); 120 #endif 121 bool SchedWakeupEvent(const EventInfo &event) const; 122 bool SchedWakeupNewEvent(const EventInfo &event) const; 123 bool SchedWakingEvent(const EventInfo &event) const; 124 bool CpuIdleEvent(const EventInfo &event) const; 125 bool CpuFrequencyEvent(const EventInfo &event) const; 126 bool CpuFrequencyLimitsEvent(const EventInfo &event) const; 127 bool SuspendResumeEvent(const EventInfo &event) const; 128 bool WorkqueueExecuteStartEvent(const EventInfo &event) const; 129 bool WorkqueueExecuteEndEvent(const EventInfo &event) const; 130 bool ClockSetRateEvent(const EventInfo &event) const; 131 bool ClockEnableEvent(const EventInfo &event) const; 132 bool ClockDisableEvent(const EventInfo &event) const; 133 bool ClkSetRateEvent(const EventInfo &event) const; 134 bool ClkEnableEvent(const EventInfo &event) const; 135 bool ClkDisableEvent(const EventInfo &event) const; 136 bool IrqHandlerEntryEvent(const EventInfo &event) const; 137 bool IrqHandlerExitEvent(const EventInfo &event) const; 138 bool IpiHandlerEntryEvent(const EventInfo &event) const; 139 bool IpiHandlerExitEvent(const EventInfo &event) const; 140 bool SoftIrqEntryEvent(const EventInfo &event) const; 141 bool SoftIrqRaiseEvent(const EventInfo &event) const; 142 bool SoftIrqExitEvent(const EventInfo &event) const; 143 bool SysEnterEvent(const EventInfo &event) const; 144 bool SysExitEvent(const EventInfo &event) const; 145 bool OomScoreAdjUpdate(const EventInfo &event) const; 146 using FuncCall = std::function<bool(const EventInfo &event)>; 147 std::map<uint32_t, FuncCall> eventToFunctionMap_ = {}; 148 std::deque<std::unique_ptr<EventInfo>> htraceEventList_ = {}; 149 DataIndex workQueueId_ = 0; 150 PrintEventParser printEventParser_; 151 std::atomic<uint64_t> lastOverwrite_{0}; 152 std::atomic<uint64_t> ftraceStartTime_{std::numeric_limits<uint64_t>::max()}; 153 std::atomic<uint64_t> ftraceEndTime_{0}; 154 std::atomic<uint64_t> ftraceOriginStartTime_{std::numeric_limits<uint64_t>::max()}; 155 std::atomic<uint64_t> ftraceOriginEndTime_{0}; 156 const DataIndex schedWakeupName_ = traceDataCache_->GetDataIndex("sched_wakeup"); 157 const DataIndex schedWakingName_ = traceDataCache_->GetDataIndex("sched_waking"); 158 const DataIndex schedWakeupNewName_ = traceDataCache_->GetDataIndex("sched_wakeup_new"); 159 const DataIndex cpuIdleName_ = traceDataCache_->GetDataIndex("cpu_idle"); 160 const DataIndex cpuFrequencyName_ = traceDataCache_->GetDataIndex("cpu_frequency"); 161 const DataIndex cpuFrequencyLimitMaxNameId = traceDataCache_->GetDataIndex("cpu_frequency_limits_max"); 162 const DataIndex cpuFrequencyLimitMinNameId = traceDataCache_->GetDataIndex("cpu_frequency_limits_min"); 163 const DataIndex sysEnterName_ = traceDataCache_->GetDataIndex("sys_enter"); 164 const DataIndex sysExitName_ = traceDataCache_->GetDataIndex("sys_exit"); 165 const DataIndex oomScoreAdjName_ = traceDataCache_->GetDataIndex("oom_score_adj"); 166 TraceStreamerConfig config_{}; 167 std::atomic<BuiltinClocks> clock_{TS_CLOCK_BOOTTIME}; 168 std::mutex mutex_; 169 }; 170 } // namespace TraceStreamer 171 } // namespace SysTuning 172 173 #endif // HTRACE_EVENT_PARSER_H 174