traced_probes: add mm_event/mm_event_record ftrace format file and protos

Bug: 118897434
Change-Id: I26ad28b78b7338abbe5950b467ec686eccda380f
diff --git a/Android.bp b/Android.bp
index dbf51dd..77bcbbd 100644
--- a/Android.bp
+++ b/Android.bp
@@ -1200,6 +1200,7 @@
     "protos/perfetto/trace/ftrace/kmem.proto",
     "protos/perfetto/trace/ftrace/lowmemorykiller.proto",
     "protos/perfetto/trace/ftrace/mdss.proto",
+    "protos/perfetto/trace/ftrace/mm_event.proto",
     "protos/perfetto/trace/ftrace/oom.proto",
     "protos/perfetto/trace/ftrace/power.proto",
     "protos/perfetto/trace/ftrace/regulator.proto",
@@ -1236,6 +1237,7 @@
     "external/perfetto/protos/perfetto/trace/ftrace/kmem.pb.cc",
     "external/perfetto/protos/perfetto/trace/ftrace/lowmemorykiller.pb.cc",
     "external/perfetto/protos/perfetto/trace/ftrace/mdss.pb.cc",
+    "external/perfetto/protos/perfetto/trace/ftrace/mm_event.pb.cc",
     "external/perfetto/protos/perfetto/trace/ftrace/oom.pb.cc",
     "external/perfetto/protos/perfetto/trace/ftrace/power.pb.cc",
     "external/perfetto/protos/perfetto/trace/ftrace/regulator.pb.cc",
@@ -1273,6 +1275,7 @@
     "protos/perfetto/trace/ftrace/kmem.proto",
     "protos/perfetto/trace/ftrace/lowmemorykiller.proto",
     "protos/perfetto/trace/ftrace/mdss.proto",
+    "protos/perfetto/trace/ftrace/mm_event.proto",
     "protos/perfetto/trace/ftrace/oom.proto",
     "protos/perfetto/trace/ftrace/power.proto",
     "protos/perfetto/trace/ftrace/regulator.proto",
@@ -1309,6 +1312,7 @@
     "external/perfetto/protos/perfetto/trace/ftrace/kmem.pb.h",
     "external/perfetto/protos/perfetto/trace/ftrace/lowmemorykiller.pb.h",
     "external/perfetto/protos/perfetto/trace/ftrace/mdss.pb.h",
+    "external/perfetto/protos/perfetto/trace/ftrace/mm_event.pb.h",
     "external/perfetto/protos/perfetto/trace/ftrace/oom.pb.h",
     "external/perfetto/protos/perfetto/trace/ftrace/power.pb.h",
     "external/perfetto/protos/perfetto/trace/ftrace/regulator.pb.h",
@@ -1349,6 +1353,7 @@
     "protos/perfetto/trace/ftrace/kmem.proto",
     "protos/perfetto/trace/ftrace/lowmemorykiller.proto",
     "protos/perfetto/trace/ftrace/mdss.proto",
+    "protos/perfetto/trace/ftrace/mm_event.proto",
     "protos/perfetto/trace/ftrace/oom.proto",
     "protos/perfetto/trace/ftrace/power.proto",
     "protos/perfetto/trace/ftrace/regulator.proto",
@@ -1386,6 +1391,7 @@
     "external/perfetto/protos/perfetto/trace/ftrace/kmem.pbzero.cc",
     "external/perfetto/protos/perfetto/trace/ftrace/lowmemorykiller.pbzero.cc",
     "external/perfetto/protos/perfetto/trace/ftrace/mdss.pbzero.cc",
+    "external/perfetto/protos/perfetto/trace/ftrace/mm_event.pbzero.cc",
     "external/perfetto/protos/perfetto/trace/ftrace/oom.pbzero.cc",
     "external/perfetto/protos/perfetto/trace/ftrace/power.pbzero.cc",
     "external/perfetto/protos/perfetto/trace/ftrace/regulator.pbzero.cc",
@@ -1423,6 +1429,7 @@
     "protos/perfetto/trace/ftrace/kmem.proto",
     "protos/perfetto/trace/ftrace/lowmemorykiller.proto",
     "protos/perfetto/trace/ftrace/mdss.proto",
+    "protos/perfetto/trace/ftrace/mm_event.proto",
     "protos/perfetto/trace/ftrace/oom.proto",
     "protos/perfetto/trace/ftrace/power.proto",
     "protos/perfetto/trace/ftrace/regulator.proto",
@@ -1460,6 +1467,7 @@
     "external/perfetto/protos/perfetto/trace/ftrace/kmem.pbzero.h",
     "external/perfetto/protos/perfetto/trace/ftrace/lowmemorykiller.pbzero.h",
     "external/perfetto/protos/perfetto/trace/ftrace/mdss.pbzero.h",
