• 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 
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,const BytraceLine & li)36         EventInfo(uint64_t ts, const 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 FilterAllEvents();
45     void BeginFilterEvents(EventInfo *event);
46     void Clear();
47 
48 private:
49     using FuncCall = std::function<bool(const ArgsMap &args, const BytraceLine &line)>;
50     bool SchedSwitchEvent(const ArgsMap &args, const BytraceLine &line) const;
51     bool BlockedReason(const ArgsMap &args, const BytraceLine &line) const;
52     bool TaskRenameEvent(const ArgsMap &args, const BytraceLine &line) const;
53     bool TaskNewtaskEvent(const ArgsMap &args, const BytraceLine &line) const;
54     bool TracingMarkWriteOrPrintEvent(const ArgsMap &args, const BytraceLine &line);
55     bool SchedWakeupEvent(const ArgsMap &args, const BytraceLine &line) const;
56     bool SchedWakingEvent(const ArgsMap &args, const BytraceLine &line) const;
57     bool CpuIdleEvent(const ArgsMap &args, const BytraceLine &line) const;
58     bool CpuFrequencyEvent(const ArgsMap &args, const BytraceLine &line) const;
59     bool CpuFrequencyLimitsEvent(const ArgsMap &args, const BytraceLine &line) const;
60     bool WorkqueueExecuteStartEvent(const ArgsMap &args, const BytraceLine &line) const;
61     bool WorkqueueExecuteEndEvent(const ArgsMap &args, const BytraceLine &line) const;
62     bool ProcessExitEvent(const ArgsMap &args, const BytraceLine &line) const;
63     bool SetRateEvent(const ArgsMap &args, const BytraceLine &line) const;
64     bool ClockEnableEvent(const ArgsMap &args, const BytraceLine &line) const;
65     bool ClockDisableEvent(const ArgsMap &args, const BytraceLine &line) const;
66     bool RegulatorSetVoltageEvent(const ArgsMap &args, const BytraceLine &line) const;
67     bool RegulatorSetVoltageCompleteEvent(const ArgsMap &args, const BytraceLine &line) const;
68     bool RegulatorDisableEvent(const ArgsMap &args, const BytraceLine &line) const;
69     bool RegulatorDisableCompleteEvent(const ArgsMap &args, const BytraceLine &line) const;
70     bool IpiEntryEvent(const ArgsMap &args, const BytraceLine &line) const;
71     bool IpiExitEvent(const ArgsMap &args, const BytraceLine &line) const;
72     bool IrqHandlerEntryEvent(const ArgsMap &args, const BytraceLine &line) const;
73     bool IrqHandlerExitEvent(const ArgsMap &args, const BytraceLine &line) const;
74     bool SoftIrqRaiseEvent(const ArgsMap &args, const BytraceLine &line) const;
75     bool SoftIrqEntryEvent(const ArgsMap &args, const BytraceLine &line) const;
76     bool SoftIrqExitEvent(const ArgsMap &args, const BytraceLine &line) const;
77     bool DmaFenceEvent(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(const BytraceLine &bufLine, ArgsMap &args) 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     static const uint32_t MIN_SCHED_SWITCH_ARGS_COUNT = 6;
91     static const uint32_t MIN_BLOCKED_REASON_ARGS_COUNT = 3;
92     static const uint32_t MIN_SCHED_WAKEUP_ARGS_COUNT = 2;
93     static const uint32_t MIN_TASK_RENAME_ARGS_COUNT = 2;
94     static const uint32_t MIN_SCHED_WAKING_ARGS_COUNT = 4;
95     static const uint32_t MIN_CPU_IDLE_ARGS_COUNT = 2;
96     static const uint32_t MIN_CPU_FREQUENCY_ARGS_COUNT = 2;
97     static const uint32_t MIN_PROCESS_EXIT_ARGS_COUNT = 2;
98     static const uint32_t MIN_CLOCK_SET_RATE_ARGS_COUNT = 2;
99     static const uint32_t MIN_CLOCK_ENABLE_ARGS_COUNT = 3;
100     static const uint32_t MIN_CLOCK_DISABLE_ARGS_COUNT = 3;
101     static const uint32_t MIN_IRQ_HANDLER_ENTRY_ARGS_COUNT = 2;
102     static const uint32_t MIN_IRQ_HANDLER_EXIT_ARGS_COUNT = 2;
103     static const uint32_t MIN_SOFTIRQ_ENTRY_ARGS_COUNT = 2;
104     static const uint32_t MIN_SOFTIRQ_EXIT_ARGS_COUNT = 2;
105     static const uint32_t MIN_DMA_FENCE_ARGS_COUNT = 4;
106     static const uint32_t MIN_BINDER_TRANSACTION_ARGS_COUNT = 7;
107     static const uint32_t MIN_BINDER_TRANSACTION_RECEIVED_ARGS_COUNT = 1;
108     static const uint32_t MIN_BINDER_TRANSACTION_ALLOC_BUF_ARGS_COUNT = 3;
109     std::vector<std::unique_ptr<EventInfo>> eventList_ = {};
110     PrintEventParser printEventParser_;
111     const DataIndex schedWakeupName_ = traceDataCache_->GetDataIndex("sched_wakeup");
112     const DataIndex schedWakingName_ = traceDataCache_->GetDataIndex("sched_waking");
113     const DataIndex ioWaitId_ = traceDataCache_->GetDataIndex("io_wait");
114     const DataIndex workQueueId_ = traceDataCache_->GetDataIndex("workqueue");
115     const DataIndex schedWakeupId_ = traceDataCache_->GetDataIndex("sched_wakeup");
116     const DataIndex schedBlockedReasonId_ = traceDataCache_->GetDataIndex("sched_blocked_reason");
117     const DataIndex cpuFrequencyLimitMaxNameId = traceDataCache_->GetDataIndex("cpu_frequency_limits_max");
118     const DataIndex cpuFrequencyLimitMinNameId = traceDataCache_->GetDataIndex("cpu_frequency_limits_min");
119     const size_t maxBuffSize_ = 1000 * 1000;
120 
121 protected:
122     TraceStreamerConfig config_{};
123 };
124 } // namespace TraceStreamer
125 } // namespace SysTuning
126 
127 #endif // SRC_BYTRACE_EVENT_PARSER_H
128