• 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 CPU_DETAIL_PARSER_H
16 #define CPU_DETAIL_PARSER_H
17 #include <queue>
18 #include "print_event_parser.h"
19 #include "trace_data_cache.h"
20 #include "trace_plugin_result.pb.h"
21 #include "trace_streamer_filters.h"
22 
23 namespace SysTuning {
24 namespace TraceStreamer {
25 constexpr uint32_t CPU_CORE_MAX = 30;
26 struct RawTraceEventInfo {
27     uint8_t cpuId = INVALID_UINT8;
28     uint32_t eventId = INVALID_UINT32;
29     std::unique_ptr<FtraceEvent> msgPtr;
30 };
31 class CpuDetailParser {
32 public:
33     CpuDetailParser(TraceDataCache *dataCache, const TraceStreamerFilters *ctx);
34     ~CpuDetailParser() = default;
35     void EventAppend(std::shared_ptr<RawTraceEventInfo> event);
36     void ResizeStandAloneCpuEventList(uint32_t cpuNum);
37     bool FilterAllEvents(FtraceCpuDetailMsg &cpuDetail, bool isFinished = false);
38     void FinishCpuDetailParser();
39     void Clear();
40 
41 private:
42     bool SortStandAloneCpuEventList(bool isFinished = false);
43     void UpdateCpuOverwrite(FtraceCpuDetailMsg &cpuDetail);
44     void DealEvent(const RawTraceEventInfo &event);
45     bool SchedSwitchEvent(const RawTraceEventInfo &event);
46     bool SchedBlockReasonEvent(const RawTraceEventInfo &event);
47     bool SchedWakeupEvent(const RawTraceEventInfo &event) const;
48     bool SchedWakingEvent(const RawTraceEventInfo &event) const;
49     bool SchedWakeupNewEvent(const RawTraceEventInfo &event) const;
50     bool ProcessExitEvent(const RawTraceEventInfo &event) const;
51     bool ProcessFreeEvent(const RawTraceEventInfo &event) const;
52     bool BinderTractionEvent(const RawTraceEventInfo &event) const;
53     bool BinderTractionReceivedEvent(const RawTraceEventInfo &event) const;
54     bool BinderTractionAllocBufEvent(const RawTraceEventInfo &event) const;
55     bool BinderTractionLockEvent(const RawTraceEventInfo &event) const;
56     bool BinderTractionLockedEvent(const RawTraceEventInfo &event) const;
57     bool BinderTractionUnLockEvent(const RawTraceEventInfo &event) const;
58     bool TaskRenameEvent(const RawTraceEventInfo &event) const;
59     bool TaskNewtaskEvent(const RawTraceEventInfo &event) const;
60     bool ParseTracingMarkWriteOrPrintEvent(const RawTraceEventInfo &event);
61     bool CpuIdleEvent(const RawTraceEventInfo &event) const;
62     bool CpuFrequencyEvent(const RawTraceEventInfo &event) const;
63     bool CpuFrequencyLimitsEvent(const RawTraceEventInfo &event) const;
64     bool SuspendResumeEvent(const RawTraceEventInfo &event) const;
65     bool WorkqueueExecuteStartEvent(const RawTraceEventInfo &event) const;
66     bool WorkqueueExecuteEndEvent(const RawTraceEventInfo &event) const;
67     bool IrqHandlerEntryEvent(const RawTraceEventInfo &event) const;
68     bool IrqHandlerExitEvent(const RawTraceEventInfo &event) const;
69     bool IpiHandlerEntryEvent(const RawTraceEventInfo &event) const;
70     bool IpiHandlerExitEvent(const RawTraceEventInfo &event) const;
71     bool SoftIrqEntryEvent(const RawTraceEventInfo &event) const;
72     bool SoftIrqRaiseEvent(const RawTraceEventInfo &event) const;
73     bool SoftIrqExitEvent(const RawTraceEventInfo &event) const;
74     bool DmaFenceInitEvent(const RawTraceEventInfo &event) const;
75     bool DmaFenceDestroyEvent(const RawTraceEventInfo &event) const;
76     bool DmaFenceEnableEvent(const RawTraceEventInfo &event) const;
77     bool DmaFenceSignaledEvent(const RawTraceEventInfo &event) const;
78     bool SetRateEvent(const RawTraceEventInfo &event) const;
79     bool ClockEnableEvent(const RawTraceEventInfo &event) const;
80     bool ClockDisableEvent(const RawTraceEventInfo &event) const;
81     bool RegulatorSetVoltageEvent(const RawTraceEventInfo &event) const;
82     bool RegulatorSetVoltageCompleteEvent(const RawTraceEventInfo &event) const;
83     bool RegulatorDisableEvent(const RawTraceEventInfo &event) const;
84     bool RegulatorDisableCompleteEvent(const RawTraceEventInfo &event) const;
85 
86     void InterruptEventInitialization();
87     void ClockEventInitialization();
88     void CpuEventInitialization();
89     void LockEventInitialization();
90     void BinderEventInitialization();
91     void StackEventsInitialization();
92     void VoltageEventInitialization();
93 
94 public:
95     uint32_t cpuCoreMax_ = CPU_CORE_MAX;
96 
97 private:
98     using FuncCall = std::function<bool(const RawTraceEventInfo &event)>;
99     const TraceStreamerFilters *streamFilters_;
100     TraceDataCache *traceDataCache_;
101     PrintEventParser printEventParser_;
102 
103     uint32_t eventPid_ = INVALID_UINT32;
104     uint32_t eventTid_ = INVALID_UINT32;
105     uint64_t lastOverwrite_ = 0;
106 
107     uint64_t curRawTraceEventNum_ = 0;
108     std::deque<std::shared_ptr<RawTraceEventInfo>> rawTraceEventList_ = {};
109     std::vector<std::queue<std::shared_ptr<RawTraceEventInfo>>> standAloneCpuEventList_ = {};
110     std::map<std::string, FuncCall> eventToFunctionMap_ = {};
111 
112     TraceStreamerConfig config_{};
113     const BuiltinClocks clock_ = TS_CLOCK_BOOTTIME;
114     const DataIndex schedWakeupIndex_ = traceDataCache_->GetDataIndex("sched_wakeup");
115     const DataIndex schedWakingIndex_ = traceDataCache_->GetDataIndex("sched_waking");
116     const DataIndex schedWakeupNewIndex_ = traceDataCache_->GetDataIndex("sched_wakeup_new");
117     const DataIndex cpuIdleIndex_ = traceDataCache_->GetDataIndex("cpu_idle");
118     const DataIndex cpuFrequencyIndex_ = traceDataCache_->GetDataIndex("cpu_frequency");
119     const DataIndex cpuFrequencyLimitMaxIndex_ = traceDataCache_->GetDataIndex("cpu_frequency_limits_max");
120     const DataIndex cpuFrequencyLimitMinIndex_ = traceDataCache_->GetDataIndex("cpu_frequency_limits_min");
121     const DataIndex workQueueIndex_ = traceDataCache_->GetDataIndex("workqueue");
122     const DataIndex dmaFenceInitIndex_ = traceDataCache_->GetDataIndex("dma_fence_init");
123     const DataIndex dmaFenceDestroyIndex_ = traceDataCache_->GetDataIndex("dma_fence_destroy");
124     const DataIndex dmaFenceEnableIndex_ = traceDataCache_->GetDataIndex("dma_fence_enable_signal");
125     const DataIndex dmaFenceSignaledIndex_ = traceDataCache_->GetDataIndex("dma_fence_signaled");
126 };
127 } // namespace TraceStreamer
128 } // namespace SysTuning
129 
130 #endif // CPU_DETAIL_PARSER_H_
131