Add support for scm start/end
Bug: 133389911
Change-Id: I36e0e024a0a1316e49ba61a9e8d89bee6e34be6d
diff --git a/Android.bp b/Android.bp
index 6d3a72d..fb923ad 100644
--- a/Android.bp
+++ b/Android.bp
@@ -3658,6 +3658,7 @@
"protos/perfetto/trace/ftrace/raw_syscalls.proto",
"protos/perfetto/trace/ftrace/regulator.proto",
"protos/perfetto/trace/ftrace/sched.proto",
+ "protos/perfetto/trace/ftrace/scm.proto",
"protos/perfetto/trace/ftrace/sde.proto",
"protos/perfetto/trace/ftrace/signal.proto",
"protos/perfetto/trace/ftrace/sync.proto",
@@ -3700,6 +3701,7 @@
"external/perfetto/protos/perfetto/trace/ftrace/raw_syscalls.gen.cc",
"external/perfetto/protos/perfetto/trace/ftrace/regulator.gen.cc",
"external/perfetto/protos/perfetto/trace/ftrace/sched.gen.cc",
+ "external/perfetto/protos/perfetto/trace/ftrace/scm.gen.cc",
"external/perfetto/protos/perfetto/trace/ftrace/sde.gen.cc",
"external/perfetto/protos/perfetto/trace/ftrace/signal.gen.cc",
"external/perfetto/protos/perfetto/trace/ftrace/sync.gen.cc",
@@ -3742,6 +3744,7 @@
"protos/perfetto/trace/ftrace/raw_syscalls.proto",
"protos/perfetto/trace/ftrace/regulator.proto",
"protos/perfetto/trace/ftrace/sched.proto",
+ "protos/perfetto/trace/ftrace/scm.proto",
"protos/perfetto/trace/ftrace/sde.proto",
"protos/perfetto/trace/ftrace/signal.proto",
"protos/perfetto/trace/ftrace/sync.proto",
@@ -3784,6 +3787,7 @@
"external/perfetto/protos/perfetto/trace/ftrace/raw_syscalls.gen.h",
"external/perfetto/protos/perfetto/trace/ftrace/regulator.gen.h",
"external/perfetto/protos/perfetto/trace/ftrace/sched.gen.h",
+ "external/perfetto/protos/perfetto/trace/ftrace/scm.gen.h",
"external/perfetto/protos/perfetto/trace/ftrace/sde.gen.h",
"external/perfetto/protos/perfetto/trace/ftrace/signal.gen.h",
"external/perfetto/protos/perfetto/trace/ftrace/sync.gen.h",
@@ -3830,6 +3834,7 @@
"protos/perfetto/trace/ftrace/raw_syscalls.proto",
"protos/perfetto/trace/ftrace/regulator.proto",
"protos/perfetto/trace/ftrace/sched.proto",
+ "protos/perfetto/trace/ftrace/scm.proto",
"protos/perfetto/trace/ftrace/sde.proto",
"protos/perfetto/trace/ftrace/signal.proto",
"protos/perfetto/trace/ftrace/sync.proto",
@@ -3871,6 +3876,7 @@
"external/perfetto/protos/perfetto/trace/ftrace/raw_syscalls.pb.cc",
"external/perfetto/protos/perfetto/trace/ftrace/regulator.pb.cc",
"external/perfetto/protos/perfetto/trace/ftrace/sched.pb.cc",
+ "external/perfetto/protos/perfetto/trace/ftrace/scm.pb.cc",
"external/perfetto/protos/perfetto/trace/ftrace/sde.pb.cc",
"external/perfetto/protos/perfetto/trace/ftrace/signal.pb.cc",
"external/perfetto/protos/perfetto/trace/ftrace/sync.pb.cc",
@@ -3913,6 +3919,7 @@
"protos/perfetto/trace/ftrace/raw_syscalls.proto",
"protos/perfetto/trace/ftrace/regulator.proto",
"protos/perfetto/trace/ftrace/sched.proto",
+ "protos/perfetto/trace/ftrace/scm.proto",
"protos/perfetto/trace/ftrace/sde.proto",
"protos/perfetto/trace/ftrace/signal.proto",
"protos/perfetto/trace/ftrace/sync.proto",
@@ -3954,6 +3961,7 @@
"external/perfetto/protos/perfetto/trace/ftrace/raw_syscalls.pb.h",
"external/perfetto/protos/perfetto/trace/ftrace/regulator.pb.h",
"external/perfetto/protos/perfetto/trace/ftrace/sched.pb.h",
+ "external/perfetto/protos/perfetto/trace/ftrace/scm.pb.h",
"external/perfetto/protos/perfetto/trace/ftrace/sde.pb.h",
"external/perfetto/protos/perfetto/trace/ftrace/signal.pb.h",
"external/perfetto/protos/perfetto/trace/ftrace/sync.pb.h",
@@ -4000,6 +4008,7 @@
"protos/perfetto/trace/ftrace/raw_syscalls.proto",
"protos/perfetto/trace/ftrace/regulator.proto",
"protos/perfetto/trace/ftrace/sched.proto",
+ "protos/perfetto/trace/ftrace/scm.proto",
"protos/perfetto/trace/ftrace/sde.proto",
"protos/perfetto/trace/ftrace/signal.proto",
"protos/perfetto/trace/ftrace/sync.proto",
@@ -4042,6 +4051,7 @@
"external/perfetto/protos/perfetto/trace/ftrace/raw_syscalls.pbzero.cc",
"external/perfetto/protos/perfetto/trace/ftrace/regulator.pbzero.cc",
"external/perfetto/protos/perfetto/trace/ftrace/sched.pbzero.cc",
+ "external/perfetto/protos/perfetto/trace/ftrace/scm.pbzero.cc",
"external/perfetto/protos/perfetto/trace/ftrace/sde.pbzero.cc",
"external/perfetto/protos/perfetto/trace/ftrace/signal.pbzero.cc",
"external/perfetto/protos/perfetto/trace/ftrace/sync.pbzero.cc",
@@ -4084,6 +4094,7 @@
"protos/perfetto/trace/ftrace/raw_syscalls.proto",
"protos/perfetto/trace/ftrace/regulator.proto",
"protos/perfetto/trace/ftrace/sched.proto",
+ "protos/perfetto/trace/ftrace/scm.proto",
"protos/perfetto/trace/ftrace/sde.proto",
"protos/perfetto/trace/ftrace/signal.proto",
"protos/perfetto/trace/ftrace/sync.proto",
@@ -4126,6 +4137,7 @@
"external/perfetto/protos/perfetto/trace/ftrace/raw_syscalls.pbzero.h",
"external/perfetto/protos/perfetto/trace/ftrace/regulator.pbzero.h",
"external/perfetto/protos/perfetto/trace/ftrace/sched.pbzero.h",
+ "external/perfetto/protos/perfetto/trace/ftrace/scm.pbzero.h",
"external/perfetto/protos/perfetto/trace/ftrace/sde.pbzero.h",
"external/perfetto/protos/perfetto/trace/ftrace/signal.pbzero.h",
"external/perfetto/protos/perfetto/trace/ftrace/sync.pbzero.h",
diff --git a/BUILD b/BUILD
index df060f8..07fdd72 100644
--- a/BUILD
+++ b/BUILD
@@ -2203,6 +2203,7 @@
"protos/perfetto/trace/ftrace/raw_syscalls.proto",
"protos/perfetto/trace/ftrace/regulator.proto",
"protos/perfetto/trace/ftrace/sched.proto",
+ "protos/perfetto/trace/ftrace/scm.proto",
"protos/perfetto/trace/ftrace/sde.proto",
"protos/perfetto/trace/ftrace/signal.proto",
"protos/perfetto/trace/ftrace/sync.proto",
diff --git a/protos/perfetto/trace/ftrace/all_protos.gni b/protos/perfetto/trace/ftrace/all_protos.gni
index 8d58926..a1deef0 100644
--- a/protos/perfetto/trace/ftrace/all_protos.gni
+++ b/protos/perfetto/trace/ftrace/all_protos.gni
@@ -43,6 +43,7 @@
"raw_syscalls.proto",
"regulator.proto",
"sched.proto",
+ "scm.proto",
"sde.proto",
"signal.proto",
"sync.proto",
diff --git a/protos/perfetto/trace/ftrace/ftrace_event.proto b/protos/perfetto/trace/ftrace/ftrace_event.proto
index 3947d46..2afe0a6 100644
--- a/protos/perfetto/trace/ftrace/ftrace_event.proto
+++ b/protos/perfetto/trace/ftrace/ftrace_event.proto
@@ -43,6 +43,7 @@
import "protos/perfetto/trace/ftrace/raw_syscalls.proto";
import "protos/perfetto/trace/ftrace/regulator.proto";
import "protos/perfetto/trace/ftrace/sched.proto";
+import "protos/perfetto/trace/ftrace/scm.proto";
import "protos/perfetto/trace/ftrace/sde.proto";
import "protos/perfetto/trace/ftrace/signal.proto";
import "protos/perfetto/trace/ftrace/sync.proto";
@@ -417,5 +418,7 @@
IonStatFtraceEvent ion_stat = 335;
IonBufferCreateFtraceEvent ion_buffer_create = 336;
IonBufferDestroyFtraceEvent ion_buffer_destroy = 337;
+ ScmCallStartFtraceEvent scm_call_start = 338;
+ ScmCallEndFtraceEvent scm_call_end = 339;
}
}
diff --git a/protos/perfetto/trace/ftrace/scm.proto b/protos/perfetto/trace/ftrace/scm.proto
new file mode 100644
index 0000000..22a80a5
--- /dev/null
+++ b/protos/perfetto/trace/ftrace/scm.proto
@@ -0,0 +1,13 @@
+// Autogenerated by:
+// ../../tools/ftrace_proto_gen/ftrace_proto_gen.cc
+// Do not edit.
+
+syntax = "proto2";
+package perfetto.protos;
+
+message ScmCallStartFtraceEvent {
+ optional uint32 arginfo = 1;
+ optional uint64 x0 = 2;
+ optional uint64 x5 = 3;
+}
+message ScmCallEndFtraceEvent {}
diff --git a/protos/perfetto/trace/perfetto_trace.proto b/protos/perfetto/trace/perfetto_trace.proto
index 457b7f4..f109c9e 100644
--- a/protos/perfetto/trace/perfetto_trace.proto
+++ b/protos/perfetto/trace/perfetto_trace.proto
@@ -4002,6 +4002,17 @@
// End of protos/perfetto/trace/ftrace/sched.proto
+// Begin of protos/perfetto/trace/ftrace/scm.proto
+
+message ScmCallStartFtraceEvent {
+ optional uint32 arginfo = 1;
+ optional uint64 x0 = 2;
+ optional uint64 x5 = 3;
+}
+message ScmCallEndFtraceEvent {}
+
+// End of protos/perfetto/trace/ftrace/scm.proto
+
// Begin of protos/perfetto/trace/ftrace/sde.proto
message SdeTracingMarkWriteFtraceEvent {
@@ -4485,6 +4496,8 @@
IonStatFtraceEvent ion_stat = 335;
IonBufferCreateFtraceEvent ion_buffer_create = 336;
IonBufferDestroyFtraceEvent ion_buffer_destroy = 337;
+ ScmCallStartFtraceEvent scm_call_start = 338;
+ ScmCallEndFtraceEvent scm_call_end = 339;
}
}
diff --git a/src/trace_processor/importers/ftrace/ftrace_parser.cc b/src/trace_processor/importers/ftrace/ftrace_parser.cc
index 859ab7e..bdf73a6 100644
--- a/src/trace_processor/importers/ftrace/ftrace_parser.cc
+++ b/src/trace_processor/importers/ftrace/ftrace_parser.cc
@@ -39,6 +39,7 @@
#include "protos/perfetto/trace/ftrace/power.pbzero.h"
#include "protos/perfetto/trace/ftrace/raw_syscalls.pbzero.h"
#include "protos/perfetto/trace/ftrace/sched.pbzero.h"
+#include "protos/perfetto/trace/ftrace/scm.pbzero.h"
#include "protos/perfetto/trace/ftrace/sde.pbzero.h"
#include "protos/perfetto/trace/ftrace/signal.pbzero.h"
#include "protos/perfetto/trace/ftrace/systrace.pbzero.h"
@@ -365,6 +366,14 @@
ParseClockDisable(ts, data);
break;
}
+ case FtraceEvent::kScmCallStartFieldNumber: {
+ ParseScmCallStart(ts, pid, data);
+ break;
+ }
+ case FtraceEvent::kScmCallEndFieldNumber: {
+ ParseScmCallEnd(ts, pid, data);
+ break;
+ }
default:
break;
}
@@ -891,5 +900,27 @@
context_->event_tracker->PushCounter(timestamp, rate, track);
}
+void FtraceParser::ParseScmCallStart(int64_t timestamp,
+ uint32_t pid,
+ ConstBytes blob) {
+ UniqueTid utid = context_->process_tracker->GetOrCreateThread(pid);
+ TrackId track_id = context_->track_tracker->InternThreadTrack(utid);
+ protos::pbzero::ScmCallStartFtraceEvent::Decoder evt(blob.data, blob.size);
+
+ char str[64];
+ sprintf(str, "scm id=%#" PRIx64, evt.x0());
+ StringId name_id = context_->storage->InternString(str);
+ context_->slice_tracker->Begin(timestamp, track_id, kNullStringId, name_id);
+}
+
+void FtraceParser::ParseScmCallEnd(int64_t timestamp,
+ uint32_t pid,
+ ConstBytes blob) {
+ protos::pbzero::ScmCallEndFtraceEvent::Decoder evt(blob.data, blob.size);
+ UniqueTid utid = context_->process_tracker->GetOrCreateThread(pid);
+ TrackId track_id = context_->track_tracker->InternThreadTrack(utid);
+ context_->slice_tracker->End(timestamp, track_id);
+}
+
} // namespace trace_processor
} // namespace perfetto
diff --git a/src/trace_processor/importers/ftrace/ftrace_parser.h b/src/trace_processor/importers/ftrace/ftrace_parser.h
index cb5ed46..7059915 100644
--- a/src/trace_processor/importers/ftrace/ftrace_parser.h
+++ b/src/trace_processor/importers/ftrace/ftrace_parser.h
@@ -101,6 +101,10 @@
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);
TraceProcessorContext* context_;
RssStatTracker rss_stat_tracker_;
diff --git a/src/traced/probes/ftrace/event_info.cc b/src/traced/probes/ftrace/event_info.cc
index 41b640b..752614c 100644
--- a/src/traced/probes/ftrace/event_info.cc
+++ b/src/traced/probes/ftrace/event_info.cc
@@ -5970,6 +5970,23 @@
kUnsetFtraceId,
242,
kUnsetSize},
+ {"scm_call_start",
+ "scm",
+ {
+ {kUnsetOffset, kUnsetSize, FtraceFieldType::kInvalidFtraceFieldType,
+ "arginfo", 1, ProtoSchemaType::kUint32,
+ TranslationStrategy::kInvalidTranslationStrategy},
+ {kUnsetOffset, kUnsetSize, FtraceFieldType::kInvalidFtraceFieldType,
+ "x0", 2, ProtoSchemaType::kUint64,
+ TranslationStrategy::kInvalidTranslationStrategy},
+ {kUnsetOffset, kUnsetSize, FtraceFieldType::kInvalidFtraceFieldType,
+ "x5", 3, ProtoSchemaType::kUint64,
+ TranslationStrategy::kInvalidTranslationStrategy},
+ },
+ kUnsetFtraceId,
+ 338,
+ kUnsetSize},
+ {"scm_call_end", "scm", {}, kUnsetFtraceId, 339, kUnsetSize},
{"tracing_mark_write",
"sde",
{
diff --git a/test/configs/scm.cfg b/test/configs/scm.cfg
new file mode 100644
index 0000000..109e175
--- /dev/null
+++ b/test/configs/scm.cfg
@@ -0,0 +1,17 @@
+buffers {
+ size_kb: 100024
+ fill_policy: RING_BUFFER
+}
+
+data_sources {
+ config {
+ name: "linux.ftrace"
+ target_buffer: 0
+ ftrace_config {
+ ftrace_events: "scm/scm_call_start"
+ ftrace_events: "scm/scm_call_end"
+ }
+ }
+}
+
+duration_ms: 10000
diff --git a/tools/ftrace_proto_gen/event_whitelist b/tools/ftrace_proto_gen/event_whitelist
index 52618e9..17697e5 100644
--- a/tools/ftrace_proto_gen/event_whitelist
+++ b/tools/ftrace_proto_gen/event_whitelist
@@ -332,3 +332,5 @@
ion/ion_stat
kmem/ion_buffer_create
kmem/ion_buffer_destroy
+scm/scm_call_start
+scm/scm_call_end