blob: abfb0e3ef0b4763f28be73e0c333e9b7ea3de06e [file] [log] [blame]
/*
* 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_