aboutsummaryrefslogtreecommitdiff
path: root/src/trace_processor/importers/ftrace/ftrace_parser.h
blob: abfb0e3ef0b4763f28be73e0c333e9b7ea3de06e (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
/*
 * Copyright (C) 2019 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

#ifndef SRC_TRACE_PROCESSOR_IMPORTERS_FTRACE_FTRACE_PARSER_H_
#define SRC_TRACE_PROCESSOR_IMPORTERS_FTRACE_FTRACE_PARSER_H_

#include "perfetto/trace_processor/status.h"
#include "src/trace_processor/importers/common/event_tracker.h"
#include "src/trace_processor/importers/common/parser_types.h"
#include "src/trace_processor/importers/common/system_info_tracker.h"
#include "src/trace_processor/importers/common/trace_parser.h"
#include "src/trace_processor/importers/ftrace/drm_tracker.h"
#include "src/trace_processor/importers/ftrace/ftrace_descriptors.h"
#include "src/trace_processor/importers/ftrace/iostat_tracker.h"
#include "src/trace_processor/importers/ftrace/mali_gpu_event_tracker.h"
#include "src/trace_processor/importers/ftrace/pkvm_hyp_cpu_tracker.h"
#include "src/trace_processor/importers/ftrace/rss_stat_tracker.h"
#include "src/trace_processor/importers/ftrace/sched_event_tracker.h"
#include "src/trace_processor/importers/ftrace/virtio_gpu_tracker.h"
#include "src/trace_processor/types/trace_processor_context.h"

#include <unordered_set>

namespace perfetto {
namespace trace_processor {

class FtraceParser {
 public:
  explicit FtraceParser(TraceProcessorContext* context);

  void ParseFtraceStats(protozero::ConstBytes, uint32_t packet_sequence_id);

  util::Status ParseFtraceEvent(uint32_t cpu,
                                int64_t ts,
                                const TracePacketData& data);
  util::Status ParseInlineSchedSwitch(uint32_t cpu,
                                      int64_t ts,
                                      const InlineSchedSwitch& data);
  util::Status ParseInlineSchedWaking(uint32_t cpu,
                                      int64_t ts,
                                      const InlineSchedWaking& data);

 private:
  void ParseGenericFtrace(int64_t timestamp,
                          uint32_t cpu,
                          uint32_t pid,
                          protozero::ConstBytes);
  void ParseTypedFtraceToRaw(uint32_t ftrace_id,
                             int64_t timestamp,
                             uint32_t cpu,
                             uint32_t pid,
                             protozero::ConstBytes,
                             PacketSequenceStateGeneration*);
  void ParseSchedSwitch(uint32_t cpu, int64_t timestamp, protozero::ConstBytes);
  void ParseSchedWaking(int64_t timestamp, uint32_t pid, protozero::ConstBytes);
  void ParseSchedProcessFree(int64_t timestamp, protozero::ConstBytes);
  void ParseCpuFreq(int64_t timestamp, protozero::ConstBytes);
  void ParseGpuFreq(int64_t timestamp, protozero::ConstBytes);
  void ParseCpuIdle(int64_t timestamp, protozero::ConstBytes);
  void ParsePrint(int64_t timestamp, uint32_t pid, protozero::ConstBytes);
  void ParseZero(int64_t timestamp, uint32_t pid, protozero::ConstBytes);
  void ParseSdeTracingMarkWrite(int64_t timestamp,
                                uint32_t pid,
                                protozero::ConstBytes);
  void ParseDpuTracingMarkWrite(int64_t timestamp,
                                uint32_t pid,
                                protozero::ConstBytes);
  void ParseG2dTracingMarkWrite(int64_t timestamp,
                                uint32_t pid,
                                protozero::ConstBytes);
  void ParseMaliTracingMarkWrite(int64_t timestamp,
                                 uint32_t pid,
                                 protozero::ConstBytes);
  void ParseLwisTracingMarkWrite(int64_t timestamp,
                                 uint32_t pid,
                                 protozero::ConstBytes);
  void ParseIonHeapGrowOrShrink(int64_t timestamp,
                                uint32_t pid,
                                protozero::ConstBytes,
                                bool grow);
  void ParseIonStat(int64_t timestamp, uint32_t pid, protozero::ConstBytes);
  void ParseDmaHeapStat(int64_t timestamp, uint32_t pid, protozero::ConstBytes);
  void ParseSignalGenerate(int64_t timestamp, protozero::ConstBytes);
  void ParseSignalDeliver(int64_t timestamp,
                          uint32_t pid,
                          protozero::ConstBytes);
  void ParseOOMScoreAdjUpdate(int64_t timestamp, protozero::ConstBytes);
  void ParseOOMKill(int64_t timestamp, protozero::ConstBytes);
  void ParseMmEventRecord(int64_t timestamp,
                          uint32_t pid,
                          protozero::ConstBytes);
  void ParseSysEnterEvent(int64_t timestamp,
                          uint32_t pid,
                          protozero::ConstBytes);
  void ParseSysExitEvent(int64_t timestamp,
                         uint32_t pid,
                         protozero::ConstBytes);
  void ParseI2cReadEvent(int64_t timestamp,
                         uint32_t pid,
                         protozero::ConstBytes);
  void ParseI2cWriteEvent(int64_t timestamp,
                          uint32_t pid,
                          protozero::ConstBytes);
  void ParseI2cResultEvent(int64_t timestamp,
                           uint32_t pid,
                           protozero::ConstBytes);
  void ParseTaskNewTask(int64_t timestamp,
                        uint32_t source_tid,
                        protozero::ConstBytes);
  void ParseTaskRename(protozero::ConstBytes);
  void ParseBinderTransaction(int64_t timestamp,
                              uint32_t pid,
                              protozero::ConstBytes);
  void ParseBinderTransactionReceived(int64_t timestamp,
                                      uint32_t pid,
                                      protozero::ConstBytes);
  void ParseBinderTransactionAllocBuf(int64_t timestamp,
                                      uint32_t pid,
                                      protozero::ConstBytes);
  void ParseBinderLocked(int64_t timestamp,
                         uint32_t pid,
                         protozero::ConstBytes);
  void ParseBinderLock(int64_t timestamp, uint32_t pid, protozero::ConstBytes);
  void ParseBinderUnlock(int64_t timestamp,
                         uint32_t pid,
                         protozero::ConstBytes);
  void ParseClockSetRate(int64_t timestamp, protozero::ConstBytes);
  void ParseClockEnable(int64_t timestamp, protozero::ConstBytes);
  void ParseClockDisable(int64_t timestamp, protozero::ConstBytes);
  void ClockRate(int64_t timestamp,
                 base::StringView clock_name,
                 base::StringView subtitle,
                 uint64_t rate);
  void ParseScmCallStart(int64_t timestamp,
                         uint32_t pid,
                         protozero::ConstBytes);
  void ParseScmCallEnd(int64_t timestamp, uint32_t pid, protozero::ConstBytes);
  void ParseCmaAllocStart(int64_t timestamp, uint32_t pid);
  void ParseCmaAllocInfo(int64_t timestamp,
                         uint32_t pid,
                         protozero::ConstBytes);
  void ParseDirectReclaimBegin(int64_t timestamp,
                               uint32_t pid,
                               protozero::ConstBytes);
  void ParseDirectReclaimEnd(int64_t timestamp,
                             uint32_t pid,
                             protozero::ConstBytes);
  void ParseShrinkSlabStart(int64_t timestamp,
                            uint32_t pid,
                            protozero::ConstBytes,
                            PacketSequenceStateGeneration* seq_state);
  void ParseShrinkSlabEnd(int64_t timestamp,
                          uint32_t pid,
                          protozero::ConstBytes);
  void ParseWorkqueueExecuteStart(uint32_t cpu,
                                  int64_t timestamp,
                                  uint32_t pid,
                                  protozero::ConstBytes,
                                  PacketSequenceStateGeneration* seq_state);
  void ParseWorkqueueExecuteEnd(int64_t timestamp,
                                uint32_t pid,
                                protozero::ConstBytes);
  void ParseIrqHandlerEntry(uint32_t cpu,
                            int64_t timestamp,
                            protozero::ConstBytes);
  void ParseIrqHandlerExit(uint32_t cpu,
                           int64_t timestamp,
                           protozero::ConstBytes);
  void ParseSoftIrqEntry(uint32_t cpu,
                         int64_t timestamp,
                         protozero::ConstBytes);
  void ParseSoftIrqExit(uint32_t cpu, int64_t timestamp, protozero::ConstBytes);
  void ParseGpuMemTotal(int64_t timestamp, protozero::ConstBytes);
  void ParseThermalTemperature(int64_t timestamp, protozero::ConstBytes);
  void ParseCdevUpdate(int64_t timestamp, protozero::ConstBytes);
  void ParseSchedBlockedReason(protozero::ConstBytes,
                               PacketSequenceStateGeneration*);
  void ParseFastRpcDmaStat(int64_t timestamp,
                           uint32_t pid,
                           protozero::ConstBytes);
  void ParseCpuhpPause(int64_t, uint32_t, protozero::ConstBytes);
  void ParseNetifReceiveSkb(uint32_t cpu,
                            int64_t timestamp,
                            protozero::ConstBytes);
  void ParseNetDevXmit(uint32_t cpu, int64_t timestamp, protozero::ConstBytes);
  void ParseInetSockSetState(int64_t timestamp,
                             uint32_t pid,
                             protozero::ConstBytes);
  void ParseTcpRetransmitSkb(int64_t timestamp, protozero::ConstBytes);
  void ParseNapiGroReceiveEntry(uint32_t cpu,
                                int64_t timestamp,
                                protozero::ConstBytes);
  void ParseNapiGroReceiveExit(uint32_t cpu,
                               int64_t timestamp,
                               protozero::ConstBytes);
  void ParseCpuFrequencyLimits(int64_t timestamp, protozero::ConstBytes);
  void ParseKfreeSkb(int64_t timestamp, protozero::ConstBytes);
  void ParseUfshcdCommand(int64_t timestamp, protozero::ConstBytes);
  void ParseUfshcdClkGating(int64_t timestamp, protozero::ConstBytes);

  void ParseCrosEcSensorhubData(int64_t timestamp, protozero::ConstBytes);

  void ParseWakeSourceActivate(int64_t timestamp, protozero::ConstBytes);
  void ParseWakeSourceDeactivate(int64_t timestamp, protozero::ConstBytes);
  void ParseSuspendResume(int64_t timestamp, protozero::ConstBytes);
  void ParseSchedCpuUtilCfs(int64_t timestap, protozero::ConstBytes);

  void ParseFuncgraphEntry(int64_t timestamp,
                           uint32_t pid,
                           protozero::ConstBytes blob,
                           PacketSequenceStateGeneration* seq_state);
  void ParseFuncgraphExit(int64_t timestamp,
                          uint32_t pid,
                          protozero::ConstBytes blob,
                          PacketSequenceStateGeneration* seq_state);

  void MaybeOnFirstFtraceEvent();
  StringId InternedKernelSymbolOrFallback(
      uint64_t key,
      PacketSequenceStateGeneration* seq_state);
  void ParseTrustySmc(uint32_t pid, int64_t timestamp, protozero::ConstBytes);
  void ParseTrustySmcDone(uint32_t pid,
                          int64_t timestamp,
                          protozero::ConstBytes);
  void ParseTrustyStdCall32(uint32_t pid,
                            int64_t ts,
                            protozero::ConstBytes data);
  void ParseTrustyStdCall32Done(uint32_t pid,
                                int64_t ts,
                                protozero::ConstBytes data);
  void ParseTrustyShareMemory(uint32_t pid, int64_t ts, protozero::ConstBytes);
  void ParseTrustyShareMemoryDone(uint32_t pid,
                                  int64_t ts,
                                  protozero::ConstBytes);
  void ParseTrustyReclaimMemory(uint32_t pid,
                                int64_t ts,
                                protozero::ConstBytes);
  void ParseTrustyReclaimMemoryDone(uint32_t pid,
                                    int64_t ts,
                                    protozero::ConstBytes);
  void ParseTrustyIrq(uint32_t pid, int64_t ts, protozero::ConstBytes);
  void ParseTrustyIpcHandleEvent(uint32_t pid,
                                 int64_t ts,
                                 protozero::ConstBytes);
  void ParseTrustyIpcConnect(uint32_t pid, int64_t ts, protozero::ConstBytes);
  void ParseTrustyIpcConnectEnd(uint32_t pid,
                                int64_t ts,
                                protozero::ConstBytes);
  void ParseTrustyIpcWrite(uint32_t pid, int64_t ts, protozero::ConstBytes);
  void ParseTrustyIpcWriteEnd(uint32_t pid, int64_t ts, protozero::ConstBytes);
  void ParseTrustyIpcRead(uint32_t pid, int64_t ts, protozero::ConstBytes);
  void ParseTrustyIpcReadEnd(uint32_t pid, int64_t ts, protozero::ConstBytes);
  void ParseTrustyIpcPoll(uint32_t pid, int64_t ts, protozero::ConstBytes);
  void ParseTrustyIpcRx(uint32_t pid, int64_t ts, protozero::ConstBytes);
  void ParseTrustyEnqueueNop(uint32_t pid, int64_t ts, protozero::ConstBytes);
  void ParseMaliKcpuCqsSet(uint32_t pid, int64_t ts);
  void ParseMaliKcpuCqsWaitStart(uint32_t pid, int64_t ts);
  void ParseMaliKcpuCqsWaitEnd(uint32_t pid, int64_t ts);
  void ParseMaliKcpuFenceSignal(uint32_t pid, int64_t ts);
  void ParseMaliKcpuFenceWaitStart(uint32_t pid, int64_t ts);
  void ParseMaliKcpuFenceWaitEnd(uint32_t pid, int64_t ts);

  TraceProcessorContext* context_;
  RssStatTracker rss_stat_tracker_;
  DrmTracker drm_tracker_;
  IostatTracker iostat_tracker_;
  VirtioGpuTracker virtio_gpu_tracker_;
  MaliGpuEventTracker mali_gpu_event_tracker_;
  PkvmHypervisorCpuTracker pkvm_hyp_cpu_tracker_;

  const StringId sched_wakeup_name_id_;
  const StringId sched_waking_name_id_;
  const StringId cpu_id_;
  const StringId cpu_freq_name_id_;
  const StringId gpu_freq_name_id_;
  const StringId cpu_idle_name_id_;
  const StringId suspend_resume_name_id_;
  const StringId kfree_skb_name_id_;
  const StringId ion_total_id_;
  const StringId ion_change_id_;
  const StringId ion_buffer_id_;
  const StringId dma_heap_total_id_;
  const StringId dma_heap_change_id_;
  const StringId dma_buffer_id_;
  const StringId ion_total_unknown_id_;
  const StringId ion_change_unknown_id_;
  const StringId signal_generate_id_;
  const StringId signal_deliver_id_;
  const StringId oom_score_adj_id_;
  const StringId lmk_id_;
  const StringId comm_name_id_;
  const StringId signal_name_id_;
  const StringId oom_kill_id_;
  const StringId workqueue_id_;
  const StringId irq_id_;
  const StringId tcp_state_id_;
  const StringId tcp_event_id_;
  const StringId protocol_arg_id_;
  const StringId napi_gro_id_;
  const StringId tcp_retransmited_name_id_;
  const StringId ret_arg_id_;
  const StringId len_arg_id_;
  const StringId direct_reclaim_nr_reclaimed_id_;
  const StringId direct_reclaim_order_id_;
  const StringId direct_reclaim_may_writepage_id_;
  const StringId direct_reclaim_gfp_flags_id_;
  const StringId vec_arg_id_;
  const StringId gpu_mem_total_name_id_;
  const StringId gpu_mem_total_unit_id_;
  const StringId gpu_mem_total_global_desc_id_;
  const StringId gpu_mem_total_proc_desc_id_;
  const StringId io_wait_id_;
  const StringId function_id_;
  const StringId waker_utid_id_;
  const StringId cros_ec_arg_num_id_;
  const StringId cros_ec_arg_ec_id_;
  const StringId cros_ec_arg_sample_ts_id_;
  const StringId ufs_clkgating_id_;
  const StringId ufs_command_count_id_;
  const StringId shrink_slab_id_;
  const StringId shrink_name_id_;
  const StringId shrink_total_scan_id_;
  const StringId shrink_freed_id_;
  const StringId shrink_priority_id_;
  const StringId trusty_category_id_;
  const StringId trusty_name_trusty_std_id_;
  const StringId trusty_name_tipc_rx_id_;
  const StringId cma_alloc_id_;
  const StringId cma_name_id_;
  const StringId cma_pfn_id_;
  const StringId cma_req_pages_id_;
  const StringId cma_nr_migrated_id_;
  const StringId cma_nr_reclaimed_id_;
  const StringId cma_nr_mapped_id_;
  const StringId cma_nr_isolate_fail_id_;
  const StringId cma_nr_migrate_fail_id_;
  const StringId cma_nr_test_fail_id_;
  const StringId syscall_ret_id_;
  const StringId syscall_args_id_;
  const StringId replica_slice_id_;
  std::vector<StringId> syscall_arg_name_ids_;

  struct FtraceMessageStrings {
    // The string id of name of the event field (e.g. sched_switch's id).
    StringId message_name_id = kNullStringId;
    std::array<StringId, kMaxFtraceEventFields> field_name_ids;
  };
  std::vector<FtraceMessageStrings> ftrace_message_strings_;

  struct MmEventCounterNames {
    MmEventCounterNames() = default;
    MmEventCounterNames(StringId _count, StringId _max_lat, StringId _avg_lat)
        : count(_count), max_lat(_max_lat), avg_lat(_avg_lat) {}

    StringId count = kNullStringId;
    StringId max_lat = kNullStringId;
    StringId avg_lat = kNullStringId;
  };

  static constexpr size_t kFastRpcCounterSize = 4;
  std::array<StringId, kFastRpcCounterSize> fast_rpc_delta_names_;
  std::array<StringId, kFastRpcCounterSize> fast_rpc_total_names_;

  // Keep kMmEventCounterSize equal to mm_event_type::MM_TYPE_NUM in the kernel.
  static constexpr size_t kMmEventCounterSize = 7;
  std::array<MmEventCounterNames, kMmEventCounterSize> mm_event_counter_names_;

  // Record number of received bytes from the network interface card.
  std::unordered_map<StringId, uint64_t> nic_received_bytes_;

  // Record number of transmitted bytes to the network interface card.
  std::unordered_map<StringId, uint64_t> nic_transmitted_bytes_;

  // Record number of kfree_skb with ip protocol.
  uint64_t num_of_kfree_skb_ip_prot = 0;

  // Keep sock to stream number mapping.
  std::unordered_map<uint64_t, uint32_t> skaddr_to_stream_;

  // Record number of tcp steams.
  uint32_t num_of_tcp_stream_ = 0;

  // A name collision is possible, always show if active wakelock exists
  // with a give name
  std::unordered_map<std::string, uint32_t> active_wakelock_to_count_;

  // Record whether a suspend resume action is ongoing.
  std::unordered_map<std::string, bool> ongoing_suspend_resume_actions;

  bool has_seen_first_ftrace_packet_ = false;

  // Stores information about the timestamp from the metadata table which is
  // used to filter ftrace packets which happen before this point.
  int64_t drop_ftrace_data_before_ts_ = 0;

  // Does not skip any ftrace events.
  bool preserve_ftrace_buffer_ = false;

  // Sequence ids for which ftrace_errors have been seen. Used to avoid
  // putting them in the metadata multiple times (the ftrace data sources
  // re-emits begin stats on every flush).
  std::unordered_set<uint32_t> seen_errors_for_sequence_id_;
};

}  // namespace trace_processor
}  // namespace perfetto

#endif  // SRC_TRACE_PROCESSOR_IMPORTERS_FTRACE_FTRACE_PARSER_H_