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