+    "external/perfetto/protos/perfetto/trace/ftrace/mm_event.pbzero.h",
     "external/perfetto/protos/perfetto/trace/ftrace/oom.pbzero.h",
     "external/perfetto/protos/perfetto/trace/ftrace/power.pbzero.h",
     "external/perfetto/protos/perfetto/trace/ftrace/regulator.pbzero.h",
diff --git a/protos/perfetto/trace/ftrace/all_protos.gni b/protos/perfetto/trace/ftrace/all_protos.gni
index bb4b609..23d9c1a 100644
--- a/protos/perfetto/trace/ftrace/all_protos.gni
+++ b/protos/perfetto/trace/ftrace/all_protos.gni
@@ -36,6 +36,7 @@
   "kmem.proto",
   "lowmemorykiller.proto",
   "mdss.proto",
+  "mm_event.proto",
   "oom.proto",
   "power.proto",
   "regulator.proto",
diff --git a/protos/perfetto/trace/ftrace/ftrace_event.proto b/protos/perfetto/trace/ftrace/ftrace_event.proto
index 847105a..75b80e5 100644
--- a/protos/perfetto/trace/ftrace/ftrace_event.proto
+++ b/protos/perfetto/trace/ftrace/ftrace_event.proto
@@ -21,6 +21,7 @@
 import "perfetto/trace/ftrace/kmem.proto";
 import "perfetto/trace/ftrace/lowmemorykiller.proto";
 import "perfetto/trace/ftrace/mdss.proto";
+import "perfetto/trace/ftrace/mm_event.proto";
 import "perfetto/trace/ftrace/oom.proto";
 import "perfetto/trace/ftrace/power.proto";
 import "perfetto/trace/ftrace/regulator.proto";
@@ -387,5 +388,6 @@
     SignalGenerateFtraceEvent signal_generate = 325;
     OomScoreAdjUpdateFtraceEvent oom_score_adj_update = 326;
     GenericFtraceEvent generic = 327;
+    MmEventRecordFtraceEvent mm_event_record = 328;
   }
 }
diff --git a/protos/perfetto/trace/ftrace/mm_event.proto b/protos/perfetto/trace/ftrace/mm_event.proto
new file mode 100644
index 0000000..063e214
--- /dev/null
+++ b/protos/perfetto/trace/ftrace/mm_event.proto
@@ -0,0 +1,14 @@
+// Autogenerated by:
+// ../../tools/ftrace_proto_gen/ftrace_proto_gen.cc
+// Do not edit.
+
+syntax = "proto2";
+option optimize_for = LITE_RUNTIME;
+package perfetto.protos;
+
+message MmEventRecordFtraceEvent {
+  optional uint32 avg_lat = 1;
+  optional uint32 count = 2;
+  optional uint32 max_lat = 3;
+  optional uint32 type = 4;
+}
diff --git a/protos/perfetto/trace/perfetto_trace.proto b/protos/perfetto/trace/perfetto_trace.proto
index 64c2755..b5ef041 100644
--- a/protos/perfetto/trace/perfetto_trace.proto
+++ b/protos/perfetto/trace/perfetto_trace.proto
@@ -1773,6 +1773,7 @@
     SignalGenerateFtraceEvent signal_generate = 325;
     // removed field with id 326
     GenericFtraceEvent generic = 327;
+    MmEventRecordFtraceEvent mm_event_record = 328;
   }
 }
 
@@ -2110,6 +2111,17 @@
 
 // End of protos/perfetto/trace/ftrace/lowmemorykiller.proto
 
