diff options
Diffstat (limited to 'src/trace_processor/importers/proto/perf_sample_tracker.cc')
-rw-r--r-- | src/trace_processor/importers/proto/perf_sample_tracker.cc | 72 |
1 files changed, 64 insertions, 8 deletions
diff --git a/src/trace_processor/importers/proto/perf_sample_tracker.cc b/src/trace_processor/importers/proto/perf_sample_tracker.cc index d14d2aaed..4da16addc 100644 --- a/src/trace_processor/importers/proto/perf_sample_tracker.cc +++ b/src/trace_processor/importers/proto/perf_sample_tracker.cc @@ -15,9 +15,11 @@ */ #include "src/trace_processor/importers/proto/perf_sample_tracker.h" -#include <inttypes.h> #include <stdio.h> +#include <cinttypes> + +#include "perfetto/ext/base/string_utils.h" #include "src/trace_processor/importers/common/track_tracker.h" #include "src/trace_processor/storage/trace_storage.h" #include "src/trace_processor/types/trace_processor_context.h" @@ -34,17 +36,53 @@ namespace { const char* StringifyCounter(int32_t counter) { using protos::pbzero::PerfEvents; switch (counter) { - case (PerfEvents::SW_CPU_CLOCK): + // software: + case PerfEvents::SW_CPU_CLOCK: return "cpu-clock"; - case (PerfEvents::SW_PAGE_FAULTS): + case PerfEvents::SW_PAGE_FAULTS: return "page-faults"; - case (PerfEvents::HW_CPU_CYCLES): + case PerfEvents::SW_TASK_CLOCK: + return "task-clock"; + case PerfEvents::SW_CONTEXT_SWITCHES: + return "context-switches"; + case PerfEvents::SW_CPU_MIGRATIONS: + return "cpu-migrations"; + case PerfEvents::SW_PAGE_FAULTS_MIN: + return "minor-faults"; + case PerfEvents::SW_PAGE_FAULTS_MAJ: + return "major-faults"; + case PerfEvents::SW_ALIGNMENT_FAULTS: + return "alignment-faults"; + case PerfEvents::SW_EMULATION_FAULTS: + return "emulation-faults"; + case PerfEvents::SW_DUMMY: + return "dummy"; + // hardware: + case PerfEvents::HW_CPU_CYCLES: return "cpu-cycles"; - case (PerfEvents::HW_INSTRUCTIONS): + case PerfEvents::HW_INSTRUCTIONS: return "instructions"; + case PerfEvents::HW_CACHE_REFERENCES: + return "cache-references"; + case PerfEvents::HW_CACHE_MISSES: + return "cache-misses"; + case PerfEvents::HW_BRANCH_INSTRUCTIONS: + return "branch-instructions"; + case PerfEvents::HW_BRANCH_MISSES: + return "branch-misses"; + case PerfEvents::HW_BUS_CYCLES: + return "bus-cycles"; + case PerfEvents::HW_STALLED_CYCLES_FRONTEND: + return "stalled-cycles-frontend"; + case PerfEvents::HW_STALLED_CYCLES_BACKEND: + return "stalled-cycles-backend"; + case PerfEvents::HW_REF_CPU_CYCLES: + return "ref-cycles"; + default: break; } + PERFETTO_DLOG("Unknown PerfEvents::Counter enum value"); return "unknown"; } @@ -55,11 +93,29 @@ StringId InternTimebaseCounterName( PerfSampleDefaults::Decoder perf_defaults(defaults->perf_sample_defaults()); PerfEvents::Timebase::Decoder timebase(perf_defaults.timebase()); - if (timebase.counter() != PerfEvents::UNKNOWN_COUNTER) { + auto config_given_name = timebase.name(); + if (config_given_name.size > 0) { + return context->storage->InternString(config_given_name); + } + if (timebase.has_counter()) { return context->storage->InternString(StringifyCounter(timebase.counter())); } - PerfEvents::Tracepoint::Decoder tracepoint(timebase.tracepoint()); - return context->storage->InternString(tracepoint.name()); + if (timebase.has_tracepoint()) { + PerfEvents::Tracepoint::Decoder tracepoint(timebase.tracepoint()); + return context->storage->InternString(tracepoint.name()); + } + if (timebase.has_raw_event()) { + PerfEvents::RawEvent::Decoder raw(timebase.raw_event()); + // This doesn't follow any pre-existing naming scheme, but aims to be a + // short-enough default that is distinguishable. + base::StackString<128> name( + "raw.0x%" PRIx32 ".0x%" PRIx64 ".0x%" PRIx64 ".0x%" PRIx64, raw.type(), + raw.config(), raw.config1(), raw.config2()); + return context->storage->InternString(name.string_view()); + } + + PERFETTO_DLOG("Could not name the perf timebase counter"); + return context->storage->InternString("unknown"); } } // namespace |