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/parser_types.h" 23 #include "src/trace_processor/importers/common/system_info_tracker.h" 24 #include "src/trace_processor/importers/common/trace_parser.h" 25 #include "src/trace_processor/importers/ftrace/drm_tracker.h" 26 #include "src/trace_processor/importers/ftrace/ftrace_descriptors.h" 27 #include "src/trace_processor/importers/ftrace/iostat_tracker.h" 28 #include "src/trace_processor/importers/ftrace/mali_gpu_event_tracker.h" 29 #include "src/trace_processor/importers/ftrace/pkvm_hyp_cpu_tracker.h" 30 #include "src/trace_processor/importers/ftrace/rss_stat_tracker.h" 31 #include "src/trace_processor/importers/ftrace/sched_event_tracker.h" 32 #include "src/trace_processor/importers/ftrace/virtio_gpu_tracker.h" 33 #include "src/trace_processor/types/trace_processor_context.h" 34 35 #include <unordered_set> 36 37 namespace perfetto { 38 namespace trace_processor { 39 40 class FtraceParser { 41 public: 42 explicit FtraceParser(TraceProcessorContext* context); 43 44 void ParseFtraceStats(protozero::ConstBytes, uint32_t packet_sequence_id); 45 46 util::Status ParseFtraceEvent(uint32_t cpu, 47 int64_t ts, 48 const TracePacketData& data); 49 util::Status ParseInlineSchedSwitch(uint32_t cpu, 50 int64_t ts, 51 const InlineSchedSwitch& data); 52 util::Status ParseInlineSchedWaking(uint32_t cpu, 53 int64_t ts, 54 const InlineSchedWaking& data); 55 56 private: 57 void ParseGenericFtrace(int64_t timestamp, 58 uint32_t cpu, 59 uint32_t pid, 60 protozero::ConstBytes); 61 void ParseTypedFtraceToRaw(uint32_t ftrace_id, 62 int64_t timestamp, 63 uint32_t cpu, 64 uint32_t pid, 65 protozero::ConstBytes, 66 PacketSequenceStateGeneration*); 67 void ParseSchedSwitch(uint32_t cpu, int64_t timestamp, protozero::ConstBytes); 68 void ParseSchedWaking(int64_t timestamp, uint32_t pid, protozero::ConstBytes); 69 void ParseSchedProcessFree(int64_t timestamp, protozero::ConstBytes); 70 void ParseCpuFreq(int64_t timestamp, protozero::ConstBytes); 71 void ParseGpuFreq(int64_t timestamp, protozero::ConstBytes); 72 void ParseCpuIdle(int64_t timestamp, protozero::ConstBytes); 73 void ParsePrint(int64_t timestamp, uint32_t pid, protozero::ConstBytes); 74 void ParseZero(int64_t timestamp, uint32_t pid, protozero::ConstBytes); 75 void ParseSdeTracingMarkWrite(int64_t timestamp, 76 uint32_t pid, 77 protozero::ConstBytes); 78 void ParseDpuTracingMarkWrite(int64_t timestamp, 79 uint32_t pid, 80 protozero::ConstBytes); 81 void ParseG2dTracingMarkWrite(int64_t timestamp, 82 uint32_t pid, 83 protozero::ConstBytes); 84 void ParseMaliTracingMarkWrite(int64_t timestamp, 85 uint32_t pid, 86 protozero::ConstBytes); 87 void ParseLwisTracingMarkWrite(int64_t timestamp, 88 uint32_t pid, 89 protozero::ConstBytes); 90 void ParseIonHeapGrowOrShrink(int64_t timestamp, 91 uint32_t pid, 92 protozero::ConstBytes, 93 bool grow); 94 void ParseIonStat(int64_t timestamp, uint32_t pid, protozero::ConstBytes); 95 void ParseDmaHeapStat(int64_t timestamp, uint32_t pid, protozero::ConstBytes); 96 void ParseSignalGenerate(int64_t timestamp, protozero::ConstBytes); 97 void ParseSignalDeliver(int64_t timestamp, 98 uint32_t pid, 99 protozero::ConstBytes); 100 void ParseOOMScoreAdjUpdate(int64_t timestamp, protozero::ConstBytes); 101 void ParseOOMKill(int64_t timestamp, protozero::ConstBytes); 102 void ParseMmEventRecord(int64_t timestamp, 103 uint32_t pid, 104 protozero::ConstBytes); 105 void ParseSysEnterEvent(int64_t timestamp, 106 uint32_t pid, 107 protozero::ConstBytes); 108 void ParseSysExitEvent(int64_t timestamp, 109 uint32_t pid, 110 protozero::ConstBytes); 111 void ParseI2cReadEvent(int64_t timestamp, 112 uint32_t pid, 113 protozero::ConstBytes); 114 void ParseI2cWriteEvent(int64_t timestamp, 115 uint32_t pid, 116 protozero::ConstBytes); 117 void ParseI2cResultEvent(int64_t timestamp, 118 uint32_t pid, 119 protozero::ConstBytes); 120 void ParseTaskNewTask(int64_t timestamp, 121 uint32_t source_tid, 122 protozero::ConstBytes); 123 void ParseTaskRename(protozero::ConstBytes); 124 void ParseBinderTransaction(int64_t timestamp, 125 uint32_t pid, 126 protozero::ConstBytes); 127 void ParseBinderTransactionReceived(int64_t timestamp, 128 uint32_t pid, 129 protozero::ConstBytes); 130 void ParseBinderTransactionAllocBuf(int64_t timestamp, 131 uint32_t pid, 132 protozero::ConstBytes); 133 void ParseBinderLocked(int64_t timestamp, 134 uint32_t pid, 135 protozero::ConstBytes); 136 void ParseBinderLock(int64_t timestamp, uint32_t pid, protozero::ConstBytes); 137 void ParseBinderUnlock(int64_t timestamp, 138 uint32_t pid, 139 protozero::ConstBytes); 140 void ParseClockSetRate(int64_t timestamp, protozero::ConstBytes); 141 void ParseClockEnable(int64_t timestamp, protozero::ConstBytes); 142 void ParseClockDisable(int64_t timestamp, protozero::ConstBytes); 143 void ClockRate(int64_t timestamp, 144 base::StringView clock_name, 145 base::StringView subtitle, 146 uint64_t rate); 147 void ParseScmCallStart(int64_t timestamp, 148 uint32_t pid, 149 protozero::ConstBytes); 150 void ParseScmCallEnd(int64_t timestamp, uint32_t pid, protozero::ConstBytes); 151 void ParseCmaAllocStart(int64_t timestamp, uint32_t pid); 152 void ParseCmaAllocInfo(int64_t timestamp, 153 uint32_t pid, 154 protozero::ConstBytes); 155 void ParseDirectReclaimBegin(int64_t timestamp, 156 uint32_t pid, 157 protozero::ConstBytes); 158 void ParseDirectReclaimEnd(int64_t timestamp, 159 uint32_t pid, 160 protozero::ConstBytes); 161 void ParseShrinkSlabStart(int64_t timestamp, 162 uint32_t pid, 163 protozero::ConstBytes, 164 PacketSequenceStateGeneration* seq_state); 165 void ParseShrinkSlabEnd(int64_t timestamp, 166 uint32_t pid, 167 protozero::ConstBytes); 168 void ParseWorkqueueExecuteStart(uint32_t cpu, 169 int64_t timestamp, 170 uint32_t pid, 171 protozero::ConstBytes, 172 PacketSequenceStateGeneration* seq_state); 173 void ParseWorkqueueExecuteEnd(int64_t timestamp, 174 uint32_t pid, 175 protozero::ConstBytes); 176 void ParseIrqHandlerEntry(uint32_t cpu, 177 int64_t timestamp, 178 protozero::ConstBytes); 179 void ParseIrqHandlerExit(uint32_t cpu, 180 int64_t timestamp, 181 protozero::ConstBytes); 182 void ParseSoftIrqEntry(uint32_t cpu, 183 int64_t timestamp, 184 protozero::ConstBytes); 185 void ParseSoftIrqExit(uint32_t cpu, int64_t timestamp, protozero::ConstBytes); 186 void ParseGpuMemTotal(int64_t timestamp, protozero::ConstBytes); 187 void ParseThermalTemperature(int64_t timestamp, protozero::ConstBytes); 188 void ParseCdevUpdate(int64_t timestamp, protozero::ConstBytes); 189 void ParseSchedBlockedReason(protozero::ConstBytes, 190 PacketSequenceStateGeneration*); 191 void ParseFastRpcDmaStat(int64_t timestamp, 192 uint32_t pid, 193 protozero::ConstBytes); 194 void ParseCpuhpPause(int64_t, uint32_t, protozero::ConstBytes); 195 void ParseNetifReceiveSkb(uint32_t cpu, 196 int64_t timestamp, 197 protozero::ConstBytes); 198 void ParseNetDevXmit(uint32_t cpu, int64_t timestamp, protozero::ConstBytes); 199 void ParseInetSockSetState(int64_t timestamp, 200 uint32_t pid, 201 protozero::ConstBytes); 202 void ParseTcpRetransmitSkb(int64_t timestamp, protozero::ConstBytes); 203 void ParseNapiGroReceiveEntry(uint32_t cpu, 204 int64_t timestamp, 205 protozero::ConstBytes); 206 void ParseNapiGroReceiveExit(uint32_t cpu, 207 int64_t timestamp, 208 protozero::ConstBytes); 209 void ParseCpuFrequencyLimits(int64_t timestamp, protozero::ConstBytes); 210 void ParseKfreeSkb(int64_t timestamp, protozero::ConstBytes); 211 void ParseUfshcdCommand(int64_t timestamp, protozero::ConstBytes); 212 void ParseUfshcdClkGating(int64_t timestamp, protozero::ConstBytes); 213 214 void ParseCrosEcSensorhubData(int64_t timestamp, protozero::ConstBytes); 215 216 void ParseWakeSourceActivate(int64_t timestamp, protozero::ConstBytes); 217 void ParseWakeSourceDeactivate(int64_t timestamp, protozero::ConstBytes); 218 void ParseSuspendResume(int64_t timestamp, protozero::ConstBytes); 219 void ParseSuspendResumeMinimal(int64_t timestamp, protozero::ConstBytes); 220 void ParseSchedCpuUtilCfs(int64_t timestap, protozero::ConstBytes); 221 222 void ParseFuncgraphEntry(int64_t timestamp, 223 uint32_t pid, 224 protozero::ConstBytes blob, 225 PacketSequenceStateGeneration* seq_state); 226 void ParseFuncgraphExit(int64_t timestamp, 227 uint32_t pid, 228 protozero::ConstBytes blob, 229 PacketSequenceStateGeneration* seq_state); 230 231 void MaybeOnFirstFtraceEvent(); 232 StringId InternedKernelSymbolOrFallback( 233 uint64_t key, 234 PacketSequenceStateGeneration* seq_state); 235 void ParseTrustySmc(uint32_t pid, int64_t timestamp, protozero::ConstBytes); 236 void ParseTrustySmcDone(uint32_t pid, 237 int64_t timestamp, 238 protozero::ConstBytes); 239 void ParseTrustyStdCall32(uint32_t pid, 240 int64_t ts, 241 protozero::ConstBytes data); 242 void ParseTrustyStdCall32Done(uint32_t pid, 243 int64_t ts, 244 protozero::ConstBytes data); 245 void ParseTrustyShareMemory(uint32_t pid, int64_t ts, protozero::ConstBytes); 246 void ParseTrustyShareMemoryDone(uint32_t pid, 247 int64_t ts, 248 protozero::ConstBytes); 249 void ParseTrustyReclaimMemory(uint32_t pid, 250 int64_t ts, 251 protozero::ConstBytes); 252 void ParseTrustyReclaimMemoryDone(uint32_t pid, 253 int64_t ts, 254 protozero::ConstBytes); 255 void ParseTrustyIrq(uint32_t pid, int64_t ts, protozero::ConstBytes); 256 void ParseTrustyIpcHandleEvent(uint32_t pid, 257 int64_t ts, 258 protozero::ConstBytes); 259 void ParseTrustyIpcConnect(uint32_t pid, int64_t ts, protozero::ConstBytes); 260 void ParseTrustyIpcConnectEnd(uint32_t pid, 261 int64_t ts, 262 protozero::ConstBytes); 263 void ParseTrustyIpcWrite(uint32_t pid, int64_t ts, protozero::ConstBytes); 264 void ParseTrustyIpcWriteEnd(uint32_t pid, int64_t ts, protozero::ConstBytes); 265 void ParseTrustyIpcRead(uint32_t pid, int64_t ts, protozero::ConstBytes); 266 void ParseTrustyIpcReadEnd(uint32_t pid, int64_t ts, protozero::ConstBytes); 267 void ParseTrustyIpcPoll(uint32_t pid, int64_t ts, protozero::ConstBytes); 268 void ParseTrustyIpcRx(uint32_t pid, int64_t ts, protozero::ConstBytes); 269 void ParseTrustyEnqueueNop(uint32_t pid, int64_t ts, protozero::ConstBytes); 270 void ParseMaliKcpuCqsSet(uint32_t pid, int64_t ts); 271 void ParseMaliKcpuCqsWaitStart(uint32_t pid, int64_t ts); 272 void ParseMaliKcpuCqsWaitEnd(uint32_t pid, int64_t ts); 273 void ParseMaliKcpuFenceSignal(uint32_t pid, int64_t ts); 274 void ParseMaliKcpuFenceWaitStart(uint32_t pid, int64_t ts); 275 void ParseMaliKcpuFenceWaitEnd(uint32_t pid, int64_t ts); 276 277 TraceProcessorContext* context_; 278 RssStatTracker rss_stat_tracker_; 279 DrmTracker drm_tracker_; 280 IostatTracker iostat_tracker_; 281 VirtioGpuTracker virtio_gpu_tracker_; 282 MaliGpuEventTracker mali_gpu_event_tracker_; 283 PkvmHypervisorCpuTracker pkvm_hyp_cpu_tracker_; 284 285 const StringId sched_wakeup_name_id_; 286 const StringId sched_waking_name_id_; 287 const StringId cpu_id_; 288 const StringId cpu_freq_name_id_; 289 const StringId gpu_freq_name_id_; 290 const StringId cpu_idle_name_id_; 291 const StringId suspend_resume_name_id_; 292 const StringId suspend_resume_minimal_name_id_; 293 const StringId suspend_resume_minimal_slice_name_id_; 294 const StringId kfree_skb_name_id_; 295 const StringId ion_total_id_; 296 const StringId ion_change_id_; 297 const StringId ion_buffer_id_; 298 const StringId dma_heap_total_id_; 299 const StringId dma_heap_change_id_; 300 const StringId dma_buffer_id_; 301 const StringId ion_total_unknown_id_; 302 const StringId ion_change_unknown_id_; 303 const StringId signal_generate_id_; 304 const StringId signal_deliver_id_; 305 const StringId oom_score_adj_id_; 306 const StringId lmk_id_; 307 const StringId comm_name_id_; 308 const StringId signal_name_id_; 309 const StringId oom_kill_id_; 310 const StringId workqueue_id_; 311 const StringId irq_id_; 312 const StringId tcp_state_id_; 313 const StringId tcp_event_id_; 314 const StringId protocol_arg_id_; 315 const StringId napi_gro_id_; 316 const StringId tcp_retransmited_name_id_; 317 const StringId ret_arg_id_; 318 const StringId len_arg_id_; 319 const StringId direct_reclaim_nr_reclaimed_id_; 320 const StringId direct_reclaim_order_id_; 321 const StringId direct_reclaim_may_writepage_id_; 322 const StringId direct_reclaim_gfp_flags_id_; 323 const StringId vec_arg_id_; 324 const StringId gpu_mem_total_name_id_; 325 const StringId gpu_mem_total_unit_id_; 326 const StringId gpu_mem_total_global_desc_id_; 327 const StringId gpu_mem_total_proc_desc_id_; 328 const StringId io_wait_id_; 329 const StringId function_id_; 330 const StringId waker_utid_id_; 331 const StringId cros_ec_arg_num_id_; 332 const StringId cros_ec_arg_ec_id_; 333 const StringId cros_ec_arg_sample_ts_id_; 334 const StringId ufs_clkgating_id_; 335 const StringId ufs_command_count_id_; 336 const StringId shrink_slab_id_; 337 const StringId shrink_name_id_; 338 const StringId shrink_total_scan_id_; 339 const StringId shrink_freed_id_; 340 const StringId shrink_priority_id_; 341 const StringId trusty_category_id_; 342 const StringId trusty_name_trusty_std_id_; 343 const StringId trusty_name_tipc_rx_id_; 344 const StringId cma_alloc_id_; 345 const StringId cma_name_id_; 346 const StringId cma_pfn_id_; 347 const StringId cma_req_pages_id_; 348 const StringId cma_nr_migrated_id_; 349 const StringId cma_nr_reclaimed_id_; 350 const StringId cma_nr_mapped_id_; 351 const StringId cma_nr_isolate_fail_id_; 352 const StringId cma_nr_migrate_fail_id_; 353 const StringId cma_nr_test_fail_id_; 354 const StringId syscall_ret_id_; 355 const StringId syscall_args_id_; 356 const StringId replica_slice_id_; 357 std::vector<StringId> syscall_arg_name_ids_; 358 359 struct FtraceMessageStrings { 360 // The string id of name of the event field (e.g. sched_switch's id). 361 StringId message_name_id = kNullStringId; 362 std::array<StringId, kMaxFtraceEventFields> field_name_ids; 363 }; 364 std::vector<FtraceMessageStrings> ftrace_message_strings_; 365 366 struct MmEventCounterNames { 367 MmEventCounterNames() = default; MmEventCounterNamesMmEventCounterNames368 MmEventCounterNames(StringId _count, StringId _max_lat, StringId _avg_lat) 369 : count(_count), max_lat(_max_lat), avg_lat(_avg_lat) {} 370 371 StringId count = kNullStringId; 372 StringId max_lat = kNullStringId; 373 StringId avg_lat = kNullStringId; 374 }; 375 376 static constexpr size_t kFastRpcCounterSize = 4; 377 std::array<StringId, kFastRpcCounterSize> fast_rpc_delta_names_; 378 std::array<StringId, kFastRpcCounterSize> fast_rpc_total_names_; 379 380 // Keep kMmEventCounterSize equal to mm_event_type::MM_TYPE_NUM in the kernel. 381 static constexpr size_t kMmEventCounterSize = 7; 382 std::array<MmEventCounterNames, kMmEventCounterSize> mm_event_counter_names_; 383 384 // Record number of received bytes from the network interface card. 385 std::unordered_map<StringId, uint64_t> nic_received_bytes_; 386 387 // Record number of transmitted bytes to the network interface card. 388 std::unordered_map<StringId, uint64_t> nic_transmitted_bytes_; 389 390 // Record number of kfree_skb with ip protocol. 391 uint64_t num_of_kfree_skb_ip_prot = 0; 392 393 // Keep sock to stream number mapping. 394 std::unordered_map<uint64_t, uint32_t> skaddr_to_stream_; 395 396 // Record number of tcp steams. 397 uint32_t num_of_tcp_stream_ = 0; 398 399 // A name collision is possible, always show if active wakelock exists 400 // with a give name 401 std::unordered_map<std::string, uint32_t> active_wakelock_to_count_; 402 403 // Record whether a suspend resume action is ongoing. 404 std::unordered_map<std::string, bool> ongoing_suspend_resume_actions; 405 406 bool has_seen_first_ftrace_packet_ = false; 407 408 // Stores information about the timestamp from the metadata table which is 409 // used to filter ftrace packets which happen before this point. 410 int64_t drop_ftrace_data_before_ts_ = 0; 411 412 // Does not skip any ftrace events. 413 bool preserve_ftrace_buffer_ = false; 414 415 // Sequence ids for which ftrace_errors have been seen. Used to avoid 416 // putting them in the metadata multiple times (the ftrace data sources 417 // re-emits begin stats on every flush). 418 std::unordered_set<uint32_t> seen_errors_for_sequence_id_; 419 }; 420 421 } // namespace trace_processor 422 } // namespace perfetto 423 424 #endif // SRC_TRACE_PROCESSOR_IMPORTERS_FTRACE_FTRACE_PARSER_H_ 425