+// Begin of protos/perfetto/trace/ftrace/mm_event.proto
+
+message MmEventRecordFtraceEvent {
+  optional uint32 avg_lat = 1;
+  optional uint32 count = 2;
+  optional uint32 max_lat = 3;
+  optional uint32 type = 4;
+}
+
+// End of protos/perfetto/trace/ftrace/mm_event.proto
+
 // Begin of protos/perfetto/trace/ftrace/power.proto
 
 message CpuFrequencyFtraceEvent {
diff --git a/src/trace_processor/ftrace_descriptors.cc b/src/trace_processor/ftrace_descriptors.cc
index 5c445fb..13d2176 100644
--- a/src/trace_processor/ftrace_descriptors.cc
+++ b/src/trace_processor/ftrace_descriptors.cc
@@ -8,7 +8,7 @@
 namespace trace_processor {
 namespace {
 
-std::array<MessageDescriptor, 328> descriptors{{
+std::array<MessageDescriptor, 329> descriptors{{
     {},
     {},
     {},
@@ -3181,6 +3181,16 @@
             {},
         },
     },
+    {
+        "mm_event_record",
+        {
+            {},
+            {"avg_lat", ProtoSchemaType::kUint32},
+            {"count", ProtoSchemaType::kUint32},
+            {"max_lat", ProtoSchemaType::kUint32},
+            {"type", ProtoSchemaType::kUint32},
+        },
+    },
 }};
 
 }  // namespace
diff --git a/src/traced/probes/ftrace/event_info.cc b/src/traced/probes/ftrace/event_info.cc
index f656bf4..f5bbd9f 100644
--- a/src/traced/probes/ftrace/event_info.cc
+++ b/src/traced/probes/ftrace/event_info.cc
@@ -3516,6 +3516,18 @@
   {
     events.emplace_back(Event{});
     Event* event = &events.back();
+    event->name = "mm_event_record";
+    event->group = "mm_event";
+    event->proto_field_id = 328;
+    event->fields.push_back(MakeField("avg_lat", 1, ProtoSchemaType::kUint32));
+    event->fields.push_back(MakeField("count", 2, ProtoSchemaType::kUint32));
+    event->fields.push_back(MakeField("max_lat", 3, ProtoSchemaType::kUint32));
+    event->fields.push_back(MakeField("type", 4, ProtoSchemaType::kUint32));
+  }
+
+  {
+    events.emplace_back(Event{});
+    Event* event = &events.back();
     event->name = "oom_score_adj_update";
     event->group = "oom";
     event->proto_field_id = 326;
diff --git a/src/traced/probes/ftrace/test/data/synthetic/events/mm_event/mm_event_record/format b/src/traced/probes/ftrace/test/data/synthetic/events/mm_event/mm_event_record/format
new file mode 100644
index 0000000..2e052c7
--- /dev/null
+++ b/src/traced/probes/ftrace/test/data/synthetic/events/mm_event/mm_event_record/format
@@ -0,0 +1,14 @@
+name: mm_event_record
+ID: 258
+format:
+	field:unsigned short common_type;	offset:0;	size:2;	signed:0;
+	field:unsigned char common_flags;	offset:2;	size:1;	signed:0;
+	field:unsigned char common_preempt_count;	offset:3;	size:1;	signed:0;
+	field:int common_pid;	offset:4;	size:4;	signed:1;
+
+	field:enum mm_event_type type;	offset:8;	size:4;	signed:0;
+	field:unsigned int count;	offset:12;	size:4;	signed:0;
+	field:unsigned int avg_lat;	offset:16;	size:4;	signed:0;
+	field:unsigned int max_lat;	offset:20;	size:4;	signed:0;
+
+print fmt: "%s count=%d avg_lat=%u max_lat=%u", __print_symbolic(REC->type, { MM_MIN_FAULT, "min_flt" }, { MM_MAJ_FAULT, "maj_flt" }, { MM_READ_IO, "read_io" }, { MM_COMPACTION, "compaction" }, { MM_RECLAIM, "reclaim" }, { MM_SWP_FAULT, "swp_flt" }, { MM_KERN_ALLOC, "kern_alloc" }), REC->count, REC->avg_lat, REC->max_lat
diff --git a/tools/ftrace_proto_gen/event_whitelist b/tools/ftrace_proto_gen/event_whitelist
index d2dd889..cfed0e8 100644
--- a/tools/ftrace_proto_gen/event_whitelist
+++ b/tools/ftrace_proto_gen/event_whitelist
@@ -322,3 +322,4 @@
 signal/signal_deliver
 signal/signal_generate
 oom/oom_score_adj_update
+mm_event/mm_event_record
diff --git a/tools/ftrace_proto_gen/main.cc b/tools/ftrace_proto_gen/main.cc
index bc99c4d..de15591 100644
--- a/tools/ftrace_proto_gen/main.cc
+++ b/tools/ftrace_proto_gen/main.cc
@@ -205,9 +205,17 @@
       uint32_t i = 0;
       for (; it->second != &whitelist[i]; i++)
         ;
+
       // The first id used for events in FtraceEvent proto is 3.
+      uint32_t proto_field = i + 3;
+
+      // The generic event has field id 327 so any event with a id higher
+      // than that has to be incremented by 1.
+      if (proto_field >= 327)
+        proto_field++;
+
       events_info.push_back(
-          perfetto::SingleEventInfo(proto, event.group(), i + 3));
+          perfetto::SingleEventInfo(proto, event.group(), proto_field));
 
       *fout << proto.ToString();
       PERFETTO_CHECK(!fout->fail());
diff --git a/tools/gen_merged_protos b/tools/gen_merged_protos
index 5f8a807..44544d5 100755
--- a/tools/gen_merged_protos
+++ b/tools/gen_merged_protos
@@ -57,6 +57,7 @@
   'protos/perfetto/trace/ftrace/generic.proto',
   'protos/perfetto/trace/ftrace/kmem.proto',
   'protos/perfetto/trace/ftrace/lowmemorykiller.proto',
+  'protos/perfetto/trace/ftrace/mm_event.proto',
   'protos/perfetto/trace/ftrace/power.proto',
   'protos/perfetto/trace/ftrace/sched.proto',
   'protos/perfetto/trace/ftrace/signal.proto',