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