• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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