diff --git a/src/trace_processor/importers/common/args_tracker.h b/src/trace_processor/importers/common/args_tracker.h index 912d574ba4..bacd67be36 100644 --- a/src/trace_processor/importers/common/args_tracker.h +++ b/src/trace_processor/importers/common/args_tracker.h @@ -211,6 +211,10 @@ class ArgsTracker { id); } + BoundInserter AddArgsTo(tables::CpuTable::Id id) { + return AddArgsTo(context_->storage->mutable_cpu_table(), id); + } + // Returns a CompactArgSet which contains the args inserted into this // ArgsTracker. Requires that every arg in this tracker was inserted for the // "arg_set_id" column given by |column| at the given |row_number|. diff --git a/src/trace_processor/importers/proto/system_probes_parser.cc b/src/trace_processor/importers/proto/system_probes_parser.cc index ad153aafe5..c8eb1d2380 100644 --- a/src/trace_processor/importers/proto/system_probes_parser.cc +++ b/src/trace_processor/importers/proto/system_probes_parser.cc @@ -108,11 +108,21 @@ std::optional FingerprintToSdkVersion(const std::string& fingerprint) { return VersionStringToSdkVersion(version); } +struct ArmCpuIdentifier { + uint32_t implementer; + uint32_t architecture; + uint32_t variant; + uint32_t part; + uint32_t revision; +}; + struct CpuInfo { uint32_t cpu = 0; std::optional capacity; std::vector frequencies; protozero::ConstChars processor; + // Extend the variant to support additional identifiers + std::variant identifier = std::nullopt; }; struct CpuMaxFrequency { @@ -136,7 +146,14 @@ SystemProbesParser::SystemProbesParser(TraceProcessorContext* context) oom_score_adj_id_(context->storage->InternString("oom_score_adj")), thermal_unit_id_(context->storage->InternString("C")), gpufreq_id(context->storage->InternString("gpufreq")), - gpufreq_unit_id(context->storage->InternString("MHz")) { + gpufreq_unit_id(context->storage->InternString("MHz")), + arm_cpu_implementer( + context->storage->InternString("arm_cpu_implementer")), + arm_cpu_architecture( + context->storage->InternString("arm_cpu_architecture")), + arm_cpu_variant(context->storage->InternString("arm_cpu_variant")), + arm_cpu_part(context->storage->InternString("arm_cpu_part")), + arm_cpu_revision(context->storage->InternString("arm_cpu_revision")) { for (const auto& name : BuildMeminfoCounterNames()) { meminfo_strs_id_.emplace_back(context->storage->InternString(name)); } @@ -821,9 +838,11 @@ void SystemProbesParser::ParseCpuInfo(ConstBytes blob) { uint32_t cpu_id = 0; for (auto it = packet.cpus(); it; it++, cpu_id++) { protos::pbzero::CpuInfo::Cpu::Decoder cpu(*it); + CpuInfo current_cpu_info; current_cpu_info.cpu = cpu_id; current_cpu_info.processor = cpu.processor(); + for (auto freq_it = cpu.frequencies(); freq_it; freq_it++) { uint32_t current_cpu_frequency = *freq_it; current_cpu_info.frequencies.push_back(current_cpu_frequency); @@ -831,6 +850,18 @@ void SystemProbesParser::ParseCpuInfo(ConstBytes blob) { if (cpu.has_capacity()) { current_cpu_info.capacity = cpu.capacity(); } + + if (cpu.has_arm_identifier()) { + protos::pbzero::CpuInfo::ArmCpuIdentifier::Decoder identifier( + cpu.arm_identifier()); + + current_cpu_info.identifier = ArmCpuIdentifier{ + identifier.implementer(), identifier.architecture(), + identifier.variant(), identifier.part(), + identifier.revision(), + }; + } + cpu_infos.push_back(current_cpu_info); } @@ -900,6 +931,17 @@ void SystemProbesParser::ParseCpuInfo(ConstBytes blob) { cpu_freq_row.freq = frequency; context_->storage->mutable_cpu_freq_table()->Insert(cpu_freq_row); } + + if (auto* id = std::get_if(&cpu_info.identifier)) { + context_->args_tracker->AddArgsTo(ucpu) + .AddArg(arm_cpu_implementer, + Variadic::UnsignedInteger(id->implementer)) + .AddArg(arm_cpu_architecture, + Variadic::UnsignedInteger(id->architecture)) + .AddArg(arm_cpu_variant, Variadic::UnsignedInteger(id->variant)) + .AddArg(arm_cpu_part, Variadic::UnsignedInteger(id->part)) + .AddArg(arm_cpu_revision, Variadic::UnsignedInteger(id->revision)); + } } } diff --git a/src/trace_processor/importers/proto/system_probes_parser.h b/src/trace_processor/importers/proto/system_probes_parser.h index 2c879c827f..6863c3c08e 100644 --- a/src/trace_processor/importers/proto/system_probes_parser.h +++ b/src/trace_processor/importers/proto/system_probes_parser.h @@ -62,6 +62,14 @@ class SystemProbesParser { const StringId thermal_unit_id_; const StringId gpufreq_id; const StringId gpufreq_unit_id; + + // Arm CPU identifier string IDs + const StringId arm_cpu_implementer; + const StringId arm_cpu_architecture; + const StringId arm_cpu_variant; + const StringId arm_cpu_part; + const StringId arm_cpu_revision; + std::vector meminfo_strs_id_; std::vector vmstat_strs_id_; diff --git a/src/trace_processor/perfetto_sql/stdlib/prelude/tables_views.sql b/src/trace_processor/perfetto_sql/stdlib/prelude/tables_views.sql index 510c47d3b6..57a1e5c577 100644 --- a/src/trace_processor/perfetto_sql/stdlib/prelude/tables_views.sql +++ b/src/trace_processor/perfetto_sql/stdlib/prelude/tables_views.sql @@ -70,7 +70,9 @@ CREATE PERFETTO VIEW cpu ( -- relative performance of a CPU on a device -- For details see: -- https://www.kernel.org/doc/Documentation/devicetree/bindings/arm/cpu-capacity.txt - capacity UINT + capacity UINT, + -- Extra key/value pairs associated with this cpu. + arg_set_id UINT ) AS SELECT id, @@ -80,7 +82,8 @@ SELECT cluster_id, processor, machine_id, - capacity + capacity, + arg_set_id FROM __intrinsic_cpu WHERE diff --git a/src/trace_processor/tables/metadata_tables.py b/src/trace_processor/tables/metadata_tables.py index b55e147731..99cca68281 100644 --- a/src/trace_processor/tables/metadata_tables.py +++ b/src/trace_processor/tables/metadata_tables.py @@ -201,6 +201,7 @@ C('processor', CppString()), C('machine_id', CppOptional(CppTableId(MACHINE_TABLE))), C('capacity', CppOptional(CppUint32())), + C('arg_set_id', CppOptional(CppUint32())), ], tabledoc=TableDoc( doc=''' @@ -223,9 +224,11 @@ ''' Capacity of a CPU of a device, a metric which indicates the relative performance of a CPU on a device - For details see: + For details see: https://www.kernel.org/doc/Documentation/devicetree/bindings/arm/cpu-capacity.txt ''', + 'arg_set_id': + '''Extra args associated with the CPU''', })) RAW_TABLE = Table(