1 /* 2 * Copyright (C) 2019 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 #ifndef SRC_TRACE_PROCESSOR_IMPORTERS_FTRACE_FTRACE_PARSER_H_ 18 #define SRC_TRACE_PROCESSOR_IMPORTERS_FTRACE_FTRACE_PARSER_H_ 19 20 #include "perfetto/trace_processor/status.h" 21 #include "src/trace_processor/importers/common/event_tracker.h" 22 #include "src/trace_processor/importers/common/trace_blob_view.h" 23 #include "src/trace_processor/importers/ftrace/ftrace_descriptors.h" 24 #include "src/trace_processor/importers/ftrace/rss_stat_tracker.h" 25 #include "src/trace_processor/importers/ftrace/sched_event_tracker.h" 26 #include "src/trace_processor/timestamped_trace_piece.h" 27 #include "src/trace_processor/types/trace_processor_context.h" 28 29 namespace perfetto { 30 namespace trace_processor { 31 32 class FtraceParser { 33 public: 34 explicit FtraceParser(TraceProcessorContext* context); 35 36 void ParseFtraceStats(protozero::ConstBytes); 37 38 util::Status ParseFtraceEvent(uint32_t cpu, const TimestampedTracePiece& ttp); 39 40 private: 41 void ParseGenericFtrace(int64_t timestamp, 42 uint32_t cpu, 43 uint32_t pid, 44 protozero::ConstBytes); 45 void ParseTypedFtraceToRaw(uint32_t ftrace_id, 46 int64_t timestamp, 47 uint32_t cpu, 48 uint32_t pid, 49 protozero::ConstBytes, 50 PacketSequenceStateGeneration*); 51 void ParseSchedSwitch(uint32_t cpu, int64_t timestamp, protozero::ConstBytes); 52 void ParseSchedWakeup(int64_t timestamp, protozero::ConstBytes); 53 void ParseSchedWaking(int64_t timestamp, protozero::ConstBytes); 54 void ParseSchedProcessFree(int64_t timestamp, protozero::ConstBytes); 55 void ParseCpuFreq(int64_t timestamp, protozero::ConstBytes); 56 void ParseGpuFreq(int64_t timestamp, protozero::ConstBytes); 57 void ParseCpuIdle(int64_t timestamp, protozero::ConstBytes); 58 void ParsePrint(int64_t timestamp, uint32_t pid, protozero::ConstBytes); 59 void ParseZero(int64_t timestamp, uint32_t pid, protozero::ConstBytes); 60 void ParseSdeTracingMarkWrite(int64_t timestamp, 61 uint32_t pid, 62 protozero::ConstBytes); 63 void ParseDpuTracingMarkWrite(int64_t timestamp, 64 uint32_t pid, 65 protozero::ConstBytes); 66 void ParseG2dTracingMarkWrite(int64_t timestamp, 67 uint32_t pid, 68 protozero::ConstBytes); 69 void ParseMaliTracingMarkWrite(int64_t timestamp, 70 uint32_t pid, 71 protozero::ConstBytes); 72 void ParseIonHeapGrowOrShrink(int64_t timestamp, 73 uint32_t pid, 74 protozero::ConstBytes, 75 bool grow); 76 void ParseIonStat(int64_t timestamp, uint32_t pid, protozero::ConstBytes); 77 void ParseDmaHeapStat(int64_t timestamp, uint32_t pid, protozero::ConstBytes); 78 void ParseSignalGenerate(int64_t timestamp, protozero::ConstBytes); 79 void ParseSignalDeliver(int64_t timestamp, 80 uint32_t pid, 81 protozero::ConstBytes); 82 void ParseLowmemoryKill(int64_t timestamp, protozero::ConstBytes); 83 void ParseOOMScoreAdjUpdate(int64_t timestamp, protozero::ConstBytes); 84 void ParseOOMKill(int64_t timestamp, protozero::ConstBytes); 85 void ParseMmEventRecord(int64_t timestamp, 86 uint32_t pid, 87 protozero::ConstBytes); 88 void ParseSysEvent(int64_t timestamp, 89 uint32_t pid, 90 bool is_enter, 91 protozero::ConstBytes); 92 void ParseTaskNewTask(int64_t timestamp, 93 uint32_t source_tid, 94 protozero::ConstBytes); 95 void ParseTaskRename(protozero::ConstBytes); 96 void ParseBinderTransaction(int64_t timestamp, 97 uint32_t pid, 98 protozero::ConstBytes); 99 void ParseBinderTransactionReceived(int64_t timestamp, 100 uint32_t pid, 101 protozero::ConstBytes); 102 void ParseBinderTransactionAllocBuf(int64_t timestamp, 103 uint32_t pid, 104 protozero::ConstBytes); 105 void ParseBinderLocked(int64_t timestamp, 106 uint32_t pid, 107 protozero::ConstBytes); 108 void ParseBinderLock(int64_t timestamp, uint32_t pid, protozero::ConstBytes); 109 void ParseBinderUnlock(int64_t timestamp, 110 uint32_t pid, 111 protozero::ConstBytes); 112 void ParseClockSetRate(int64_t timestamp, protozero::ConstBytes); 113 void ParseClockEnable(int64_t timestamp, protozero::ConstBytes); 114 void ParseClockDisable(int64_t timestamp, protozero::ConstBytes); 115 void ClockRate(int64_t timestamp, 116 base::StringView clock_name, 117 base::StringView subtitle, 118 uint64_t rate); 119 void ParseScmCallStart(int64_t timestamp, 120 uint32_t pid, 121 protozero::ConstBytes); 122 void ParseScmCallEnd(int64_t timestamp, uint32_t pid, protozero::ConstBytes); 123 void ParseWorkqueueExecuteStart(int64_t timestamp, 124 uint32_t pid, 125 protozero::ConstBytes, 126 PacketSequenceStateGeneration* seq_state); 127 void ParseWorkqueueExecuteEnd(int64_t timestamp, 128 uint32_t pid, 129 protozero::ConstBytes); 130 void ParseIrqHandlerEntry(uint32_t cpu, 131 int64_t timestamp, 132 protozero::ConstBytes); 133 void ParseIrqHandlerExit(uint32_t cpu, 134 int64_t timestamp, 135 protozero::ConstBytes); 136 void ParseSoftIrqEntry(uint32_t cpu, 137 int64_t timestamp, 138 protozero::ConstBytes); 139 void ParseSoftIrqExit(uint32_t cpu, int64_t timestamp, protozero::ConstBytes); 140 void ParseGpuMemTotal(int64_t timestamp, protozero::ConstBytes); 141 void ParseThermalTemperature(int64_t timestamp, protozero::ConstBytes); 142 void ParseCdevUpdate(int64_t timestamp, protozero::ConstBytes); 143 void ParseSchedBlockedReason(int64_t timestamp, 144 protozero::ConstBytes, 145 PacketSequenceStateGeneration*); 146 void ParseFastRpcDmaStat(int64_t timestamp, 147 uint32_t pid, 148 protozero::ConstBytes); 149 void ParseCpuhpPause(int64_t, uint32_t, protozero::ConstBytes); 150 151 TraceProcessorContext* context_; 152 RssStatTracker rss_stat_tracker_; 153 154 const StringId sched_wakeup_name_id_; 155 const StringId sched_waking_name_id_; 156 const StringId cpu_freq_name_id_; 157 const StringId gpu_freq_name_id_; 158 const StringId cpu_idle_name_id_; 159 const StringId ion_total_id_; 160 const StringId ion_change_id_; 161 const StringId ion_buffer_id_; 162 const StringId dma_heap_total_id_; 163 const StringId dma_heap_change_id_; 164 const StringId dma_buffer_id_; 165 const StringId ion_total_unknown_id_; 166 const StringId ion_change_unknown_id_; 167 const StringId signal_generate_id_; 168 const StringId signal_deliver_id_; 169 const StringId oom_score_adj_id_; 170 const StringId lmk_id_; 171 const StringId comm_name_id_; 172 const StringId signal_name_id_; 173 const StringId oom_kill_id_; 174 const StringId workqueue_id_; 175 const StringId irq_id_; 176 const StringId ret_arg_id_; 177 const StringId vec_arg_id_; 178 const StringId gpu_mem_total_name_id_; 179 const StringId gpu_mem_total_unit_id_; 180 const StringId gpu_mem_total_global_desc_id_; 181 const StringId gpu_mem_total_proc_desc_id_; 182 const StringId sched_blocked_reason_id_; 183 const StringId io_wait_id_; 184 const StringId function_id_; 185 186 struct FtraceMessageStrings { 187 // The string id of name of the event field (e.g. sched_switch's id). 188 StringId message_name_id = kNullStringId; 189 std::array<StringId, kMaxFtraceEventFields> field_name_ids; 190 }; 191 std::vector<FtraceMessageStrings> ftrace_message_strings_; 192 193 struct MmEventCounterNames { 194 MmEventCounterNames() = default; MmEventCounterNamesMmEventCounterNames195 MmEventCounterNames(StringId _count, StringId _max_lat, StringId _avg_lat) 196 : count(_count), max_lat(_max_lat), avg_lat(_avg_lat) {} 197 198 StringId count = kNullStringId; 199 StringId max_lat = kNullStringId; 200 StringId avg_lat = kNullStringId; 201 }; 202 203 static constexpr size_t kFastRpcCounterSize = 4; 204 std::array<StringId, kFastRpcCounterSize> fast_rpc_delta_names_; 205 std::array<StringId, kFastRpcCounterSize> fast_rpc_total_names_; 206 207 // Keep kMmEventCounterSize equal to mm_event_type::MM_TYPE_NUM in the kernel. 208 static constexpr size_t kMmEventCounterSize = 7; 209 std::array<MmEventCounterNames, kMmEventCounterSize> mm_event_counter_names_; 210 211 bool has_seen_first_ftrace_packet_ = false; 212 213 // Stores information about the timestamp from the metadata table which is 214 // used to filter ftrace packets which happen before this point. 215 int64_t drop_ftrace_data_before_ts_ = 0; 216 }; 217 218 } // namespace trace_processor 219 } // namespace perfetto 220 221 #endif // SRC_TRACE_PROCESSOR_IMPORTERS_FTRACE_FTRACE_PARSER_H_ 222