• 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 
16 #ifndef SRC_BYTRACE_EVENT_PARSER_H
17 #define SRC_BYTRACE_EVENT_PARSER_H
18 
19 #include <functional>
20 #include <vector>
21 
22 #include "common_types.h"
23 #include "event_parser_base.h"
24 #include "print_event_parser.h"
25 #include "trace_data_cache.h"
26 #include "trace_streamer_config.h"
27 #include "trace_streamer_filters.h"
28 
29 namespace SysTuning {
30 namespace TraceStreamer {
31 using ArgsMap = std::unordered_map<std::string, std::string>;
32 class BytraceEventParser : public EventParserBase {
33 private:
34     class EventInfo {
35     public:
EventInfo(uint64_t ts,BytraceLine li)36         EventInfo(uint64_t ts, BytraceLine li) : eventTimestamp(ts), line(li) {}
37         uint64_t eventTimestamp;
38         BytraceLine line;
39     };
40 
41 public:
42     BytraceEventParser(TraceDataCache* dataCache, const TraceStreamerFilters* filter);
43     void ParseDataItem(const BytraceLine& line);
44     void FilterAllEventsTemp();
45     void FilterAllEvents();
46     void BeginFilterEvents(EventInfo* event);
47     void Clear();
48 
49 private:
50     using FuncCall = std::function<bool(const ArgsMap& args, const BytraceLine line)>;
51     bool SchedSwitchEvent(const ArgsMap& args, const BytraceLine& line) const;
52     bool BlockedReason(const ArgsMap& args, const BytraceLine& line) const;
53     bool TaskRenameEvent(const ArgsMap& args, const BytraceLine& line) const;
54     bool TaskNewtaskEvent(const ArgsMap& args, const BytraceLine& line) const;
55     bool TracingMarkWriteOrPrintEvent(const ArgsMap& args, const BytraceLine& line);
56     bool SchedWakeupEvent(const ArgsMap& args, const BytraceLine& line) const;
57     bool SchedWakingEvent(const ArgsMap& args, const BytraceLine& line) const;
58     bool CpuIdleEvent(const ArgsMap& args, const BytraceLine& line) const;
59     bool CpuFrequencyEvent(const ArgsMap& args, const BytraceLine& line) const;
60     bool CpuFrequencyLimitsEvent(const ArgsMap& args, const BytraceLine& line) const;
61     bool WorkqueueExecuteStartEvent(const ArgsMap& args, const BytraceLine& line) const;
62     bool WorkqueueExecuteEndEvent(const ArgsMap& args, const BytraceLine& line) const;
63     bool ProcessExitEvent(const ArgsMap& args, const BytraceLine& line) const;
64     bool SetRateEvent(const ArgsMap& args, const BytraceLine& line) const;
65     bool ClockEnableEvent(const ArgsMap& args, const BytraceLine& line) const;
66     bool ClockDisableEvent(const ArgsMap& args, const BytraceLine& line) const;
67     bool RegulatorSetVoltageEvent(const ArgsMap& args, const BytraceLine& line) const;
68     bool RegulatorSetVoltageCompleteEvent(const ArgsMap& args, const BytraceLine& line) const;
69     bool RegulatorDisableEvent(const ArgsMap& args, const BytraceLine& line) const;
70     bool RegulatorDisableCompleteEvent(const ArgsMap& args, const BytraceLine& line) const;
71     bool IpiEntryEvent(const ArgsMap& args, const BytraceLine& line) const;
72     bool IpiExitEvent(const ArgsMap& args, const BytraceLine& line) const;
73     bool IrqHandlerEntryEvent(const ArgsMap& args, const BytraceLine& line) const;
74     bool IrqHandlerExitEvent(const ArgsMap& args, const BytraceLine& line) const;
75     bool SoftIrqRaiseEvent(const ArgsMap& args, const BytraceLine& line) const;
76     bool SoftIrqEntryEvent(const ArgsMap& args, const BytraceLine& line) const;
77     bool SoftIrqExitEvent(const ArgsMap& args, const BytraceLine& line) const;
78     bool BinderTransaction(const ArgsMap& args, const BytraceLine& line) const;
79     bool BinderTransactionReceived(const ArgsMap& args, const BytraceLine& line) const;
80     bool BinderTransactionAllocBufEvent(const ArgsMap& args, const BytraceLine& line) const;
81     void GetDataSegArgs(BytraceLine& bufLine, ArgsMap& args, uint32_t& tgid) const;
82     void InterruptEventInitialization();
83     void ClockEventInitialization();
84     void CpuEventInitialization();
85     void RegulatorEventInitialization();
86     void BinderEventInitialization();
87     void StackEventsInitialization();
88 
89     std::map<std::string, FuncCall> eventToFunctionMap_ = {};
90     const uint32_t MIN_SCHED_SWITCH_ARGS_COUNT = 6;
91     const uint32_t MIN_BLOCKED_REASON_ARGS_COUNT = 3;
92     const uint32_t MIN_SCHED_WAKEUP_ARGS_COUNT = 2;
93     const uint32_t MIN_TASK_RENAME_ARGS_COUNT = 2;
94     const uint32_t MIN_SCHED_WAKING_ARGS_COUNT = 4;
95     const uint32_t MIN_CPU_IDLE_ARGS_COUNT = 2;
96     const uint32_t MIN_CPU_FREQUENCY_ARGS_COUNT = 2;
97     const uint32_t MIN_PROCESS_EXIT_ARGS_COUNT = 2;
98     const uint32_t MIN_CLOCK_SET_RATE_ARGS_COUNT = 3;
99     const uint32_t MIN_CLOCK_ENABLE_ARGS_COUNT = 3;
100     const uint32_t MIN_CLOCK_DISABLE_ARGS_COUNT = 3;
101     const uint32_t MIN_IRQ_HANDLER_ENTRY_ARGS_COUNT = 2;
102     const uint32_t MIN_IRQ_HANDLER_EXIT_ARGS_COUNT = 2;
103     const uint32_t MIN_SOFTIRQ_ENTRY_ARGS_COUNT = 2;
104     const uint32_t MIN_SOFTIRQ_EXIT_ARGS_COUNT = 2;
105     const uint32_t MIN_BINDER_TRANSACTION_ARGS_COUNT = 7;
106     const uint32_t MIN_BINDER_TRANSACTION_RECEIVED_ARGS_COUNT = 1;
107     const uint32_t MIN_BINDER_TRANSACTION_ALLOC_BUF_ARGS_COUNT = 3;
108     std::vector<std::unique_ptr<EventInfo>> eventList_ = {};
109     PrintEventParser printEventParser_;
110     const DataIndex schedWakeupName_ = traceDataCache_->GetDataIndex("sched_wakeup");
111     const DataIndex schedWakingName_ = traceDataCache_->GetDataIndex("sched_waking");
112     const DataIndex ioWaitId_ = traceDataCache_->GetDataIndex("io_wait");
113     const DataIndex workQueueId_ = traceDataCache_->GetDataIndex("workqueue");
114     const DataIndex schedWakeupId_ = traceDataCache_->GetDataIndex("sched_wakeup");
115     const DataIndex schedBlockedReasonId_ = traceDataCache_->GetDataIndex("sched_blocked_reason");
116     const DataIndex cpuFrequencyLimitMaxNameId = traceDataCache_->GetDataIndex("cpu_frequency_limits_max");
117     const DataIndex cpuFrequencyLimitMinNameId = traceDataCache_->GetDataIndex("cpu_frequency_limits_min");
118 
119 protected:
120     TraceStreamerConfig config_{};
121 };
122 } // namespace TraceStreamer
123 } // namespace SysTuning
124 
125 #endif // SRC_BYTRACE_EVENT_PARSER_H
126