Autogenerate protos and event_info.

Takes into account the existing ordering.

Bug: 77844626
Change-Id: Id2b54e00f4d4536ccb96335727bf7cfd66dca236
diff --git a/Android.bp b/Android.bp
index f36b881..1deeabe 100644
--- a/Android.bp
+++ b/Android.bp
@@ -3695,6 +3695,7 @@
   shared_libs: [
     "libandroid",
     "liblog",
+    "libprotobuf-cpp-full",
     "libprotobuf-cpp-lite",
   ],
   static_libs: [
diff --git a/protos/perfetto/trace/ftrace/all_protos.gni b/protos/perfetto/trace/ftrace/all_protos.gni
index 8e22fc6..daacb00 100644
--- a/protos/perfetto/trace/ftrace/all_protos.gni
+++ b/protos/perfetto/trace/ftrace/all_protos.gni
@@ -12,13 +12,124 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 
+# Autogenerated by ftrace_proto_gen.
+
 ftrace_proto_names = [
-  "binder_lock.proto",
-  "binder_locked.proto",
-  "binder_set_priority.proto",
+  "ftrace_event.proto",
+  "ftrace_event_bundle.proto",
+  "test_bundle_wrapper.proto",
+  "print.proto",
+  "sched_switch.proto",
+  "cpufreq_interactive_already.proto",
+  "cpufreq_interactive_boost.proto",
+  "cpufreq_interactive_notyet.proto",
+  "cpufreq_interactive_setspeed.proto",
+  "cpufreq_interactive_target.proto",
+  "cpufreq_interactive_unboost.proto",
+  "cpu_frequency.proto",
+  "cpu_frequency_limits.proto",
+  "cpu_idle.proto",
+  "clock_enable.proto",
+  "clock_disable.proto",
+  "clock_set_rate.proto",
+  "sched_wakeup.proto",
+  "sched_blocked_reason.proto",
+  "sched_cpu_hotplug.proto",
+  "sched_waking.proto",
+  "ipi_entry.proto",
+  "ipi_exit.proto",
+  "ipi_raise.proto",
+  "softirq_entry.proto",
+  "softirq_exit.proto",
+  "softirq_raise.proto",
+  "i2c_read.proto",
+  "i2c_write.proto",
+  "i2c_result.proto",
+  "i2c_reply.proto",
+  "smbus_read.proto",
+  "smbus_write.proto",
+  "smbus_result.proto",
+  "smbus_reply.proto",
+  "lowmemory_kill.proto",
+  "irq_handler_entry.proto",
+  "irq_handler_exit.proto",
+  "sync_pt.proto",
+  "sync_timeline.proto",
+  "sync_wait.proto",
+  "ext4_da_write_begin.proto",
+  "ext4_da_write_end.proto",
+  "ext4_sync_file_enter.proto",
+  "ext4_sync_file_exit.proto",
+  "block_rq_issue.proto",
+  "mm_vmscan_direct_reclaim_begin.proto",
+  "mm_vmscan_direct_reclaim_end.proto",
+  "mm_vmscan_kswapd_wake.proto",
+  "mm_vmscan_kswapd_sleep.proto",
   "binder_transaction.proto",
   "binder_transaction_received.proto",
+  "binder_set_priority.proto",
+  "binder_lock.proto",
+  "binder_locked.proto",
   "binder_unlock.proto",
+  "workqueue_activate_work.proto",
+  "workqueue_execute_end.proto",
+  "workqueue_execute_start.proto",
+  "workqueue_queue_work.proto",
+  "regulator_disable.proto",
+  "regulator_disable_complete.proto",
+  "regulator_enable.proto",
+  "regulator_enable_complete.proto",
+  "regulator_enable_delay.proto",
+  "regulator_set_voltage.proto",
+  "regulator_set_voltage_complete.proto",
+  "cgroup_attach_task.proto",
+  "cgroup_mkdir.proto",
+  "cgroup_remount.proto",
+  "cgroup_rmdir.proto",
+  "cgroup_transfer_tasks.proto",
+  "cgroup_destroy_root.proto",
+  "cgroup_release.proto",
+  "cgroup_rename.proto",
+  "cgroup_setup_root.proto",
+  "mdp_cmd_kickoff.proto",
+  "mdp_commit.proto",
+  "mdp_perf_set_ot.proto",
+  "mdp_sspp_change.proto",
+  "tracing_mark_write.proto",
+  "mdp_cmd_pingpong_done.proto",
+  "mdp_compare_bw.proto",
+  "mdp_perf_set_panic_luts.proto",
+  "mdp_sspp_set.proto",
+  "mdp_cmd_readptr_done.proto",
+  "mdp_misr_crc.proto",
+  "mdp_perf_set_qos_luts.proto",
+  "mdp_trace_counter.proto",
+  "mdp_cmd_release_bw.proto",
+  "mdp_mixer_update.proto",
+  "mdp_perf_set_wm_levels.proto",
+  "mdp_video_underrun_done.proto",
+  "mdp_cmd_wait_pingpong.proto",
+  "mdp_perf_prefill_calc.proto",
+  "mdp_perf_update_bus.proto",
+  "rotator_bw_ao_as_context.proto",
+  "mm_filemap_add_to_page_cache.proto",
+  "mm_filemap_delete_from_page_cache.proto",
+  "mm_compaction_begin.proto",
+  "mm_compaction_defer_compaction.proto",
+  "mm_compaction_deferred.proto",
+  "mm_compaction_defer_reset.proto",
+  "mm_compaction_end.proto",
+  "mm_compaction_finished.proto",
+  "mm_compaction_isolate_freepages.proto",
+  "mm_compaction_isolate_migratepages.proto",
+  "mm_compaction_kcompactd_sleep.proto",
+  "mm_compaction_kcompactd_wake.proto",
+  "mm_compaction_migratepages.proto",
+  "mm_compaction_suitable.proto",
+  "mm_compaction_try_to_compact_pages.proto",
+  "mm_compaction_wakeup_kcompactd.proto",
+  "suspend_resume.proto",
+  "sched_wakeup_new.proto",
   "block_bio_backmerge.proto",
   "block_bio_bounce.proto",
   "block_bio_complete.proto",
@@ -31,34 +142,12 @@
   "block_rq_abort.proto",
   "block_rq_complete.proto",
   "block_rq_insert.proto",
-  "block_rq_issue.proto",
   "block_rq_remap.proto",
   "block_rq_requeue.proto",
   "block_sleeprq.proto",
   "block_split.proto",
   "block_touch_buffer.proto",
   "block_unplug.proto",
-  "cgroup_attach_task.proto",
-  "cgroup_destroy_root.proto",
-  "cgroup_mkdir.proto",
-  "cgroup_release.proto",
-  "cgroup_remount.proto",
-  "cgroup_rename.proto",
-  "cgroup_rmdir.proto",
-  "cgroup_setup_root.proto",
-  "cgroup_transfer_tasks.proto",
-  "clock_disable.proto",
-  "clock_enable.proto",
-  "clock_set_rate.proto",
-  "cpu_frequency.proto",
-  "cpu_frequency_limits.proto",
-  "cpu_idle.proto",
-  "cpufreq_interactive_already.proto",
-  "cpufreq_interactive_boost.proto",
-  "cpufreq_interactive_notyet.proto",
-  "cpufreq_interactive_setspeed.proto",
-  "cpufreq_interactive_target.proto",
-  "cpufreq_interactive_unboost.proto",
   "ext4_alloc_da_blocks.proto",
   "ext4_allocate_blocks.proto",
   "ext4_allocate_inode.proto",
@@ -67,8 +156,6 @@
   "ext4_da_release_space.proto",
   "ext4_da_reserve_space.proto",
   "ext4_da_update_reserve_space.proto",
-  "ext4_da_write_begin.proto",
-  "ext4_da_write_end.proto",
   "ext4_da_write_pages.proto",
   "ext4_da_write_pages_extent.proto",
   "ext4_direct_IO_enter.proto",
@@ -139,8 +226,6 @@
   "ext4_remove_blocks.proto",
   "ext4_request_blocks.proto",
   "ext4_request_inode.proto",
-  "ext4_sync_file_enter.proto",
-  "ext4_sync_file_exit.proto",
   "ext4_sync_fs.proto",
   "ext4_trim_all_free.proto",
   "ext4_trim_extent.proto",
@@ -154,97 +239,14 @@
   "ext4_writepages.proto",
   "ext4_writepages_result.proto",
   "ext4_zero_range.proto",
-  "ftrace_event.proto",
-  "ftrace_event_bundle.proto",
-  "i2c_read.proto",
-  "i2c_reply.proto",
-  "i2c_result.proto",
-  "i2c_write.proto",
-  "ipi_entry.proto",
-  "ipi_exit.proto",
-  "ipi_raise.proto",
-  "irq_handler_entry.proto",
-  "irq_handler_exit.proto",
-  "lowmemory_kill.proto",
-  "mdp_cmd_kickoff.proto",
-  "mdp_cmd_pingpong_done.proto",
-  "mdp_cmd_readptr_done.proto",
-  "mdp_cmd_release_bw.proto",
-  "mdp_cmd_wait_pingpong.proto",
-  "mdp_commit.proto",
-  "mdp_compare_bw.proto",
-  "mdp_misr_crc.proto",
-  "mdp_mixer_update.proto",
-  "mdp_perf_prefill_calc.proto",
-  "mdp_perf_set_ot.proto",
-  "mdp_perf_set_panic_luts.proto",
-  "mdp_perf_set_qos_luts.proto",
-  "mdp_perf_set_wm_levels.proto",
-  "mdp_perf_update_bus.proto",
-  "mdp_sspp_change.proto",
-  "mdp_sspp_set.proto",
-  "mdp_trace_counter.proto",
-  "mdp_video_underrun_done.proto",
-  "mm_compaction_begin.proto",
-  "mm_compaction_defer_compaction.proto",
-  "mm_compaction_defer_reset.proto",
-  "mm_compaction_deferred.proto",
-  "mm_compaction_end.proto",
-  "mm_compaction_finished.proto",
-  "mm_compaction_isolate_freepages.proto",
-  "mm_compaction_isolate_migratepages.proto",
-  "mm_compaction_kcompactd_sleep.proto",
-  "mm_compaction_kcompactd_wake.proto",
-  "mm_compaction_migratepages.proto",
-  "mm_compaction_suitable.proto",
-  "mm_compaction_try_to_compact_pages.proto",
-  "mm_compaction_wakeup_kcompactd.proto",
-  "mm_filemap_add_to_page_cache.proto",
-  "mm_filemap_delete_from_page_cache.proto",
-  "mm_vmscan_direct_reclaim_begin.proto",
-  "mm_vmscan_direct_reclaim_end.proto",
-  "mm_vmscan_kswapd_sleep.proto",
-  "mm_vmscan_kswapd_wake.proto",
-  "print.proto",
-  "regulator_disable.proto",
-  "regulator_disable_complete.proto",
-  "regulator_enable.proto",
-  "regulator_enable_complete.proto",
-  "regulator_enable_delay.proto",
-  "regulator_set_voltage.proto",
-  "regulator_set_voltage_complete.proto",
-  "rotator_bw_ao_as_context.proto",
-  "sched_blocked_reason.proto",
-  "sched_cpu_hotplug.proto",
+  "task_newtask.proto",
+  "task_rename.proto",
   "sched_process_exec.proto",
   "sched_process_exit.proto",
   "sched_process_fork.proto",
   "sched_process_free.proto",
   "sched_process_hang.proto",
   "sched_process_wait.proto",
-  "sched_switch.proto",
-  "sched_wakeup.proto",
-  "sched_wakeup_new.proto",
-  "sched_waking.proto",
-  "smbus_read.proto",
-  "smbus_reply.proto",
-  "smbus_result.proto",
-  "smbus_write.proto",
-  "softirq_entry.proto",
-  "softirq_exit.proto",
-  "softirq_raise.proto",
-  "suspend_resume.proto",
-  "sync_pt.proto",
-  "sync_timeline.proto",
-  "sync_wait.proto",
-  "task_newtask.proto",
-  "task_rename.proto",
-  "test_bundle_wrapper.proto",
-  "tracing_mark_write.proto",
-  "workqueue_activate_work.proto",
-  "workqueue_execute_end.proto",
-  "workqueue_execute_start.proto",
-  "workqueue_queue_work.proto",
   "f2fs_do_submit_bio.proto",
   "f2fs_evict_inode.proto",
   "f2fs_fallocate.proto",
diff --git a/protos/perfetto/trace/ftrace/ext4_da_reserve_space.proto b/protos/perfetto/trace/ftrace/ext4_da_reserve_space.proto
index 841fa55..3ef7a4a 100644
--- a/protos/perfetto/trace/ftrace/ext4_da_reserve_space.proto
+++ b/protos/perfetto/trace/ftrace/ext4_da_reserve_space.proto
@@ -13,4 +13,5 @@
   optional int32 reserved_data_blocks = 4;
   optional int32 reserved_meta_blocks = 5;
   optional uint32 mode = 6;
+  optional int32 md_needed = 7;
 }
diff --git a/protos/perfetto/trace/ftrace/ext4_da_write_pages.proto b/protos/perfetto/trace/ftrace/ext4_da_write_pages.proto
index 1d3c076..8c4b0be 100644
--- a/protos/perfetto/trace/ftrace/ext4_da_write_pages.proto
+++ b/protos/perfetto/trace/ftrace/ext4_da_write_pages.proto
@@ -12,4 +12,9 @@
   optional uint64 first_page = 3;
   optional int64 nr_to_write = 4;
   optional int32 sync_mode = 5;
+  optional uint64 b_blocknr = 6;
+  optional uint32 b_size = 7;
+  optional uint32 b_state = 8;
+  optional int32 io_done = 9;
+  optional int32 pages_written = 10;
 }
diff --git a/protos/perfetto/trace/ftrace/ext4_es_find_delayed_extent_range_exit.proto b/protos/perfetto/trace/ftrace/ext4_es_find_delayed_extent_range_exit.proto
index fd50288..9ea11d6 100644
--- a/protos/perfetto/trace/ftrace/ext4_es_find_delayed_extent_range_exit.proto
+++ b/protos/perfetto/trace/ftrace/ext4_es_find_delayed_extent_range_exit.proto
@@ -12,5 +12,5 @@
   optional uint32 lblk = 3;
   optional uint32 len = 4;
   optional uint64 pblk = 5;
-  optional uint32 status = 6;
+  optional uint64 status = 6;
 }
diff --git a/protos/perfetto/trace/ftrace/ext4_es_insert_extent.proto b/protos/perfetto/trace/ftrace/ext4_es_insert_extent.proto
index aca9db7..22289b1 100644
--- a/protos/perfetto/trace/ftrace/ext4_es_insert_extent.proto
+++ b/protos/perfetto/trace/ftrace/ext4_es_insert_extent.proto
@@ -12,5 +12,5 @@
   optional uint32 lblk = 3;
   optional uint32 len = 4;
   optional uint64 pblk = 5;
-  optional uint32 status = 6;
+  optional uint64 status = 6;
 }
diff --git a/protos/perfetto/trace/ftrace/ext4_es_lookup_extent_exit.proto b/protos/perfetto/trace/ftrace/ext4_es_lookup_extent_exit.proto
index e7ca8e4..b2f3669 100644
--- a/protos/perfetto/trace/ftrace/ext4_es_lookup_extent_exit.proto
+++ b/protos/perfetto/trace/ftrace/ext4_es_lookup_extent_exit.proto
@@ -12,6 +12,6 @@
   optional uint32 lblk = 3;
   optional uint32 len = 4;
   optional uint64 pblk = 5;
-  optional uint32 status = 6;
+  optional uint64 status = 6;
   optional int32 found = 7;
 }
diff --git a/protos/perfetto/trace/ftrace/ext4_fallocate_enter.proto b/protos/perfetto/trace/ftrace/ext4_fallocate_enter.proto
index 162779f..4f32d7f 100644
--- a/protos/perfetto/trace/ftrace/ext4_fallocate_enter.proto
+++ b/protos/perfetto/trace/ftrace/ext4_fallocate_enter.proto
@@ -12,4 +12,5 @@
   optional int64 offset = 3;
   optional int64 len = 4;
   optional int32 mode = 5;
+  optional int64 pos = 6;
 }
diff --git a/protos/perfetto/trace/ftrace/ext4_invalidatepage.proto b/protos/perfetto/trace/ftrace/ext4_invalidatepage.proto
index ce49c38..d62307a 100644
--- a/protos/perfetto/trace/ftrace/ext4_invalidatepage.proto
+++ b/protos/perfetto/trace/ftrace/ext4_invalidatepage.proto
@@ -10,6 +10,6 @@
   optional uint64 dev = 1;
   optional uint64 ino = 2;
   optional uint64 index = 3;
-  optional uint32 offset = 4;
+  optional uint64 offset = 4;
   optional uint32 length = 5;
 }
diff --git a/protos/perfetto/trace/ftrace/ext4_journal_start.proto b/protos/perfetto/trace/ftrace/ext4_journal_start.proto
index 896ca59..b2aadf7 100644
--- a/protos/perfetto/trace/ftrace/ext4_journal_start.proto
+++ b/protos/perfetto/trace/ftrace/ext4_journal_start.proto
@@ -11,4 +11,5 @@
   optional uint64 ip = 2;
   optional int32 blocks = 3;
   optional int32 rsv_blocks = 4;
+  optional int32 nblocks = 5;
 }
diff --git a/protos/perfetto/trace/ftrace/ext4_journalled_invalidatepage.proto b/protos/perfetto/trace/ftrace/ext4_journalled_invalidatepage.proto
index a5c544f..0e63bda 100644
--- a/protos/perfetto/trace/ftrace/ext4_journalled_invalidatepage.proto
+++ b/protos/perfetto/trace/ftrace/ext4_journalled_invalidatepage.proto
@@ -10,6 +10,6 @@
   optional uint64 dev = 1;
   optional uint64 ino = 2;
   optional uint64 index = 3;
-  optional uint32 offset = 4;
+  optional uint64 offset = 4;
   optional uint32 length = 5;
 }
diff --git a/protos/perfetto/trace/ftrace/irq_handler_entry.proto b/protos/perfetto/trace/ftrace/irq_handler_entry.proto
index 1e47fe5..f78304d 100644
--- a/protos/perfetto/trace/ftrace/irq_handler_entry.proto
+++ b/protos/perfetto/trace/ftrace/irq_handler_entry.proto
@@ -9,4 +9,5 @@
 message IrqHandlerEntryFtraceEvent {
   optional int32 irq = 1;
   optional string name = 2;
+  optional uint32 handler = 3;
 }
diff --git a/protos/perfetto/trace/ftrace/mm_filemap_add_to_page_cache.proto b/protos/perfetto/trace/ftrace/mm_filemap_add_to_page_cache.proto
index 3399623..968ef7b 100644
--- a/protos/perfetto/trace/ftrace/mm_filemap_add_to_page_cache.proto
+++ b/protos/perfetto/trace/ftrace/mm_filemap_add_to_page_cache.proto
@@ -11,4 +11,5 @@
   optional uint64 i_ino = 2;
   optional uint64 index = 3;
   optional uint64 s_dev = 4;
+  optional uint64 page = 5;
 }
diff --git a/protos/perfetto/trace/ftrace/mm_filemap_delete_from_page_cache.proto b/protos/perfetto/trace/ftrace/mm_filemap_delete_from_page_cache.proto
index 9a49483..2ac4d89 100644
--- a/protos/perfetto/trace/ftrace/mm_filemap_delete_from_page_cache.proto
+++ b/protos/perfetto/trace/ftrace/mm_filemap_delete_from_page_cache.proto
@@ -11,4 +11,5 @@
   optional uint64 i_ino = 2;
   optional uint64 index = 3;
   optional uint64 s_dev = 4;
+  optional uint64 page = 5;
 }
diff --git a/protos/perfetto/trace/perfetto_trace.proto b/protos/perfetto/trace/perfetto_trace.proto
index de7bc95..b0b56b9 100644
--- a/protos/perfetto/trace/perfetto_trace.proto
+++ b/protos/perfetto/trace/perfetto_trace.proto
@@ -743,7 +743,7 @@
   optional uint32 lblk = 3;
   optional uint32 len = 4;
   optional uint64 pblk = 5;
-  optional uint32 status = 6;
+  optional uint64 status = 6;
   optional int32 found = 7;
 }
 
diff --git a/src/ftrace_reader/event_info.cc b/src/ftrace_reader/event_info.cc
index fd8d0c6..6bea89d 100644
--- a/src/ftrace_reader/event_info.cc
+++ b/src/ftrace_reader/event_info.cc
@@ -12,32 +12,537 @@
   {
     events.emplace_back(Event{});
     Event* event = &events.back();
-    event->name = "binder_lock";
-    event->group = "binder";
-    event->proto_field_id = 53;
-    event->fields.push_back(MakeField("tag", 1, kProtoString));
+    event->name = "print";
+    event->group = "ftrace";
+    event->proto_field_id = 3;
+    event->fields.push_back(MakeField("ip", 1, kProtoUint64));
+    event->fields.push_back(MakeField("buf", 2, kProtoString));
   }
 
   {
     events.emplace_back(Event{});
     Event* event = &events.back();
-    event->name = "binder_locked";
-    event->group = "binder";
-    event->proto_field_id = 54;
-    event->fields.push_back(MakeField("tag", 1, kProtoString));
+    event->name = "sched_switch";
+    event->group = "sched";
+    event->proto_field_id = 4;
+    event->fields.push_back(MakeField("prev_comm", 1, kProtoString));
+    event->fields.push_back(MakeField("prev_pid", 2, kProtoInt32));
+    event->fields.push_back(MakeField("prev_prio", 3, kProtoInt32));
+    event->fields.push_back(MakeField("prev_state", 4, kProtoInt64));
+    event->fields.push_back(MakeField("next_comm", 5, kProtoString));
+    event->fields.push_back(MakeField("next_pid", 6, kProtoInt32));
+    event->fields.push_back(MakeField("next_prio", 7, kProtoInt32));
   }
 
   {
     events.emplace_back(Event{});
     Event* event = &events.back();
-    event->name = "binder_set_priority";
-    event->group = "binder";
-    event->proto_field_id = 52;
-    event->fields.push_back(MakeField("proc", 1, kProtoInt32));
-    event->fields.push_back(MakeField("thread", 2, kProtoInt32));
-    event->fields.push_back(MakeField("old_prio", 3, kProtoUint32));
-    event->fields.push_back(MakeField("new_prio", 4, kProtoUint32));
-    event->fields.push_back(MakeField("desired_prio", 5, kProtoUint32));
+    event->name = "cpufreq_interactive_already";
+    event->group = "cpufreq_interactive";
+    event->proto_field_id = 5;
+    event->fields.push_back(MakeField("cpu_id", 1, kProtoUint64));
+    event->fields.push_back(MakeField("load", 2, kProtoUint64));
+    event->fields.push_back(MakeField("curtarg", 3, kProtoUint64));
+    event->fields.push_back(MakeField("curactual", 4, kProtoUint64));
+    event->fields.push_back(MakeField("newtarg", 5, kProtoUint64));
+  }
+
+  {
+    events.emplace_back(Event{});
+    Event* event = &events.back();
+    event->name = "cpufreq_interactive_boost";
+    event->group = "cpufreq_interactive";
+    event->proto_field_id = 6;
+    event->fields.push_back(MakeField("s", 1, kProtoString));
+  }
+
+  {
+    events.emplace_back(Event{});
+    Event* event = &events.back();
+    event->name = "cpufreq_interactive_notyet";
+    event->group = "cpufreq_interactive";
+    event->proto_field_id = 7;
+    event->fields.push_back(MakeField("cpu_id", 1, kProtoUint64));
+    event->fields.push_back(MakeField("load", 2, kProtoUint64));
+    event->fields.push_back(MakeField("curtarg", 3, kProtoUint64));
+    event->fields.push_back(MakeField("curactual", 4, kProtoUint64));
+    event->fields.push_back(MakeField("newtarg", 5, kProtoUint64));
+  }
+
+  {
+    events.emplace_back(Event{});
+    Event* event = &events.back();
+    event->name = "cpufreq_interactive_setspeed";
+    event->group = "cpufreq_interactive";
+    event->proto_field_id = 8;
+    event->fields.push_back(MakeField("cpu_id", 1, kProtoUint32));
+    event->fields.push_back(MakeField("targfreq", 2, kProtoUint64));
+    event->fields.push_back(MakeField("actualfreq", 3, kProtoUint64));
+  }
+
+  {
+    events.emplace_back(Event{});
+    Event* event = &events.back();
+    event->name = "cpufreq_interactive_target";
+    event->group = "cpufreq_interactive";
+    event->proto_field_id = 9;
+    event->fields.push_back(MakeField("cpu_id", 1, kProtoUint64));
+    event->fields.push_back(MakeField("load", 2, kProtoUint64));
+    event->fields.push_back(MakeField("curtarg", 3, kProtoUint64));
+    event->fields.push_back(MakeField("curactual", 4, kProtoUint64));
+    event->fields.push_back(MakeField("newtarg", 5, kProtoUint64));
+  }
+
+  {
+    events.emplace_back(Event{});
+    Event* event = &events.back();
+    event->name = "cpufreq_interactive_unboost";
+    event->group = "cpufreq_interactive";
+    event->proto_field_id = 10;
+    event->fields.push_back(MakeField("s", 1, kProtoString));
+  }
+
+  {
+    events.emplace_back(Event{});
+    Event* event = &events.back();
+    event->name = "cpu_frequency";
+    event->group = "power";
+    event->proto_field_id = 11;
+    event->fields.push_back(MakeField("state", 1, kProtoUint32));
+    event->fields.push_back(MakeField("cpu_id", 2, kProtoUint32));
+  }
+
+  {
+    events.emplace_back(Event{});
+    Event* event = &events.back();
+    event->name = "cpu_frequency_limits";
+    event->group = "power";
+    event->proto_field_id = 12;
+    event->fields.push_back(MakeField("min_freq", 1, kProtoUint32));
+    event->fields.push_back(MakeField("max_freq", 2, kProtoUint32));
+    event->fields.push_back(MakeField("cpu_id", 3, kProtoUint32));
+  }
+
+  {
+    events.emplace_back(Event{});
+    Event* event = &events.back();
+    event->name = "cpu_idle";
+    event->group = "power";
+    event->proto_field_id = 13;
+    event->fields.push_back(MakeField("state", 1, kProtoUint32));
+    event->fields.push_back(MakeField("cpu_id", 2, kProtoUint32));
+  }
+
+  {
+    events.emplace_back(Event{});
+    Event* event = &events.back();
+    event->name = "clock_enable";
+    event->group = "power";
+    event->proto_field_id = 14;
+    event->fields.push_back(MakeField("name", 1, kProtoString));
+    event->fields.push_back(MakeField("state", 2, kProtoUint64));
+    event->fields.push_back(MakeField("cpu_id", 3, kProtoUint64));
+  }
+
+  {
+    events.emplace_back(Event{});
+    Event* event = &events.back();
+    event->name = "clock_disable";
+    event->group = "power";
+    event->proto_field_id = 15;
+    event->fields.push_back(MakeField("name", 1, kProtoString));
+    event->fields.push_back(MakeField("state", 2, kProtoUint64));
+    event->fields.push_back(MakeField("cpu_id", 3, kProtoUint64));
+  }
+
+  {
+    events.emplace_back(Event{});
+    Event* event = &events.back();
+    event->name = "clock_set_rate";
+    event->group = "power";
+    event->proto_field_id = 16;
+    event->fields.push_back(MakeField("name", 1, kProtoString));
+    event->fields.push_back(MakeField("state", 2, kProtoUint64));
+    event->fields.push_back(MakeField("cpu_id", 3, kProtoUint64));
+  }
+
+  {
+    events.emplace_back(Event{});
+    Event* event = &events.back();
+    event->name = "sched_wakeup";
+    event->group = "sched";
+    event->proto_field_id = 17;
+    event->fields.push_back(MakeField("comm", 1, kProtoString));
+    event->fields.push_back(MakeField("pid", 2, kProtoInt32));
+    event->fields.push_back(MakeField("prio", 3, kProtoInt32));
+    event->fields.push_back(MakeField("success", 4, kProtoInt32));
+    event->fields.push_back(MakeField("target_cpu", 5, kProtoInt32));
+  }
+
+  {
+    events.emplace_back(Event{});
+    Event* event = &events.back();
+    event->name = "sched_blocked_reason";
+    event->group = "sched";
+    event->proto_field_id = 18;
+    event->fields.push_back(MakeField("pid", 1, kProtoInt32));
+    event->fields.push_back(MakeField("caller", 2, kProtoUint64));
+    event->fields.push_back(MakeField("io_wait", 3, kProtoUint32));
+  }
+
+  {
+    events.emplace_back(Event{});
+    Event* event = &events.back();
+    event->name = "sched_cpu_hotplug";
+    event->group = "sched";
+    event->proto_field_id = 19;
+    event->fields.push_back(MakeField("affected_cpu", 1, kProtoInt32));
+    event->fields.push_back(MakeField("error", 2, kProtoInt32));
+    event->fields.push_back(MakeField("status", 3, kProtoInt32));
+  }
+
+  {
+    events.emplace_back(Event{});
+    Event* event = &events.back();
+    event->name = "sched_waking";
+    event->group = "sched";
+    event->proto_field_id = 20;
+    event->fields.push_back(MakeField("comm", 1, kProtoString));
+    event->fields.push_back(MakeField("pid", 2, kProtoInt32));
+    event->fields.push_back(MakeField("prio", 3, kProtoInt32));
+    event->fields.push_back(MakeField("success", 4, kProtoInt32));
+    event->fields.push_back(MakeField("target_cpu", 5, kProtoInt32));
+  }
+
+  {
+    events.emplace_back(Event{});
+    Event* event = &events.back();
+    event->name = "ipi_entry";
+    event->group = "ipi";
+    event->proto_field_id = 21;
+    event->fields.push_back(MakeField("reason", 1, kProtoString));
+  }
+
+  {
+    events.emplace_back(Event{});
+    Event* event = &events.back();
+    event->name = "ipi_exit";
+    event->group = "ipi";
+    event->proto_field_id = 22;
+    event->fields.push_back(MakeField("reason", 1, kProtoString));
+  }
+
+  {
+    events.emplace_back(Event{});
+    Event* event = &events.back();
+    event->name = "ipi_raise";
+    event->group = "ipi";
+    event->proto_field_id = 23;
+    event->fields.push_back(MakeField("target_cpus", 1, kProtoUint32));
+    event->fields.push_back(MakeField("reason", 2, kProtoString));
+  }
+
+  {
+    events.emplace_back(Event{});
+    Event* event = &events.back();
+    event->name = "softirq_entry";
+    event->group = "irq";
+    event->proto_field_id = 24;
+    event->fields.push_back(MakeField("vec", 1, kProtoUint32));
+  }
+
+  {
+    events.emplace_back(Event{});
+    Event* event = &events.back();
+    event->name = "softirq_exit";
+    event->group = "irq";
+    event->proto_field_id = 25;
+    event->fields.push_back(MakeField("vec", 1, kProtoUint32));
+  }
+
+  {
+    events.emplace_back(Event{});
+    Event* event = &events.back();
+    event->name = "softirq_raise";
+    event->group = "irq";
+    event->proto_field_id = 26;
+    event->fields.push_back(MakeField("vec", 1, kProtoUint32));
+  }
+
+  {
+    events.emplace_back(Event{});
+    Event* event = &events.back();
+    event->name = "i2c_read";
+    event->group = "i2c";
+    event->proto_field_id = 27;
+    event->fields.push_back(MakeField("adapter_nr", 1, kProtoInt32));
+    event->fields.push_back(MakeField("msg_nr", 2, kProtoUint32));
+    event->fields.push_back(MakeField("addr", 3, kProtoUint32));
+    event->fields.push_back(MakeField("flags", 4, kProtoUint32));
+    event->fields.push_back(MakeField("len", 5, kProtoUint32));
+  }
+
+  {
+    events.emplace_back(Event{});
+    Event* event = &events.back();
+    event->name = "i2c_write";
+    event->group = "i2c";
+    event->proto_field_id = 28;
+    event->fields.push_back(MakeField("adapter_nr", 1, kProtoInt32));
+    event->fields.push_back(MakeField("msg_nr", 2, kProtoUint32));
+    event->fields.push_back(MakeField("addr", 3, kProtoUint32));
+    event->fields.push_back(MakeField("flags", 4, kProtoUint32));
+    event->fields.push_back(MakeField("len", 5, kProtoUint32));
+    event->fields.push_back(MakeField("buf", 6, kProtoUint32));
+  }
+
+  {
+    events.emplace_back(Event{});
+    Event* event = &events.back();
+    event->name = "i2c_result";
+    event->group = "i2c";
+    event->proto_field_id = 29;
+    event->fields.push_back(MakeField("adapter_nr", 1, kProtoInt32));
+    event->fields.push_back(MakeField("nr_msgs", 2, kProtoUint32));
+    event->fields.push_back(MakeField("ret", 3, kProtoInt32));
+  }
+
+  {
+    events.emplace_back(Event{});
+    Event* event = &events.back();
+    event->name = "i2c_reply";
+    event->group = "i2c";
+    event->proto_field_id = 30;
+    event->fields.push_back(MakeField("adapter_nr", 1, kProtoInt32));
+    event->fields.push_back(MakeField("msg_nr", 2, kProtoUint32));
+    event->fields.push_back(MakeField("addr", 3, kProtoUint32));
+    event->fields.push_back(MakeField("flags", 4, kProtoUint32));
+    event->fields.push_back(MakeField("len", 5, kProtoUint32));
+    event->fields.push_back(MakeField("buf", 6, kProtoUint32));
+  }
+
+  {
+    events.emplace_back(Event{});
+    Event* event = &events.back();
+    event->name = "smbus_read";
+    event->group = "i2c";
+    event->proto_field_id = 31;
+    event->fields.push_back(MakeField("adapter_nr", 1, kProtoInt32));
+    event->fields.push_back(MakeField("flags", 2, kProtoUint32));
+    event->fields.push_back(MakeField("addr", 3, kProtoUint32));
+    event->fields.push_back(MakeField("command", 4, kProtoUint32));
+    event->fields.push_back(MakeField("protocol", 5, kProtoUint32));
+  }
+
+  {
+    events.emplace_back(Event{});
+    Event* event = &events.back();
+    event->name = "smbus_write";
+    event->group = "i2c";
+    event->proto_field_id = 32;
+    event->fields.push_back(MakeField("adapter_nr", 1, kProtoInt32));
+    event->fields.push_back(MakeField("addr", 2, kProtoUint32));
+    event->fields.push_back(MakeField("flags", 3, kProtoUint32));
+    event->fields.push_back(MakeField("command", 4, kProtoUint32));
+    event->fields.push_back(MakeField("len", 5, kProtoUint32));
+    event->fields.push_back(MakeField("protocol", 6, kProtoUint32));
+  }
+
+  {
+    events.emplace_back(Event{});
+    Event* event = &events.back();
+    event->name = "smbus_result";
+    event->group = "i2c";
+    event->proto_field_id = 33;
+    event->fields.push_back(MakeField("adapter_nr", 1, kProtoInt32));
+    event->fields.push_back(MakeField("addr", 2, kProtoUint32));
+    event->fields.push_back(MakeField("flags", 3, kProtoUint32));
+    event->fields.push_back(MakeField("read_write", 4, kProtoUint32));
+    event->fields.push_back(MakeField("command", 5, kProtoUint32));
+    event->fields.push_back(MakeField("res", 6, kProtoInt32));
+    event->fields.push_back(MakeField("protocol", 7, kProtoUint32));
+  }
+
+  {
+    events.emplace_back(Event{});
+    Event* event = &events.back();
+    event->name = "smbus_reply";
+    event->group = "i2c";
+    event->proto_field_id = 34;
+    event->fields.push_back(MakeField("adapter_nr", 1, kProtoInt32));
+    event->fields.push_back(MakeField("addr", 2, kProtoUint32));
+    event->fields.push_back(MakeField("flags", 3, kProtoUint32));
+    event->fields.push_back(MakeField("command", 4, kProtoUint32));
+    event->fields.push_back(MakeField("len", 5, kProtoUint32));
+    event->fields.push_back(MakeField("protocol", 6, kProtoUint32));
+  }
+
+  {
+    events.emplace_back(Event{});
+    Event* event = &events.back();
+    event->name = "lowmemory_kill";
+    event->group = "lowmemorykiller";
+    event->proto_field_id = 35;
+    event->fields.push_back(MakeField("comm", 1, kProtoString));
+    event->fields.push_back(MakeField("pid", 2, kProtoInt32));
+    event->fields.push_back(MakeField("pagecache_size", 3, kProtoInt64));
+    event->fields.push_back(MakeField("pagecache_limit", 4, kProtoInt64));
+    event->fields.push_back(MakeField("free", 5, kProtoInt64));
+  }
+
+  {
+    events.emplace_back(Event{});
+    Event* event = &events.back();
+    event->name = "irq_handler_entry";
+    event->group = "irq";
+    event->proto_field_id = 36;
+    event->fields.push_back(MakeField("irq", 1, kProtoInt32));
+    event->fields.push_back(MakeField("name", 2, kProtoString));
+    event->fields.push_back(MakeField("handler", 3, kProtoUint32));
+  }
+
+  {
+    events.emplace_back(Event{});
+    Event* event = &events.back();
+    event->name = "irq_handler_exit";
+    event->group = "irq";
+    event->proto_field_id = 37;
+    event->fields.push_back(MakeField("irq", 1, kProtoInt32));
+    event->fields.push_back(MakeField("ret", 2, kProtoInt32));
+  }
+
+  {
+    events.emplace_back(Event{});
+    Event* event = &events.back();
+    event->name = "sync_pt";
+    event->group = "sync";
+    event->proto_field_id = 38;
+    event->fields.push_back(MakeField("timeline", 1, kProtoString));
+    event->fields.push_back(MakeField("value", 2, kProtoString));
+  }
+
+  {
+    events.emplace_back(Event{});
+    Event* event = &events.back();
+    event->name = "sync_timeline";
+    event->group = "sync";
+    event->proto_field_id = 39;
+    event->fields.push_back(MakeField("name", 1, kProtoString));
+    event->fields.push_back(MakeField("value", 2, kProtoString));
+  }
+
+  {
+    events.emplace_back(Event{});
+    Event* event = &events.back();
+    event->name = "sync_wait";
+    event->group = "sync";
+    event->proto_field_id = 40;
+    event->fields.push_back(MakeField("name", 1, kProtoString));
+    event->fields.push_back(MakeField("status", 2, kProtoInt32));
+    event->fields.push_back(MakeField("begin", 3, kProtoUint32));
+  }
+
+  {
+    events.emplace_back(Event{});
+    Event* event = &events.back();
+    event->name = "ext4_da_write_begin";
+    event->group = "ext4";
+    event->proto_field_id = 41;
+    event->fields.push_back(MakeField("dev", 1, kProtoUint64));
+    event->fields.push_back(MakeField("ino", 2, kProtoUint64));
+    event->fields.push_back(MakeField("pos", 3, kProtoInt64));
+    event->fields.push_back(MakeField("len", 4, kProtoUint32));
+    event->fields.push_back(MakeField("flags", 5, kProtoUint32));
+  }
+
+  {
+    events.emplace_back(Event{});
+    Event* event = &events.back();
+    event->name = "ext4_da_write_end";
+    event->group = "ext4";
+    event->proto_field_id = 42;
+    event->fields.push_back(MakeField("dev", 1, kProtoUint64));
+    event->fields.push_back(MakeField("ino", 2, kProtoUint64));
+    event->fields.push_back(MakeField("pos", 3, kProtoInt64));
+    event->fields.push_back(MakeField("len", 4, kProtoUint32));
+    event->fields.push_back(MakeField("copied", 5, kProtoUint32));
+  }
+
+  {
+    events.emplace_back(Event{});
+    Event* event = &events.back();
+    event->name = "ext4_sync_file_enter";
+    event->group = "ext4";
+    event->proto_field_id = 43;
+    event->fields.push_back(MakeField("dev", 1, kProtoUint64));
+    event->fields.push_back(MakeField("ino", 2, kProtoUint64));
+    event->fields.push_back(MakeField("parent", 3, kProtoUint64));
+    event->fields.push_back(MakeField("datasync", 4, kProtoInt32));
+  }
+
+  {
+    events.emplace_back(Event{});
+    Event* event = &events.back();
+    event->name = "ext4_sync_file_exit";
+    event->group = "ext4";
+    event->proto_field_id = 44;
+    event->fields.push_back(MakeField("dev", 1, kProtoUint64));
+    event->fields.push_back(MakeField("ino", 2, kProtoUint64));
+    event->fields.push_back(MakeField("ret", 3, kProtoInt32));
+  }
+
+  {
+    events.emplace_back(Event{});
+    Event* event = &events.back();
+    event->name = "block_rq_issue";
+    event->group = "block";
+    event->proto_field_id = 45;
+    event->fields.push_back(MakeField("dev", 1, kProtoUint64));
+    event->fields.push_back(MakeField("sector", 2, kProtoUint64));
+    event->fields.push_back(MakeField("nr_sector", 3, kProtoUint32));
+    event->fields.push_back(MakeField("bytes", 4, kProtoUint32));
+    event->fields.push_back(MakeField("rwbs", 5, kProtoString));
+    event->fields.push_back(MakeField("comm", 6, kProtoString));
+    event->fields.push_back(MakeField("cmd", 7, kProtoString));
+  }
+
+  {
+    events.emplace_back(Event{});
+    Event* event = &events.back();
+    event->name = "mm_vmscan_direct_reclaim_begin";
+    event->group = "vmscan";
+    event->proto_field_id = 46;
+    event->fields.push_back(MakeField("order", 1, kProtoInt32));
+    event->fields.push_back(MakeField("may_writepage", 2, kProtoInt32));
+    event->fields.push_back(MakeField("gfp_flags", 3, kProtoUint32));
+  }
+
+  {
+    events.emplace_back(Event{});
+    Event* event = &events.back();
+    event->name = "mm_vmscan_direct_reclaim_end";
+    event->group = "vmscan";
+    event->proto_field_id = 47;
+    event->fields.push_back(MakeField("nr_reclaimed", 1, kProtoUint64));
+  }
+
+  {
+    events.emplace_back(Event{});
+    Event* event = &events.back();
+    event->name = "mm_vmscan_kswapd_wake";
+    event->group = "vmscan";
+    event->proto_field_id = 48;
+    event->fields.push_back(MakeField("nid", 1, kProtoInt32));
+    event->fields.push_back(MakeField("order", 2, kProtoInt32));
+  }
+
+  {
+    events.emplace_back(Event{});
+    Event* event = &events.back();
+    event->name = "mm_vmscan_kswapd_sleep";
+    event->group = "vmscan";
+    event->proto_field_id = 49;
+    event->fields.push_back(MakeField("nid", 1, kProtoInt32));
   }
 
   {
@@ -67,6 +572,37 @@
   {
     events.emplace_back(Event{});
     Event* event = &events.back();
+    event->name = "binder_set_priority";
+    event->group = "binder";
+    event->proto_field_id = 52;
+    event->fields.push_back(MakeField("proc", 1, kProtoInt32));
+    event->fields.push_back(MakeField("thread", 2, kProtoInt32));
+    event->fields.push_back(MakeField("old_prio", 3, kProtoUint32));
+    event->fields.push_back(MakeField("new_prio", 4, kProtoUint32));
+    event->fields.push_back(MakeField("desired_prio", 5, kProtoUint32));
+  }
+
+  {
+    events.emplace_back(Event{});
+    Event* event = &events.back();
+    event->name = "binder_lock";
+    event->group = "binder";
+    event->proto_field_id = 53;
+    event->fields.push_back(MakeField("tag", 1, kProtoString));
+  }
+
+  {
+    events.emplace_back(Event{});
+    Event* event = &events.back();
+    event->name = "binder_locked";
+    event->group = "binder";
+    event->proto_field_id = 54;
+    event->fields.push_back(MakeField("tag", 1, kProtoString));
+  }
+
+  {
+    events.emplace_back(Event{});
+    Event* event = &events.back();
     event->name = "binder_unlock";
     event->group = "binder";
     event->proto_field_id = 55;
@@ -76,6 +612,708 @@
   {
     events.emplace_back(Event{});
     Event* event = &events.back();
+    event->name = "workqueue_activate_work";
+    event->group = "workqueue";
+    event->proto_field_id = 56;
+    event->fields.push_back(MakeField("work", 1, kProtoUint64));
+  }
+
+  {
+    events.emplace_back(Event{});
+    Event* event = &events.back();
+    event->name = "workqueue_execute_end";
+    event->group = "workqueue";
+    event->proto_field_id = 57;
+    event->fields.push_back(MakeField("work", 1, kProtoUint64));
+  }
+
+  {
+    events.emplace_back(Event{});
+    Event* event = &events.back();
+    event->name = "workqueue_execute_start";
+    event->group = "workqueue";
+    event->proto_field_id = 58;
+    event->fields.push_back(MakeField("work", 1, kProtoUint64));
+    event->fields.push_back(MakeField("function", 2, kProtoUint64));
+  }
+
+  {
+    events.emplace_back(Event{});
+    Event* event = &events.back();
+    event->name = "workqueue_queue_work";
+    event->group = "workqueue";
+    event->proto_field_id = 59;
+    event->fields.push_back(MakeField("work", 1, kProtoUint64));
+    event->fields.push_back(MakeField("function", 2, kProtoUint64));
+    event->fields.push_back(MakeField("workqueue", 3, kProtoUint64));
+    event->fields.push_back(MakeField("req_cpu", 4, kProtoUint32));
+    event->fields.push_back(MakeField("cpu", 5, kProtoUint32));
+  }
+
+  {
+    events.emplace_back(Event{});
+    Event* event = &events.back();
+    event->name = "regulator_disable";
+    event->group = "regulator";
+    event->proto_field_id = 60;
+    event->fields.push_back(MakeField("name", 1, kProtoString));
+  }
+
+  {
+    events.emplace_back(Event{});
+    Event* event = &events.back();
+    event->name = "regulator_disable_complete";
+    event->group = "regulator";
+    event->proto_field_id = 61;
+    event->fields.push_back(MakeField("name", 1, kProtoString));
+  }
+
+  {
+    events.emplace_back(Event{});
+    Event* event = &events.back();
+    event->name = "regulator_enable";
+    event->group = "regulator";
+    event->proto_field_id = 62;
+    event->fields.push_back(MakeField("name", 1, kProtoString));
+  }
+
+  {
+    events.emplace_back(Event{});
+    Event* event = &events.back();
+    event->name = "regulator_enable_complete";
+    event->group = "regulator";
+    event->proto_field_id = 63;
+    event->fields.push_back(MakeField("name", 1, kProtoString));
+  }
+
+  {
+    events.emplace_back(Event{});
+    Event* event = &events.back();
+    event->name = "regulator_enable_delay";
+    event->group = "regulator";
+    event->proto_field_id = 64;
+    event->fields.push_back(MakeField("name", 1, kProtoString));
+  }
+
+  {
+    events.emplace_back(Event{});
+    Event* event = &events.back();
+    event->name = "regulator_set_voltage";
+    event->group = "regulator";
+    event->proto_field_id = 65;
+    event->fields.push_back(MakeField("name", 1, kProtoString));
+    event->fields.push_back(MakeField("min", 2, kProtoInt32));
+    event->fields.push_back(MakeField("max", 3, kProtoInt32));
+  }
+
+  {
+    events.emplace_back(Event{});
+    Event* event = &events.back();
+    event->name = "regulator_set_voltage_complete";
+    event->group = "regulator";
+    event->proto_field_id = 66;
+    event->fields.push_back(MakeField("name", 1, kProtoString));
+    event->fields.push_back(MakeField("val", 2, kProtoUint32));
+  }
+
+  {
+    events.emplace_back(Event{});
+    Event* event = &events.back();
+    event->name = "cgroup_attach_task";
+    event->group = "cgroup";
+    event->proto_field_id = 67;
+    event->fields.push_back(MakeField("dst_root", 1, kProtoInt32));
+    event->fields.push_back(MakeField("dst_id", 2, kProtoInt32));
+    event->fields.push_back(MakeField("pid", 3, kProtoInt32));
+    event->fields.push_back(MakeField("comm", 4, kProtoString));
+    event->fields.push_back(MakeField("cname", 5, kProtoString));
+  }
+
+  {
+    events.emplace_back(Event{});
+    Event* event = &events.back();
+    event->name = "cgroup_mkdir";
+    event->group = "cgroup";
+    event->proto_field_id = 68;
+    event->fields.push_back(MakeField("root", 1, kProtoInt32));
+    event->fields.push_back(MakeField("id", 2, kProtoInt32));
+    event->fields.push_back(MakeField("cname", 3, kProtoString));
+  }
+
+  {
+    events.emplace_back(Event{});
+    Event* event = &events.back();
+    event->name = "cgroup_remount";
+    event->group = "cgroup";
+    event->proto_field_id = 69;
+    event->fields.push_back(MakeField("root", 1, kProtoInt32));
+    event->fields.push_back(MakeField("ss_mask", 2, kProtoUint32));
+    event->fields.push_back(MakeField("name", 3, kProtoString));
+  }
+
+  {
+    events.emplace_back(Event{});
+    Event* event = &events.back();
+    event->name = "cgroup_rmdir";
+    event->group = "cgroup";
+    event->proto_field_id = 70;
+    event->fields.push_back(MakeField("root", 1, kProtoInt32));
+    event->fields.push_back(MakeField("id", 2, kProtoInt32));
+    event->fields.push_back(MakeField("cname", 3, kProtoString));
+  }
+
+  {
+    events.emplace_back(Event{});
+    Event* event = &events.back();
+    event->name = "cgroup_transfer_tasks";
+    event->group = "cgroup";
+    event->proto_field_id = 71;
+    event->fields.push_back(MakeField("dst_root", 1, kProtoInt32));
+    event->fields.push_back(MakeField("dst_id", 2, kProtoInt32));
+    event->fields.push_back(MakeField("pid", 3, kProtoInt32));
+    event->fields.push_back(MakeField("comm", 4, kProtoString));
+    event->fields.push_back(MakeField("cname", 5, kProtoString));
+  }
+
+  {
+    events.emplace_back(Event{});
+    Event* event = &events.back();
+    event->name = "cgroup_destroy_root";
+    event->group = "cgroup";
+    event->proto_field_id = 72;
+    event->fields.push_back(MakeField("root", 1, kProtoInt32));
+    event->fields.push_back(MakeField("ss_mask", 2, kProtoUint32));
+    event->fields.push_back(MakeField("name", 3, kProtoString));
+  }
+
+  {
+    events.emplace_back(Event{});
+    Event* event = &events.back();
+    event->name = "cgroup_release";
+    event->group = "cgroup";
+    event->proto_field_id = 73;
+    event->fields.push_back(MakeField("root", 1, kProtoInt32));
+    event->fields.push_back(MakeField("id", 2, kProtoInt32));
+    event->fields.push_back(MakeField("cname", 3, kProtoString));
+  }
+
+  {
+    events.emplace_back(Event{});
+    Event* event = &events.back();
+    event->name = "cgroup_rename";
+    event->group = "cgroup";
+    event->proto_field_id = 74;
+    event->fields.push_back(MakeField("root", 1, kProtoInt32));
+    event->fields.push_back(MakeField("id", 2, kProtoInt32));
+    event->fields.push_back(MakeField("cname", 3, kProtoString));
+  }
+
+  {
+    events.emplace_back(Event{});
+    Event* event = &events.back();
+    event->name = "cgroup_setup_root";
+    event->group = "cgroup";
+    event->proto_field_id = 75;
+    event->fields.push_back(MakeField("root", 1, kProtoInt32));
+    event->fields.push_back(MakeField("ss_mask", 2, kProtoUint32));
+    event->fields.push_back(MakeField("name", 3, kProtoString));
+  }
+
+  {
+    events.emplace_back(Event{});
+    Event* event = &events.back();
+    event->name = "mdp_cmd_kickoff";
+    event->group = "mdss";
+    event->proto_field_id = 76;
+    event->fields.push_back(MakeField("ctl_num", 1, kProtoUint32));
+    event->fields.push_back(MakeField("kickoff_cnt", 2, kProtoInt32));
+  }
+
+  {
+    events.emplace_back(Event{});
+    Event* event = &events.back();
+    event->name = "mdp_commit";
+    event->group = "mdss";
+    event->proto_field_id = 77;
+    event->fields.push_back(MakeField("num", 1, kProtoUint32));
+    event->fields.push_back(MakeField("play_cnt", 2, kProtoUint32));
+    event->fields.push_back(MakeField("clk_rate", 3, kProtoUint32));
+    event->fields.push_back(MakeField("bandwidth", 4, kProtoUint64));
+  }
+
+  {
+    events.emplace_back(Event{});
+    Event* event = &events.back();
+    event->name = "mdp_perf_set_ot";
+    event->group = "mdss";
+    event->proto_field_id = 78;
+    event->fields.push_back(MakeField("pnum", 1, kProtoUint32));
+    event->fields.push_back(MakeField("xin_id", 2, kProtoUint32));
+    event->fields.push_back(MakeField("rd_lim", 3, kProtoUint32));
+    event->fields.push_back(MakeField("is_vbif_rt", 4, kProtoUint32));
+  }
+
+  {
+    events.emplace_back(Event{});
+    Event* event = &events.back();
+    event->name = "mdp_sspp_change";
+    event->group = "mdss";
+    event->proto_field_id = 79;
+    event->fields.push_back(MakeField("num", 1, kProtoUint32));
+    event->fields.push_back(MakeField("play_cnt", 2, kProtoUint32));
+    event->fields.push_back(MakeField("mixer", 3, kProtoUint32));
+    event->fields.push_back(MakeField("stage", 4, kProtoUint32));
+    event->fields.push_back(MakeField("flags", 5, kProtoUint32));
+    event->fields.push_back(MakeField("format", 6, kProtoUint32));
+    event->fields.push_back(MakeField("img_w", 7, kProtoUint32));
+    event->fields.push_back(MakeField("img_h", 8, kProtoUint32));
+    event->fields.push_back(MakeField("src_x", 9, kProtoUint32));
+    event->fields.push_back(MakeField("src_y", 10, kProtoUint32));
+    event->fields.push_back(MakeField("src_w", 11, kProtoUint32));
+    event->fields.push_back(MakeField("src_h", 12, kProtoUint32));
+    event->fields.push_back(MakeField("dst_x", 13, kProtoUint32));
+    event->fields.push_back(MakeField("dst_y", 14, kProtoUint32));
+    event->fields.push_back(MakeField("dst_w", 15, kProtoUint32));
+    event->fields.push_back(MakeField("dst_h", 16, kProtoUint32));
+  }
+
+  {
+    events.emplace_back(Event{});
+    Event* event = &events.back();
+    event->name = "tracing_mark_write";
+    event->group = "mdss";
+    event->proto_field_id = 80;
+    event->fields.push_back(MakeField("pid", 1, kProtoInt32));
+    event->fields.push_back(MakeField("trace_name", 2, kProtoString));
+    event->fields.push_back(MakeField("trace_begin", 3, kProtoUint32));
+  }
+
+  {
+    events.emplace_back(Event{});
+    Event* event = &events.back();
+    event->name = "mdp_cmd_pingpong_done";
+    event->group = "mdss";
+    event->proto_field_id = 81;
+    event->fields.push_back(MakeField("ctl_num", 1, kProtoUint32));
+    event->fields.push_back(MakeField("intf_num", 2, kProtoUint32));
+    event->fields.push_back(MakeField("pp_num", 3, kProtoUint32));
+    event->fields.push_back(MakeField("koff_cnt", 4, kProtoInt32));
+  }
+
+  {
+    events.emplace_back(Event{});
+    Event* event = &events.back();
+    event->name = "mdp_compare_bw";
+    event->group = "mdss";
+    event->proto_field_id = 82;
+    event->fields.push_back(MakeField("new_ab", 1, kProtoUint64));
+    event->fields.push_back(MakeField("new_ib", 2, kProtoUint64));
+    event->fields.push_back(MakeField("new_wb", 3, kProtoUint64));
+    event->fields.push_back(MakeField("old_ab", 4, kProtoUint64));
+    event->fields.push_back(MakeField("old_ib", 5, kProtoUint64));
+    event->fields.push_back(MakeField("old_wb", 6, kProtoUint64));
+    event->fields.push_back(MakeField("params_changed", 7, kProtoUint32));
+    event->fields.push_back(MakeField("update_bw", 8, kProtoUint32));
+  }
+
+  {
+    events.emplace_back(Event{});
+    Event* event = &events.back();
+    event->name = "mdp_perf_set_panic_luts";
+    event->group = "mdss";
+    event->proto_field_id = 83;
+    event->fields.push_back(MakeField("pnum", 1, kProtoUint32));
+    event->fields.push_back(MakeField("fmt", 2, kProtoUint32));
+    event->fields.push_back(MakeField("mode", 3, kProtoUint32));
+    event->fields.push_back(MakeField("panic_lut", 4, kProtoUint32));
+    event->fields.push_back(MakeField("robust_lut", 5, kProtoUint32));
+  }
+
+  {
+    events.emplace_back(Event{});
+    Event* event = &events.back();
+    event->name = "mdp_sspp_set";
+    event->group = "mdss";
+    event->proto_field_id = 84;
+    event->fields.push_back(MakeField("num", 1, kProtoUint32));
+    event->fields.push_back(MakeField("play_cnt", 2, kProtoUint32));
+    event->fields.push_back(MakeField("mixer", 3, kProtoUint32));
+    event->fields.push_back(MakeField("stage", 4, kProtoUint32));
+    event->fields.push_back(MakeField("flags", 5, kProtoUint32));
+    event->fields.push_back(MakeField("format", 6, kProtoUint32));
+    event->fields.push_back(MakeField("img_w", 7, kProtoUint32));
+    event->fields.push_back(MakeField("img_h", 8, kProtoUint32));
+    event->fields.push_back(MakeField("src_x", 9, kProtoUint32));
+    event->fields.push_back(MakeField("src_y", 10, kProtoUint32));
+    event->fields.push_back(MakeField("src_w", 11, kProtoUint32));
+    event->fields.push_back(MakeField("src_h", 12, kProtoUint32));
+    event->fields.push_back(MakeField("dst_x", 13, kProtoUint32));
+    event->fields.push_back(MakeField("dst_y", 14, kProtoUint32));
+    event->fields.push_back(MakeField("dst_w", 15, kProtoUint32));
+    event->fields.push_back(MakeField("dst_h", 16, kProtoUint32));
+  }
+
+  {
+    events.emplace_back(Event{});
+    Event* event = &events.back();
+    event->name = "mdp_cmd_readptr_done";
+    event->group = "mdss";
+    event->proto_field_id = 85;
+    event->fields.push_back(MakeField("ctl_num", 1, kProtoUint32));
+    event->fields.push_back(MakeField("koff_cnt", 2, kProtoInt32));
+  }
+
+  {
+    events.emplace_back(Event{});
+    Event* event = &events.back();
+    event->name = "mdp_misr_crc";
+    event->group = "mdss";
+    event->proto_field_id = 86;
+    event->fields.push_back(MakeField("block_id", 1, kProtoUint32));
+    event->fields.push_back(MakeField("vsync_cnt", 2, kProtoUint32));
+    event->fields.push_back(MakeField("crc", 3, kProtoUint32));
+  }
+
+  {
+    events.emplace_back(Event{});
+    Event* event = &events.back();
+    event->name = "mdp_perf_set_qos_luts";
+    event->group = "mdss";
+    event->proto_field_id = 87;
+    event->fields.push_back(MakeField("pnum", 1, kProtoUint32));
+    event->fields.push_back(MakeField("fmt", 2, kProtoUint32));
+    event->fields.push_back(MakeField("intf", 3, kProtoUint32));
+    event->fields.push_back(MakeField("rot", 4, kProtoUint32));
+    event->fields.push_back(MakeField("fl", 5, kProtoUint32));
+    event->fields.push_back(MakeField("lut", 6, kProtoUint32));
+    event->fields.push_back(MakeField("linear", 7, kProtoUint32));
+  }
+
+  {
+    events.emplace_back(Event{});
+    Event* event = &events.back();
+    event->name = "mdp_trace_counter";
+    event->group = "mdss";
+    event->proto_field_id = 88;
+    event->fields.push_back(MakeField("pid", 1, kProtoInt32));
+    event->fields.push_back(MakeField("counter_name", 2, kProtoString));
+    event->fields.push_back(MakeField("value", 3, kProtoInt32));
+  }
+
+  {
+    events.emplace_back(Event{});
+    Event* event = &events.back();
+    event->name = "mdp_cmd_release_bw";
+    event->group = "mdss";
+    event->proto_field_id = 89;
+    event->fields.push_back(MakeField("ctl_num", 1, kProtoUint32));
+  }
+
+  {
+    events.emplace_back(Event{});
+    Event* event = &events.back();
+    event->name = "mdp_mixer_update";
+    event->group = "mdss";
+    event->proto_field_id = 90;
+    event->fields.push_back(MakeField("mixer_num", 1, kProtoUint32));
+  }
+
+  {
+    events.emplace_back(Event{});
+    Event* event = &events.back();
+    event->name = "mdp_perf_set_wm_levels";
+    event->group = "mdss";
+    event->proto_field_id = 91;
+    event->fields.push_back(MakeField("pnum", 1, kProtoUint32));
+    event->fields.push_back(MakeField("use_space", 2, kProtoUint32));
+    event->fields.push_back(MakeField("priority_bytes", 3, kProtoUint32));
+    event->fields.push_back(MakeField("wm0", 4, kProtoUint32));
+    event->fields.push_back(MakeField("wm1", 5, kProtoUint32));
+    event->fields.push_back(MakeField("wm2", 6, kProtoUint32));
+    event->fields.push_back(MakeField("mb_cnt", 7, kProtoUint32));
+    event->fields.push_back(MakeField("mb_size", 8, kProtoUint32));
+  }
+
+  {
+    events.emplace_back(Event{});
+    Event* event = &events.back();
+    event->name = "mdp_video_underrun_done";
+    event->group = "mdss";
+    event->proto_field_id = 92;
+    event->fields.push_back(MakeField("ctl_num", 1, kProtoUint32));
+    event->fields.push_back(MakeField("underrun_cnt", 2, kProtoUint32));
+  }
+
+  {
+    events.emplace_back(Event{});
+    Event* event = &events.back();
+    event->name = "mdp_cmd_wait_pingpong";
+    event->group = "mdss";
+    event->proto_field_id = 93;
+    event->fields.push_back(MakeField("ctl_num", 1, kProtoUint32));
+    event->fields.push_back(MakeField("kickoff_cnt", 2, kProtoInt32));
+  }
+
+  {
+    events.emplace_back(Event{});
+    Event* event = &events.back();
+    event->name = "mdp_perf_prefill_calc";
+    event->group = "mdss";
+    event->proto_field_id = 94;
+    event->fields.push_back(MakeField("pnum", 1, kProtoUint32));
+    event->fields.push_back(MakeField("latency_buf", 2, kProtoUint32));
+    event->fields.push_back(MakeField("ot", 3, kProtoUint32));
+    event->fields.push_back(MakeField("y_buf", 4, kProtoUint32));
+    event->fields.push_back(MakeField("y_scaler", 5, kProtoUint32));
+    event->fields.push_back(MakeField("pp_lines", 6, kProtoUint32));
+    event->fields.push_back(MakeField("pp_bytes", 7, kProtoUint32));
+    event->fields.push_back(MakeField("post_sc", 8, kProtoUint32));
+    event->fields.push_back(MakeField("fbc_bytes", 9, kProtoUint32));
+    event->fields.push_back(MakeField("prefill_bytes", 10, kProtoUint32));
+  }
+
+  {
+    events.emplace_back(Event{});
+    Event* event = &events.back();
+    event->name = "mdp_perf_update_bus";
+    event->group = "mdss";
+    event->proto_field_id = 95;
+    event->fields.push_back(MakeField("client", 1, kProtoInt32));
+    event->fields.push_back(MakeField("ab_quota", 2, kProtoUint64));
+    event->fields.push_back(MakeField("ib_quota", 3, kProtoUint64));
+  }
+
+  {
+    events.emplace_back(Event{});
+    Event* event = &events.back();
+    event->name = "rotator_bw_ao_as_context";
+    event->group = "mdss";
+    event->proto_field_id = 96;
+    event->fields.push_back(MakeField("state", 1, kProtoUint32));
+  }
+
+  {
+    events.emplace_back(Event{});
+    Event* event = &events.back();
+    event->name = "mm_filemap_add_to_page_cache";
+    event->group = "filemap";
+    event->proto_field_id = 97;
+    event->fields.push_back(MakeField("pfn", 1, kProtoUint64));
+    event->fields.push_back(MakeField("i_ino", 2, kProtoUint64));
+    event->fields.push_back(MakeField("index", 3, kProtoUint64));
+    event->fields.push_back(MakeField("s_dev", 4, kProtoUint64));
+    event->fields.push_back(MakeField("page", 5, kProtoUint64));
+  }
+
+  {
+    events.emplace_back(Event{});
+    Event* event = &events.back();
+    event->name = "mm_filemap_delete_from_page_cache";
+    event->group = "filemap";
+    event->proto_field_id = 98;
+    event->fields.push_back(MakeField("pfn", 1, kProtoUint64));
+    event->fields.push_back(MakeField("i_ino", 2, kProtoUint64));
+    event->fields.push_back(MakeField("index", 3, kProtoUint64));
+    event->fields.push_back(MakeField("s_dev", 4, kProtoUint64));
+    event->fields.push_back(MakeField("page", 5, kProtoUint64));
+  }
+
+  {
+    events.emplace_back(Event{});
+    Event* event = &events.back();
+    event->name = "mm_compaction_begin";
+    event->group = "compaction";
+    event->proto_field_id = 99;
+    event->fields.push_back(MakeField("zone_start", 1, kProtoUint64));
+    event->fields.push_back(MakeField("migrate_pfn", 2, kProtoUint64));
+    event->fields.push_back(MakeField("free_pfn", 3, kProtoUint64));
+    event->fields.push_back(MakeField("zone_end", 4, kProtoUint64));
+    event->fields.push_back(MakeField("sync", 5, kProtoUint32));
+  }
+
+  {
+    events.emplace_back(Event{});
+    Event* event = &events.back();
+    event->name = "mm_compaction_defer_compaction";
+    event->group = "compaction";
+    event->proto_field_id = 100;
+    event->fields.push_back(MakeField("nid", 1, kProtoInt32));
+    event->fields.push_back(MakeField("idx", 2, kProtoUint32));
+    event->fields.push_back(MakeField("order", 3, kProtoInt32));
+    event->fields.push_back(MakeField("considered", 4, kProtoUint32));
+    event->fields.push_back(MakeField("defer_shift", 5, kProtoUint32));
+    event->fields.push_back(MakeField("order_failed", 6, kProtoInt32));
+  }
+
+  {
+    events.emplace_back(Event{});
+    Event* event = &events.back();
+    event->name = "mm_compaction_deferred";
+    event->group = "compaction";
+    event->proto_field_id = 101;
+    event->fields.push_back(MakeField("nid", 1, kProtoInt32));
+    event->fields.push_back(MakeField("idx", 2, kProtoUint32));
+    event->fields.push_back(MakeField("order", 3, kProtoInt32));
+    event->fields.push_back(MakeField("considered", 4, kProtoUint32));
+    event->fields.push_back(MakeField("defer_shift", 5, kProtoUint32));
+    event->fields.push_back(MakeField("order_failed", 6, kProtoInt32));
+  }
+
+  {
+    events.emplace_back(Event{});
+    Event* event = &events.back();
+    event->name = "mm_compaction_defer_reset";
+    event->group = "compaction";
+    event->proto_field_id = 102;
+    event->fields.push_back(MakeField("nid", 1, kProtoInt32));
+    event->fields.push_back(MakeField("idx", 2, kProtoUint32));
+    event->fields.push_back(MakeField("order", 3, kProtoInt32));
+    event->fields.push_back(MakeField("considered", 4, kProtoUint32));
+    event->fields.push_back(MakeField("defer_shift", 5, kProtoUint32));
+    event->fields.push_back(MakeField("order_failed", 6, kProtoInt32));
+  }
+
+  {
+    events.emplace_back(Event{});
+    Event* event = &events.back();
+    event->name = "mm_compaction_end";
+    event->group = "compaction";
+    event->proto_field_id = 103;
+    event->fields.push_back(MakeField("zone_start", 1, kProtoUint64));
+    event->fields.push_back(MakeField("migrate_pfn", 2, kProtoUint64));
+    event->fields.push_back(MakeField("free_pfn", 3, kProtoUint64));
+    event->fields.push_back(MakeField("zone_end", 4, kProtoUint64));
+    event->fields.push_back(MakeField("sync", 5, kProtoUint32));
+    event->fields.push_back(MakeField("status", 6, kProtoInt32));
+  }
+
+  {
+    events.emplace_back(Event{});
+    Event* event = &events.back();
+    event->name = "mm_compaction_finished";
+    event->group = "compaction";
+    event->proto_field_id = 104;
+    event->fields.push_back(MakeField("nid", 1, kProtoInt32));
+    event->fields.push_back(MakeField("idx", 2, kProtoUint32));
+    event->fields.push_back(MakeField("order", 3, kProtoInt32));
+    event->fields.push_back(MakeField("ret", 4, kProtoInt32));
+  }
+
+  {
+    events.emplace_back(Event{});
+    Event* event = &events.back();
+    event->name = "mm_compaction_isolate_freepages";
+    event->group = "compaction";
+    event->proto_field_id = 105;
+    event->fields.push_back(MakeField("start_pfn", 1, kProtoUint64));
+    event->fields.push_back(MakeField("end_pfn", 2, kProtoUint64));
+    event->fields.push_back(MakeField("nr_scanned", 3, kProtoUint64));
+    event->fields.push_back(MakeField("nr_taken", 4, kProtoUint64));
+  }
+
+  {
+    events.emplace_back(Event{});
+    Event* event = &events.back();
+    event->name = "mm_compaction_isolate_migratepages";
+    event->group = "compaction";
+    event->proto_field_id = 106;
+    event->fields.push_back(MakeField("start_pfn", 1, kProtoUint64));
+    event->fields.push_back(MakeField("end_pfn", 2, kProtoUint64));
+    event->fields.push_back(MakeField("nr_scanned", 3, kProtoUint64));
+    event->fields.push_back(MakeField("nr_taken", 4, kProtoUint64));
+  }
+
+  {
+    events.emplace_back(Event{});
+    Event* event = &events.back();
+    event->name = "mm_compaction_kcompactd_sleep";
+    event->group = "compaction";
+    event->proto_field_id = 107;
+    event->fields.push_back(MakeField("nid", 1, kProtoInt32));
+  }
+
+  {
+    events.emplace_back(Event{});
+    Event* event = &events.back();
+    event->name = "mm_compaction_kcompactd_wake";
+    event->group = "compaction";
+    event->proto_field_id = 108;
+    event->fields.push_back(MakeField("nid", 1, kProtoInt32));
+    event->fields.push_back(MakeField("order", 2, kProtoInt32));
+    event->fields.push_back(MakeField("classzone_idx", 3, kProtoUint32));
+  }
+
+  {
+    events.emplace_back(Event{});
+    Event* event = &events.back();
+    event->name = "mm_compaction_migratepages";
+    event->group = "compaction";
+    event->proto_field_id = 109;
+    event->fields.push_back(MakeField("nr_migrated", 1, kProtoUint64));
+    event->fields.push_back(MakeField("nr_failed", 2, kProtoUint64));
+  }
+
+  {
+    events.emplace_back(Event{});
+    Event* event = &events.back();
+    event->name = "mm_compaction_suitable";
+    event->group = "compaction";
+    event->proto_field_id = 110;
+    event->fields.push_back(MakeField("nid", 1, kProtoInt32));
+    event->fields.push_back(MakeField("idx", 2, kProtoUint32));
+    event->fields.push_back(MakeField("order", 3, kProtoInt32));
+    event->fields.push_back(MakeField("ret", 4, kProtoInt32));
+  }
+
+  {
+    events.emplace_back(Event{});
+    Event* event = &events.back();
+    event->name = "mm_compaction_try_to_compact_pages";
+    event->group = "compaction";
+    event->proto_field_id = 111;
+    event->fields.push_back(MakeField("order", 1, kProtoInt32));
+    event->fields.push_back(MakeField("gfp_mask", 2, kProtoUint32));
+    event->fields.push_back(MakeField("mode", 3, kProtoUint32));
+  }
+
+  {
+    events.emplace_back(Event{});
+    Event* event = &events.back();
+    event->name = "mm_compaction_wakeup_kcompactd";
+    event->group = "compaction";
+    event->proto_field_id = 112;
+    event->fields.push_back(MakeField("nid", 1, kProtoInt32));
+    event->fields.push_back(MakeField("order", 2, kProtoInt32));
+    event->fields.push_back(MakeField("classzone_idx", 3, kProtoUint32));
+  }
+
+  {
+    events.emplace_back(Event{});
+    Event* event = &events.back();
+    event->name = "suspend_resume";
+    event->group = "power";
+    event->proto_field_id = 113;
+    event->fields.push_back(MakeField("action", 1, kProtoString));
+    event->fields.push_back(MakeField("val", 2, kProtoInt32));
+    event->fields.push_back(MakeField("start", 3, kProtoUint32));
+  }
+
+  {
+    events.emplace_back(Event{});
+    Event* event = &events.back();
+    event->name = "sched_wakeup_new";
+    event->group = "sched";
+    event->proto_field_id = 114;
+    event->fields.push_back(MakeField("comm", 1, kProtoString));
+    event->fields.push_back(MakeField("pid", 2, kProtoInt32));
+    event->fields.push_back(MakeField("prio", 3, kProtoInt32));
+    event->fields.push_back(MakeField("success", 4, kProtoInt32));
+    event->fields.push_back(MakeField("target_cpu", 5, kProtoInt32));
+  }
+
+  {
+    events.emplace_back(Event{});
+    Event* event = &events.back();
     event->name = "block_bio_backmerge";
     event->group = "block";
     event->proto_field_id = 115;
@@ -231,21 +1469,6 @@
   {
     events.emplace_back(Event{});
     Event* event = &events.back();
-    event->name = "block_rq_issue";
-    event->group = "block";
-    event->proto_field_id = 45;
-    event->fields.push_back(MakeField("dev", 1, kProtoUint64));
-    event->fields.push_back(MakeField("sector", 2, kProtoUint64));
-    event->fields.push_back(MakeField("nr_sector", 3, kProtoUint32));
-    event->fields.push_back(MakeField("bytes", 4, kProtoUint32));
-    event->fields.push_back(MakeField("rwbs", 5, kProtoString));
-    event->fields.push_back(MakeField("comm", 6, kProtoString));
-    event->fields.push_back(MakeField("cmd", 7, kProtoString));
-  }
-
-  {
-    events.emplace_back(Event{});
-    Event* event = &events.back();
     event->name = "block_rq_remap";
     event->group = "block";
     event->proto_field_id = 128;
@@ -322,346 +1545,6 @@
   {
     events.emplace_back(Event{});
     Event* event = &events.back();
-    event->name = "cgroup_attach_task";
-    event->group = "cgroup";
-    event->proto_field_id = 67;
-    event->fields.push_back(MakeField("dst_root", 1, kProtoInt32));
-    event->fields.push_back(MakeField("dst_id", 2, kProtoInt32));
-    event->fields.push_back(MakeField("pid", 3, kProtoInt32));
-    event->fields.push_back(MakeField("comm", 4, kProtoString));
-    event->fields.push_back(MakeField("cname", 5, kProtoString));
-  }
-
-  {
-    events.emplace_back(Event{});
-    Event* event = &events.back();
-    event->name = "cgroup_destroy_root";
-    event->group = "cgroup";
-    event->proto_field_id = 72;
-    event->fields.push_back(MakeField("root", 1, kProtoInt32));
-    event->fields.push_back(MakeField("ss_mask", 2, kProtoUint32));
-    event->fields.push_back(MakeField("name", 3, kProtoString));
-  }
-
-  {
-    events.emplace_back(Event{});
-    Event* event = &events.back();
-    event->name = "cgroup_mkdir";
-    event->group = "cgroup";
-    event->proto_field_id = 68;
-    event->fields.push_back(MakeField("root", 1, kProtoInt32));
-    event->fields.push_back(MakeField("id", 2, kProtoInt32));
-    event->fields.push_back(MakeField("cname", 3, kProtoString));
-  }
-
-  {
-    events.emplace_back(Event{});
-    Event* event = &events.back();
-    event->name = "cgroup_release";
-    event->group = "cgroup";
-    event->proto_field_id = 73;
-    event->fields.push_back(MakeField("root", 1, kProtoInt32));
-    event->fields.push_back(MakeField("id", 2, kProtoInt32));
-    event->fields.push_back(MakeField("cname", 3, kProtoString));
-  }
-
-  {
-    events.emplace_back(Event{});
-    Event* event = &events.back();
-    event->name = "cgroup_remount";
-    event->group = "cgroup";
-    event->proto_field_id = 69;
-    event->fields.push_back(MakeField("root", 1, kProtoInt32));
-    event->fields.push_back(MakeField("ss_mask", 2, kProtoUint32));
-    event->fields.push_back(MakeField("name", 3, kProtoString));
-  }
-
-  {
-    events.emplace_back(Event{});
-    Event* event = &events.back();
-    event->name = "cgroup_rename";
-    event->group = "cgroup";
-    event->proto_field_id = 74;
-    event->fields.push_back(MakeField("root", 1, kProtoInt32));
-    event->fields.push_back(MakeField("id", 2, kProtoInt32));
-    event->fields.push_back(MakeField("cname", 3, kProtoString));
-  }
-
-  {
-    events.emplace_back(Event{});
-    Event* event = &events.back();
-    event->name = "cgroup_rmdir";
-    event->group = "cgroup";
-    event->proto_field_id = 70;
-    event->fields.push_back(MakeField("root", 1, kProtoInt32));
-    event->fields.push_back(MakeField("id", 2, kProtoInt32));
-    event->fields.push_back(MakeField("cname", 3, kProtoString));
-  }
-
-  {
-    events.emplace_back(Event{});
-    Event* event = &events.back();
-    event->name = "cgroup_setup_root";
-    event->group = "cgroup";
-    event->proto_field_id = 75;
-    event->fields.push_back(MakeField("root", 1, kProtoInt32));
-    event->fields.push_back(MakeField("ss_mask", 2, kProtoUint32));
-    event->fields.push_back(MakeField("name", 3, kProtoString));
-  }
-
-  {
-    events.emplace_back(Event{});
-    Event* event = &events.back();
-    event->name = "cgroup_transfer_tasks";
-    event->group = "cgroup";
-    event->proto_field_id = 71;
-    event->fields.push_back(MakeField("dst_root", 1, kProtoInt32));
-    event->fields.push_back(MakeField("dst_id", 2, kProtoInt32));
-    event->fields.push_back(MakeField("pid", 3, kProtoInt32));
-    event->fields.push_back(MakeField("comm", 4, kProtoString));
-    event->fields.push_back(MakeField("cname", 5, kProtoString));
-  }
-
-  {
-    events.emplace_back(Event{});
-    Event* event = &events.back();
-    event->name = "mm_compaction_begin";
-    event->group = "compaction";
-    event->proto_field_id = 99;
-    event->fields.push_back(MakeField("zone_start", 1, kProtoUint64));
-    event->fields.push_back(MakeField("migrate_pfn", 2, kProtoUint64));
-    event->fields.push_back(MakeField("free_pfn", 3, kProtoUint64));
-    event->fields.push_back(MakeField("zone_end", 4, kProtoUint64));
-    event->fields.push_back(MakeField("sync", 5, kProtoUint32));
-  }
-
-  {
-    events.emplace_back(Event{});
-    Event* event = &events.back();
-    event->name = "mm_compaction_defer_compaction";
-    event->group = "compaction";
-    event->proto_field_id = 100;
-    event->fields.push_back(MakeField("nid", 1, kProtoInt32));
-    event->fields.push_back(MakeField("idx", 2, kProtoUint32));
-    event->fields.push_back(MakeField("order", 3, kProtoInt32));
-    event->fields.push_back(MakeField("considered", 4, kProtoUint32));
-    event->fields.push_back(MakeField("defer_shift", 5, kProtoUint32));
-    event->fields.push_back(MakeField("order_failed", 6, kProtoInt32));
-  }
-
-  {
-    events.emplace_back(Event{});
-    Event* event = &events.back();
-    event->name = "mm_compaction_defer_reset";
-    event->group = "compaction";
-    event->proto_field_id = 102;
-    event->fields.push_back(MakeField("nid", 1, kProtoInt32));
-    event->fields.push_back(MakeField("idx", 2, kProtoUint32));
-    event->fields.push_back(MakeField("order", 3, kProtoInt32));
-    event->fields.push_back(MakeField("considered", 4, kProtoUint32));
-    event->fields.push_back(MakeField("defer_shift", 5, kProtoUint32));
-    event->fields.push_back(MakeField("order_failed", 6, kProtoInt32));
-  }
-
-  {
-    events.emplace_back(Event{});
-    Event* event = &events.back();
-    event->name = "mm_compaction_deferred";
-    event->group = "compaction";
-    event->proto_field_id = 101;
-    event->fields.push_back(MakeField("nid", 1, kProtoInt32));
-    event->fields.push_back(MakeField("idx", 2, kProtoUint32));
-    event->fields.push_back(MakeField("order", 3, kProtoInt32));
-    event->fields.push_back(MakeField("considered", 4, kProtoUint32));
-    event->fields.push_back(MakeField("defer_shift", 5, kProtoUint32));
-    event->fields.push_back(MakeField("order_failed", 6, kProtoInt32));
-  }
-
-  {
-    events.emplace_back(Event{});
-    Event* event = &events.back();
-    event->name = "mm_compaction_end";
-    event->group = "compaction";
-    event->proto_field_id = 103;
-    event->fields.push_back(MakeField("zone_start", 1, kProtoUint64));
-    event->fields.push_back(MakeField("migrate_pfn", 2, kProtoUint64));
-    event->fields.push_back(MakeField("free_pfn", 3, kProtoUint64));
-    event->fields.push_back(MakeField("zone_end", 4, kProtoUint64));
-    event->fields.push_back(MakeField("sync", 5, kProtoUint32));
-    event->fields.push_back(MakeField("status", 6, kProtoInt32));
-  }
-
-  {
-    events.emplace_back(Event{});
-    Event* event = &events.back();
-    event->name = "mm_compaction_finished";
-    event->group = "compaction";
-    event->proto_field_id = 104;
-    event->fields.push_back(MakeField("nid", 1, kProtoInt32));
-    event->fields.push_back(MakeField("idx", 2, kProtoUint32));
-    event->fields.push_back(MakeField("order", 3, kProtoInt32));
-    event->fields.push_back(MakeField("ret", 4, kProtoInt32));
-  }
-
-  {
-    events.emplace_back(Event{});
-    Event* event = &events.back();
-    event->name = "mm_compaction_isolate_freepages";
-    event->group = "compaction";
-    event->proto_field_id = 105;
-    event->fields.push_back(MakeField("start_pfn", 1, kProtoUint64));
-    event->fields.push_back(MakeField("end_pfn", 2, kProtoUint64));
-    event->fields.push_back(MakeField("nr_scanned", 3, kProtoUint64));
-    event->fields.push_back(MakeField("nr_taken", 4, kProtoUint64));
-  }
-
-  {
-    events.emplace_back(Event{});
-    Event* event = &events.back();
-    event->name = "mm_compaction_isolate_migratepages";
-    event->group = "compaction";
-    event->proto_field_id = 106;
-    event->fields.push_back(MakeField("start_pfn", 1, kProtoUint64));
-    event->fields.push_back(MakeField("end_pfn", 2, kProtoUint64));
-    event->fields.push_back(MakeField("nr_scanned", 3, kProtoUint64));
-    event->fields.push_back(MakeField("nr_taken", 4, kProtoUint64));
-  }
-
-  {
-    events.emplace_back(Event{});
-    Event* event = &events.back();
-    event->name = "mm_compaction_kcompactd_sleep";
-    event->group = "compaction";
-    event->proto_field_id = 107;
-    event->fields.push_back(MakeField("nid", 1, kProtoInt32));
-  }
-
-  {
-    events.emplace_back(Event{});
-    Event* event = &events.back();
-    event->name = "mm_compaction_kcompactd_wake";
-    event->group = "compaction";
-    event->proto_field_id = 108;
-    event->fields.push_back(MakeField("nid", 1, kProtoInt32));
-    event->fields.push_back(MakeField("order", 2, kProtoInt32));
-    event->fields.push_back(MakeField("classzone_idx", 3, kProtoUint32));
-  }
-
-  {
-    events.emplace_back(Event{});
-    Event* event = &events.back();
-    event->name = "mm_compaction_migratepages";
-    event->group = "compaction";
-    event->proto_field_id = 109;
-    event->fields.push_back(MakeField("nr_migrated", 1, kProtoUint64));
-    event->fields.push_back(MakeField("nr_failed", 2, kProtoUint64));
-  }
-
-  {
-    events.emplace_back(Event{});
-    Event* event = &events.back();
-    event->name = "mm_compaction_suitable";
-    event->group = "compaction";
-    event->proto_field_id = 110;
-    event->fields.push_back(MakeField("nid", 1, kProtoInt32));
-    event->fields.push_back(MakeField("idx", 2, kProtoUint32));
-    event->fields.push_back(MakeField("order", 3, kProtoInt32));
-    event->fields.push_back(MakeField("ret", 4, kProtoInt32));
-  }
-
-  {
-    events.emplace_back(Event{});
-    Event* event = &events.back();
-    event->name = "mm_compaction_try_to_compact_pages";
-    event->group = "compaction";
-    event->proto_field_id = 111;
-    event->fields.push_back(MakeField("order", 1, kProtoInt32));
-    event->fields.push_back(MakeField("gfp_mask", 2, kProtoUint32));
-    event->fields.push_back(MakeField("mode", 3, kProtoUint32));
-  }
-
-  {
-    events.emplace_back(Event{});
-    Event* event = &events.back();
-    event->name = "mm_compaction_wakeup_kcompactd";
-    event->group = "compaction";
-    event->proto_field_id = 112;
-    event->fields.push_back(MakeField("nid", 1, kProtoInt32));
-    event->fields.push_back(MakeField("order", 2, kProtoInt32));
-    event->fields.push_back(MakeField("classzone_idx", 3, kProtoUint32));
-  }
-
-  {
-    events.emplace_back(Event{});
-    Event* event = &events.back();
-    event->name = "cpufreq_interactive_already";
-    event->group = "cpufreq_interactive";
-    event->proto_field_id = 5;
-    event->fields.push_back(MakeField("cpu_id", 1, kProtoUint64));
-    event->fields.push_back(MakeField("load", 2, kProtoUint64));
-    event->fields.push_back(MakeField("curtarg", 3, kProtoUint64));
-    event->fields.push_back(MakeField("curactual", 4, kProtoUint64));
-    event->fields.push_back(MakeField("newtarg", 5, kProtoUint64));
-  }
-
-  {
-    events.emplace_back(Event{});
-    Event* event = &events.back();
-    event->name = "cpufreq_interactive_boost";
-    event->group = "cpufreq_interactive";
-    event->proto_field_id = 6;
-    event->fields.push_back(MakeField("s", 1, kProtoString));
-  }
-
-  {
-    events.emplace_back(Event{});
-    Event* event = &events.back();
-    event->name = "cpufreq_interactive_notyet";
-    event->group = "cpufreq_interactive";
-    event->proto_field_id = 7;
-    event->fields.push_back(MakeField("cpu_id", 1, kProtoUint64));
-    event->fields.push_back(MakeField("load", 2, kProtoUint64));
-    event->fields.push_back(MakeField("curtarg", 3, kProtoUint64));
-    event->fields.push_back(MakeField("curactual", 4, kProtoUint64));
-    event->fields.push_back(MakeField("newtarg", 5, kProtoUint64));
-  }
-
-  {
-    events.emplace_back(Event{});
-    Event* event = &events.back();
-    event->name = "cpufreq_interactive_setspeed";
-    event->group = "cpufreq_interactive";
-    event->proto_field_id = 8;
-    event->fields.push_back(MakeField("cpu_id", 1, kProtoUint32));
-    event->fields.push_back(MakeField("targfreq", 2, kProtoUint64));
-    event->fields.push_back(MakeField("actualfreq", 3, kProtoUint64));
-  }
-
-  {
-    events.emplace_back(Event{});
-    Event* event = &events.back();
-    event->name = "cpufreq_interactive_target";
-    event->group = "cpufreq_interactive";
-    event->proto_field_id = 9;
-    event->fields.push_back(MakeField("cpu_id", 1, kProtoUint64));
-    event->fields.push_back(MakeField("load", 2, kProtoUint64));
-    event->fields.push_back(MakeField("curtarg", 3, kProtoUint64));
-    event->fields.push_back(MakeField("curactual", 4, kProtoUint64));
-    event->fields.push_back(MakeField("newtarg", 5, kProtoUint64));
-  }
-
-  {
-    events.emplace_back(Event{});
-    Event* event = &events.back();
-    event->name = "cpufreq_interactive_unboost";
-    event->group = "cpufreq_interactive";
-    event->proto_field_id = 10;
-    event->fields.push_back(MakeField("s", 1, kProtoString));
-  }
-
-  {
-    events.emplace_back(Event{});
-    Event* event = &events.back();
     event->name = "ext4_alloc_da_blocks";
     event->group = "ext4";
     event->proto_field_id = 134;
@@ -753,6 +1636,7 @@
     event->fields.push_back(MakeField("reserved_data_blocks", 4, kProtoInt32));
     event->fields.push_back(MakeField("reserved_meta_blocks", 5, kProtoInt32));
     event->fields.push_back(MakeField("mode", 6, kProtoUint32));
+    event->fields.push_back(MakeField("md_needed", 7, kProtoInt32));
   }
 
   {
@@ -775,32 +1659,6 @@
   {
     events.emplace_back(Event{});
     Event* event = &events.back();
-    event->name = "ext4_da_write_begin";
-    event->group = "ext4";
-    event->proto_field_id = 41;
-    event->fields.push_back(MakeField("dev", 1, kProtoUint64));
-    event->fields.push_back(MakeField("ino", 2, kProtoUint64));
-    event->fields.push_back(MakeField("pos", 3, kProtoInt64));
-    event->fields.push_back(MakeField("len", 4, kProtoUint32));
-    event->fields.push_back(MakeField("flags", 5, kProtoUint32));
-  }
-
-  {
-    events.emplace_back(Event{});
-    Event* event = &events.back();
-    event->name = "ext4_da_write_end";
-    event->group = "ext4";
-    event->proto_field_id = 42;
-    event->fields.push_back(MakeField("dev", 1, kProtoUint64));
-    event->fields.push_back(MakeField("ino", 2, kProtoUint64));
-    event->fields.push_back(MakeField("pos", 3, kProtoInt64));
-    event->fields.push_back(MakeField("len", 4, kProtoUint32));
-    event->fields.push_back(MakeField("copied", 5, kProtoUint32));
-  }
-
-  {
-    events.emplace_back(Event{});
-    Event* event = &events.back();
     event->name = "ext4_da_write_pages";
     event->group = "ext4";
     event->proto_field_id = 142;
@@ -809,6 +1667,11 @@
     event->fields.push_back(MakeField("first_page", 3, kProtoUint64));
     event->fields.push_back(MakeField("nr_to_write", 4, kProtoInt64));
     event->fields.push_back(MakeField("sync_mode", 5, kProtoInt32));
+    event->fields.push_back(MakeField("b_blocknr", 6, kProtoUint64));
+    event->fields.push_back(MakeField("b_size", 7, kProtoUint32));
+    event->fields.push_back(MakeField("b_state", 8, kProtoUint32));
+    event->fields.push_back(MakeField("io_done", 9, kProtoInt32));
+    event->fields.push_back(MakeField("pages_written", 10, kProtoInt32));
   }
 
   {
@@ -919,7 +1782,7 @@
     event->fields.push_back(MakeField("lblk", 3, kProtoUint32));
     event->fields.push_back(MakeField("len", 4, kProtoUint32));
     event->fields.push_back(MakeField("pblk", 5, kProtoUint64));
-    event->fields.push_back(MakeField("status", 6, kProtoUint32));
+    event->fields.push_back(MakeField("status", 6, kProtoUint64));
   }
 
   {
@@ -933,7 +1796,7 @@
     event->fields.push_back(MakeField("lblk", 3, kProtoUint32));
     event->fields.push_back(MakeField("len", 4, kProtoUint32));
     event->fields.push_back(MakeField("pblk", 5, kProtoUint64));
-    event->fields.push_back(MakeField("status", 6, kProtoUint32));
+    event->fields.push_back(MakeField("status", 6, kProtoUint64));
   }
 
   {
@@ -958,7 +1821,7 @@
     event->fields.push_back(MakeField("lblk", 3, kProtoUint32));
     event->fields.push_back(MakeField("len", 4, kProtoUint32));
     event->fields.push_back(MakeField("pblk", 5, kProtoUint64));
-    event->fields.push_back(MakeField("status", 6, kProtoUint32));
+    event->fields.push_back(MakeField("status", 6, kProtoUint64));
     event->fields.push_back(MakeField("found", 7, kProtoInt32));
   }
 
@@ -1224,6 +2087,7 @@
     event->fields.push_back(MakeField("offset", 3, kProtoInt64));
     event->fields.push_back(MakeField("len", 4, kProtoInt64));
     event->fields.push_back(MakeField("mode", 5, kProtoInt32));
+    event->fields.push_back(MakeField("pos", 6, kProtoInt64));
   }
 
   {
@@ -1371,7 +2235,7 @@
     event->fields.push_back(MakeField("dev", 1, kProtoUint64));
     event->fields.push_back(MakeField("ino", 2, kProtoUint64));
     event->fields.push_back(MakeField("index", 3, kProtoUint64));
-    event->fields.push_back(MakeField("offset", 4, kProtoUint32));
+    event->fields.push_back(MakeField("offset", 4, kProtoUint64));
     event->fields.push_back(MakeField("length", 5, kProtoUint32));
   }
 
@@ -1385,6 +2249,7 @@
     event->fields.push_back(MakeField("ip", 2, kProtoUint64));
     event->fields.push_back(MakeField("blocks", 3, kProtoInt32));
     event->fields.push_back(MakeField("rsv_blocks", 4, kProtoInt32));
+    event->fields.push_back(MakeField("nblocks", 5, kProtoInt32));
   }
 
   {
@@ -1407,7 +2272,7 @@
     event->fields.push_back(MakeField("dev", 1, kProtoUint64));
     event->fields.push_back(MakeField("ino", 2, kProtoUint64));
     event->fields.push_back(MakeField("index", 3, kProtoUint64));
-    event->fields.push_back(MakeField("offset", 4, kProtoUint32));
+    event->fields.push_back(MakeField("offset", 4, kProtoUint64));
     event->fields.push_back(MakeField("length", 5, kProtoUint32));
   }
 
@@ -1713,29 +2578,6 @@
   {
     events.emplace_back(Event{});
     Event* event = &events.back();
-    event->name = "ext4_sync_file_enter";
-    event->group = "ext4";
-    event->proto_field_id = 43;
-    event->fields.push_back(MakeField("dev", 1, kProtoUint64));
-    event->fields.push_back(MakeField("ino", 2, kProtoUint64));
-    event->fields.push_back(MakeField("parent", 3, kProtoUint64));
-    event->fields.push_back(MakeField("datasync", 4, kProtoInt32));
-  }
-
-  {
-    events.emplace_back(Event{});
-    Event* event = &events.back();
-    event->name = "ext4_sync_file_exit";
-    event->group = "ext4";
-    event->proto_field_id = 44;
-    event->fields.push_back(MakeField("dev", 1, kProtoUint64));
-    event->fields.push_back(MakeField("ino", 2, kProtoUint64));
-    event->fields.push_back(MakeField("ret", 3, kProtoInt32));
-  }
-
-  {
-    events.emplace_back(Event{});
-    Event* event = &events.back();
     event->name = "ext4_sync_fs";
     event->group = "ext4";
     event->proto_field_id = 212;
@@ -1900,667 +2742,25 @@
   {
     events.emplace_back(Event{});
     Event* event = &events.back();
-    event->name = "mm_filemap_add_to_page_cache";
-    event->group = "filemap";
-    event->proto_field_id = 97;
-    event->fields.push_back(MakeField("pfn", 1, kProtoUint64));
-    event->fields.push_back(MakeField("i_ino", 2, kProtoUint64));
-    event->fields.push_back(MakeField("index", 3, kProtoUint64));
-    event->fields.push_back(MakeField("s_dev", 4, kProtoUint64));
-  }
-
-  {
-    events.emplace_back(Event{});
-    Event* event = &events.back();
-    event->name = "mm_filemap_delete_from_page_cache";
-    event->group = "filemap";
-    event->proto_field_id = 98;
-    event->fields.push_back(MakeField("pfn", 1, kProtoUint64));
-    event->fields.push_back(MakeField("i_ino", 2, kProtoUint64));
-    event->fields.push_back(MakeField("index", 3, kProtoUint64));
-    event->fields.push_back(MakeField("s_dev", 4, kProtoUint64));
-  }
-
-  {
-    events.emplace_back(Event{});
-    Event* event = &events.back();
-    event->name = "print";
-    event->group = "ftrace";
-    event->proto_field_id = 3;
-    event->fields.push_back(MakeField("ip", 1, kProtoUint64));
-    event->fields.push_back(MakeField("buf", 2, kProtoString));
-  }
-
-  {
-    events.emplace_back(Event{});
-    Event* event = &events.back();
-    event->name = "i2c_read";
-    event->group = "i2c";
-    event->proto_field_id = 27;
-    event->fields.push_back(MakeField("adapter_nr", 1, kProtoInt32));
-    event->fields.push_back(MakeField("msg_nr", 2, kProtoUint32));
-    event->fields.push_back(MakeField("addr", 3, kProtoUint32));
-    event->fields.push_back(MakeField("flags", 4, kProtoUint32));
-    event->fields.push_back(MakeField("len", 5, kProtoUint32));
-  }
-
-  {
-    events.emplace_back(Event{});
-    Event* event = &events.back();
-    event->name = "i2c_reply";
-    event->group = "i2c";
-    event->proto_field_id = 30;
-    event->fields.push_back(MakeField("adapter_nr", 1, kProtoInt32));
-    event->fields.push_back(MakeField("msg_nr", 2, kProtoUint32));
-    event->fields.push_back(MakeField("addr", 3, kProtoUint32));
-    event->fields.push_back(MakeField("flags", 4, kProtoUint32));
-    event->fields.push_back(MakeField("len", 5, kProtoUint32));
-    event->fields.push_back(MakeField("buf", 6, kProtoUint32));
-  }
-
-  {
-    events.emplace_back(Event{});
-    Event* event = &events.back();
-    event->name = "i2c_result";
-    event->group = "i2c";
-    event->proto_field_id = 29;
-    event->fields.push_back(MakeField("adapter_nr", 1, kProtoInt32));
-    event->fields.push_back(MakeField("nr_msgs", 2, kProtoUint32));
-    event->fields.push_back(MakeField("ret", 3, kProtoInt32));
-  }
-
-  {
-    events.emplace_back(Event{});
-    Event* event = &events.back();
-    event->name = "i2c_write";
-    event->group = "i2c";
-    event->proto_field_id = 28;
-    event->fields.push_back(MakeField("adapter_nr", 1, kProtoInt32));
-    event->fields.push_back(MakeField("msg_nr", 2, kProtoUint32));
-    event->fields.push_back(MakeField("addr", 3, kProtoUint32));
-    event->fields.push_back(MakeField("flags", 4, kProtoUint32));
-    event->fields.push_back(MakeField("len", 5, kProtoUint32));
-    event->fields.push_back(MakeField("buf", 6, kProtoUint32));
-  }
-
-  {
-    events.emplace_back(Event{});
-    Event* event = &events.back();
-    event->name = "smbus_read";
-    event->group = "i2c";
-    event->proto_field_id = 31;
-    event->fields.push_back(MakeField("adapter_nr", 1, kProtoInt32));
-    event->fields.push_back(MakeField("flags", 2, kProtoUint32));
-    event->fields.push_back(MakeField("addr", 3, kProtoUint32));
-    event->fields.push_back(MakeField("command", 4, kProtoUint32));
-    event->fields.push_back(MakeField("protocol", 5, kProtoUint32));
-  }
-
-  {
-    events.emplace_back(Event{});
-    Event* event = &events.back();
-    event->name = "smbus_reply";
-    event->group = "i2c";
-    event->proto_field_id = 34;
-    event->fields.push_back(MakeField("adapter_nr", 1, kProtoInt32));
-    event->fields.push_back(MakeField("addr", 2, kProtoUint32));
-    event->fields.push_back(MakeField("flags", 3, kProtoUint32));
-    event->fields.push_back(MakeField("command", 4, kProtoUint32));
-    event->fields.push_back(MakeField("len", 5, kProtoUint32));
-    event->fields.push_back(MakeField("protocol", 6, kProtoUint32));
-  }
-
-  {
-    events.emplace_back(Event{});
-    Event* event = &events.back();
-    event->name = "smbus_result";
-    event->group = "i2c";
-    event->proto_field_id = 33;
-    event->fields.push_back(MakeField("adapter_nr", 1, kProtoInt32));
-    event->fields.push_back(MakeField("addr", 2, kProtoUint32));
-    event->fields.push_back(MakeField("flags", 3, kProtoUint32));
-    event->fields.push_back(MakeField("read_write", 4, kProtoUint32));
-    event->fields.push_back(MakeField("command", 5, kProtoUint32));
-    event->fields.push_back(MakeField("res", 6, kProtoInt32));
-    event->fields.push_back(MakeField("protocol", 7, kProtoUint32));
-  }
-
-  {
-    events.emplace_back(Event{});
-    Event* event = &events.back();
-    event->name = "smbus_write";
-    event->group = "i2c";
-    event->proto_field_id = 32;
-    event->fields.push_back(MakeField("adapter_nr", 1, kProtoInt32));
-    event->fields.push_back(MakeField("addr", 2, kProtoUint32));
-    event->fields.push_back(MakeField("flags", 3, kProtoUint32));
-    event->fields.push_back(MakeField("command", 4, kProtoUint32));
-    event->fields.push_back(MakeField("len", 5, kProtoUint32));
-    event->fields.push_back(MakeField("protocol", 6, kProtoUint32));
-  }
-
-  {
-    events.emplace_back(Event{});
-    Event* event = &events.back();
-    event->name = "ipi_entry";
-    event->group = "ipi";
-    event->proto_field_id = 21;
-    event->fields.push_back(MakeField("reason", 1, kProtoString));
-  }
-
-  {
-    events.emplace_back(Event{});
-    Event* event = &events.back();
-    event->name = "ipi_exit";
-    event->group = "ipi";
-    event->proto_field_id = 22;
-    event->fields.push_back(MakeField("reason", 1, kProtoString));
-  }
-
-  {
-    events.emplace_back(Event{});
-    Event* event = &events.back();
-    event->name = "ipi_raise";
-    event->group = "ipi";
-    event->proto_field_id = 23;
-    event->fields.push_back(MakeField("target_cpus", 1, kProtoUint32));
-    event->fields.push_back(MakeField("reason", 2, kProtoString));
-  }
-
-  {
-    events.emplace_back(Event{});
-    Event* event = &events.back();
-    event->name = "irq_handler_entry";
-    event->group = "irq";
-    event->proto_field_id = 36;
-    event->fields.push_back(MakeField("irq", 1, kProtoInt32));
-    event->fields.push_back(MakeField("name", 2, kProtoString));
-  }
-
-  {
-    events.emplace_back(Event{});
-    Event* event = &events.back();
-    event->name = "irq_handler_exit";
-    event->group = "irq";
-    event->proto_field_id = 37;
-    event->fields.push_back(MakeField("irq", 1, kProtoInt32));
-    event->fields.push_back(MakeField("ret", 2, kProtoInt32));
-  }
-
-  {
-    events.emplace_back(Event{});
-    Event* event = &events.back();
-    event->name = "softirq_entry";
-    event->group = "irq";
-    event->proto_field_id = 24;
-    event->fields.push_back(MakeField("vec", 1, kProtoUint32));
-  }
-
-  {
-    events.emplace_back(Event{});
-    Event* event = &events.back();
-    event->name = "softirq_exit";
-    event->group = "irq";
-    event->proto_field_id = 25;
-    event->fields.push_back(MakeField("vec", 1, kProtoUint32));
-  }
-
-  {
-    events.emplace_back(Event{});
-    Event* event = &events.back();
-    event->name = "softirq_raise";
-    event->group = "irq";
-    event->proto_field_id = 26;
-    event->fields.push_back(MakeField("vec", 1, kProtoUint32));
-  }
-
-  {
-    events.emplace_back(Event{});
-    Event* event = &events.back();
-    event->name = "lowmemory_kill";
-    event->group = "lowmemorykiller";
-    event->proto_field_id = 35;
-    event->fields.push_back(MakeField("comm", 1, kProtoString));
-    event->fields.push_back(MakeField("pid", 2, kProtoInt32));
-    event->fields.push_back(MakeField("pagecache_size", 3, kProtoInt64));
-    event->fields.push_back(MakeField("pagecache_limit", 4, kProtoInt64));
-    event->fields.push_back(MakeField("free", 5, kProtoInt64));
-  }
-
-  {
-    events.emplace_back(Event{});
-    Event* event = &events.back();
-    event->name = "mdp_cmd_kickoff";
-    event->group = "mdss";
-    event->proto_field_id = 76;
-    event->fields.push_back(MakeField("ctl_num", 1, kProtoUint32));
-    event->fields.push_back(MakeField("kickoff_cnt", 2, kProtoInt32));
-  }
-
-  {
-    events.emplace_back(Event{});
-    Event* event = &events.back();
-    event->name = "mdp_cmd_pingpong_done";
-    event->group = "mdss";
-    event->proto_field_id = 81;
-    event->fields.push_back(MakeField("ctl_num", 1, kProtoUint32));
-    event->fields.push_back(MakeField("intf_num", 2, kProtoUint32));
-    event->fields.push_back(MakeField("pp_num", 3, kProtoUint32));
-    event->fields.push_back(MakeField("koff_cnt", 4, kProtoInt32));
-  }
-
-  {
-    events.emplace_back(Event{});
-    Event* event = &events.back();
-    event->name = "mdp_cmd_readptr_done";
-    event->group = "mdss";
-    event->proto_field_id = 85;
-    event->fields.push_back(MakeField("ctl_num", 1, kProtoUint32));
-    event->fields.push_back(MakeField("koff_cnt", 2, kProtoInt32));
-  }
-
-  {
-    events.emplace_back(Event{});
-    Event* event = &events.back();
-    event->name = "mdp_cmd_release_bw";
-    event->group = "mdss";
-    event->proto_field_id = 89;
-    event->fields.push_back(MakeField("ctl_num", 1, kProtoUint32));
-  }
-
-  {
-    events.emplace_back(Event{});
-    Event* event = &events.back();
-    event->name = "mdp_cmd_wait_pingpong";
-    event->group = "mdss";
-    event->proto_field_id = 93;
-    event->fields.push_back(MakeField("ctl_num", 1, kProtoUint32));
-    event->fields.push_back(MakeField("kickoff_cnt", 2, kProtoInt32));
-  }
-
-  {
-    events.emplace_back(Event{});
-    Event* event = &events.back();
-    event->name = "mdp_commit";
-    event->group = "mdss";
-    event->proto_field_id = 77;
-    event->fields.push_back(MakeField("num", 1, kProtoUint32));
-    event->fields.push_back(MakeField("play_cnt", 2, kProtoUint32));
-    event->fields.push_back(MakeField("clk_rate", 3, kProtoUint32));
-    event->fields.push_back(MakeField("bandwidth", 4, kProtoUint64));
-  }
-
-  {
-    events.emplace_back(Event{});
-    Event* event = &events.back();
-    event->name = "mdp_compare_bw";
-    event->group = "mdss";
-    event->proto_field_id = 82;
-    event->fields.push_back(MakeField("new_ab", 1, kProtoUint64));
-    event->fields.push_back(MakeField("new_ib", 2, kProtoUint64));
-    event->fields.push_back(MakeField("new_wb", 3, kProtoUint64));
-    event->fields.push_back(MakeField("old_ab", 4, kProtoUint64));
-    event->fields.push_back(MakeField("old_ib", 5, kProtoUint64));
-    event->fields.push_back(MakeField("old_wb", 6, kProtoUint64));
-    event->fields.push_back(MakeField("params_changed", 7, kProtoUint32));
-    event->fields.push_back(MakeField("update_bw", 8, kProtoUint32));
-  }
-
-  {
-    events.emplace_back(Event{});
-    Event* event = &events.back();
-    event->name = "mdp_misr_crc";
-    event->group = "mdss";
-    event->proto_field_id = 86;
-    event->fields.push_back(MakeField("block_id", 1, kProtoUint32));
-    event->fields.push_back(MakeField("vsync_cnt", 2, kProtoUint32));
-    event->fields.push_back(MakeField("crc", 3, kProtoUint32));
-  }
-
-  {
-    events.emplace_back(Event{});
-    Event* event = &events.back();
-    event->name = "mdp_mixer_update";
-    event->group = "mdss";
-    event->proto_field_id = 90;
-    event->fields.push_back(MakeField("mixer_num", 1, kProtoUint32));
-  }
-
-  {
-    events.emplace_back(Event{});
-    Event* event = &events.back();
-    event->name = "mdp_perf_prefill_calc";
-    event->group = "mdss";
-    event->proto_field_id = 94;
-    event->fields.push_back(MakeField("pnum", 1, kProtoUint32));
-    event->fields.push_back(MakeField("latency_buf", 2, kProtoUint32));
-    event->fields.push_back(MakeField("ot", 3, kProtoUint32));
-    event->fields.push_back(MakeField("y_buf", 4, kProtoUint32));
-    event->fields.push_back(MakeField("y_scaler", 5, kProtoUint32));
-    event->fields.push_back(MakeField("pp_lines", 6, kProtoUint32));
-    event->fields.push_back(MakeField("pp_bytes", 7, kProtoUint32));
-    event->fields.push_back(MakeField("post_sc", 8, kProtoUint32));
-    event->fields.push_back(MakeField("fbc_bytes", 9, kProtoUint32));
-    event->fields.push_back(MakeField("prefill_bytes", 10, kProtoUint32));
-  }
-
-  {
-    events.emplace_back(Event{});
-    Event* event = &events.back();
-    event->name = "mdp_perf_set_ot";
-    event->group = "mdss";
-    event->proto_field_id = 78;
-    event->fields.push_back(MakeField("pnum", 1, kProtoUint32));
-    event->fields.push_back(MakeField("xin_id", 2, kProtoUint32));
-    event->fields.push_back(MakeField("rd_lim", 3, kProtoUint32));
-    event->fields.push_back(MakeField("is_vbif_rt", 4, kProtoUint32));
-  }
-
-  {
-    events.emplace_back(Event{});
-    Event* event = &events.back();
-    event->name = "mdp_perf_set_panic_luts";
-    event->group = "mdss";
-    event->proto_field_id = 83;
-    event->fields.push_back(MakeField("pnum", 1, kProtoUint32));
-    event->fields.push_back(MakeField("fmt", 2, kProtoUint32));
-    event->fields.push_back(MakeField("mode", 3, kProtoUint32));
-    event->fields.push_back(MakeField("panic_lut", 4, kProtoUint32));
-    event->fields.push_back(MakeField("robust_lut", 5, kProtoUint32));
-  }
-
-  {
-    events.emplace_back(Event{});
-    Event* event = &events.back();
-    event->name = "mdp_perf_set_qos_luts";
-    event->group = "mdss";
-    event->proto_field_id = 87;
-    event->fields.push_back(MakeField("pnum", 1, kProtoUint32));
-    event->fields.push_back(MakeField("fmt", 2, kProtoUint32));
-    event->fields.push_back(MakeField("intf", 3, kProtoUint32));
-    event->fields.push_back(MakeField("rot", 4, kProtoUint32));
-    event->fields.push_back(MakeField("fl", 5, kProtoUint32));
-    event->fields.push_back(MakeField("lut", 6, kProtoUint32));
-    event->fields.push_back(MakeField("linear", 7, kProtoUint32));
-  }
-
-  {
-    events.emplace_back(Event{});
-    Event* event = &events.back();
-    event->name = "mdp_perf_set_wm_levels";
-    event->group = "mdss";
-    event->proto_field_id = 91;
-    event->fields.push_back(MakeField("pnum", 1, kProtoUint32));
-    event->fields.push_back(MakeField("use_space", 2, kProtoUint32));
-    event->fields.push_back(MakeField("priority_bytes", 3, kProtoUint32));
-    event->fields.push_back(MakeField("wm0", 4, kProtoUint32));
-    event->fields.push_back(MakeField("wm1", 5, kProtoUint32));
-    event->fields.push_back(MakeField("wm2", 6, kProtoUint32));
-    event->fields.push_back(MakeField("mb_cnt", 7, kProtoUint32));
-    event->fields.push_back(MakeField("mb_size", 8, kProtoUint32));
-  }
-
-  {
-    events.emplace_back(Event{});
-    Event* event = &events.back();
-    event->name = "mdp_perf_update_bus";
-    event->group = "mdss";
-    event->proto_field_id = 95;
-    event->fields.push_back(MakeField("client", 1, kProtoInt32));
-    event->fields.push_back(MakeField("ab_quota", 2, kProtoUint64));
-    event->fields.push_back(MakeField("ib_quota", 3, kProtoUint64));
-  }
-
-  {
-    events.emplace_back(Event{});
-    Event* event = &events.back();
-    event->name = "mdp_sspp_change";
-    event->group = "mdss";
-    event->proto_field_id = 79;
-    event->fields.push_back(MakeField("num", 1, kProtoUint32));
-    event->fields.push_back(MakeField("play_cnt", 2, kProtoUint32));
-    event->fields.push_back(MakeField("mixer", 3, kProtoUint32));
-    event->fields.push_back(MakeField("stage", 4, kProtoUint32));
-    event->fields.push_back(MakeField("flags", 5, kProtoUint32));
-    event->fields.push_back(MakeField("format", 6, kProtoUint32));
-    event->fields.push_back(MakeField("img_w", 7, kProtoUint32));
-    event->fields.push_back(MakeField("img_h", 8, kProtoUint32));
-    event->fields.push_back(MakeField("src_x", 9, kProtoUint32));
-    event->fields.push_back(MakeField("src_y", 10, kProtoUint32));
-    event->fields.push_back(MakeField("src_w", 11, kProtoUint32));
-    event->fields.push_back(MakeField("src_h", 12, kProtoUint32));
-    event->fields.push_back(MakeField("dst_x", 13, kProtoUint32));
-    event->fields.push_back(MakeField("dst_y", 14, kProtoUint32));
-    event->fields.push_back(MakeField("dst_w", 15, kProtoUint32));
-    event->fields.push_back(MakeField("dst_h", 16, kProtoUint32));
-  }
-
-  {
-    events.emplace_back(Event{});
-    Event* event = &events.back();
-    event->name = "mdp_sspp_set";
-    event->group = "mdss";
-    event->proto_field_id = 84;
-    event->fields.push_back(MakeField("num", 1, kProtoUint32));
-    event->fields.push_back(MakeField("play_cnt", 2, kProtoUint32));
-    event->fields.push_back(MakeField("mixer", 3, kProtoUint32));
-    event->fields.push_back(MakeField("stage", 4, kProtoUint32));
-    event->fields.push_back(MakeField("flags", 5, kProtoUint32));
-    event->fields.push_back(MakeField("format", 6, kProtoUint32));
-    event->fields.push_back(MakeField("img_w", 7, kProtoUint32));
-    event->fields.push_back(MakeField("img_h", 8, kProtoUint32));
-    event->fields.push_back(MakeField("src_x", 9, kProtoUint32));
-    event->fields.push_back(MakeField("src_y", 10, kProtoUint32));
-    event->fields.push_back(MakeField("src_w", 11, kProtoUint32));
-    event->fields.push_back(MakeField("src_h", 12, kProtoUint32));
-    event->fields.push_back(MakeField("dst_x", 13, kProtoUint32));
-    event->fields.push_back(MakeField("dst_y", 14, kProtoUint32));
-    event->fields.push_back(MakeField("dst_w", 15, kProtoUint32));
-    event->fields.push_back(MakeField("dst_h", 16, kProtoUint32));
-  }
-
-  {
-    events.emplace_back(Event{});
-    Event* event = &events.back();
-    event->name = "mdp_trace_counter";
-    event->group = "mdss";
-    event->proto_field_id = 88;
+    event->name = "task_newtask";
+    event->group = "task";
+    event->proto_field_id = 235;
     event->fields.push_back(MakeField("pid", 1, kProtoInt32));
-    event->fields.push_back(MakeField("counter_name", 2, kProtoString));
-    event->fields.push_back(MakeField("value", 3, kProtoInt32));
+    event->fields.push_back(MakeField("comm", 2, kProtoString));
+    event->fields.push_back(MakeField("clone_flags", 3, kProtoUint64));
+    event->fields.push_back(MakeField("oom_score_adj", 4, kProtoInt32));
   }
 
   {
     events.emplace_back(Event{});
     Event* event = &events.back();
-    event->name = "mdp_video_underrun_done";
-    event->group = "mdss";
-    event->proto_field_id = 92;
-    event->fields.push_back(MakeField("ctl_num", 1, kProtoUint32));
-    event->fields.push_back(MakeField("underrun_cnt", 2, kProtoUint32));
-  }
-
-  {
-    events.emplace_back(Event{});
-    Event* event = &events.back();
-    event->name = "rotator_bw_ao_as_context";
-    event->group = "mdss";
-    event->proto_field_id = 96;
-    event->fields.push_back(MakeField("state", 1, kProtoUint32));
-  }
-
-  {
-    events.emplace_back(Event{});
-    Event* event = &events.back();
-    event->name = "tracing_mark_write";
-    event->group = "mdss";
-    event->proto_field_id = 80;
+    event->name = "task_rename";
+    event->group = "task";
+    event->proto_field_id = 236;
     event->fields.push_back(MakeField("pid", 1, kProtoInt32));
-    event->fields.push_back(MakeField("trace_name", 2, kProtoString));
-    event->fields.push_back(MakeField("trace_begin", 3, kProtoUint32));
-  }
-
-  {
-    events.emplace_back(Event{});
-    Event* event = &events.back();
-    event->name = "clock_disable";
-    event->group = "power";
-    event->proto_field_id = 15;
-    event->fields.push_back(MakeField("name", 1, kProtoString));
-    event->fields.push_back(MakeField("state", 2, kProtoUint64));
-    event->fields.push_back(MakeField("cpu_id", 3, kProtoUint64));
-  }
-
-  {
-    events.emplace_back(Event{});
-    Event* event = &events.back();
-    event->name = "clock_enable";
-    event->group = "power";
-    event->proto_field_id = 14;
-    event->fields.push_back(MakeField("name", 1, kProtoString));
-    event->fields.push_back(MakeField("state", 2, kProtoUint64));
-    event->fields.push_back(MakeField("cpu_id", 3, kProtoUint64));
-  }
-
-  {
-    events.emplace_back(Event{});
-    Event* event = &events.back();
-    event->name = "clock_set_rate";
-    event->group = "power";
-    event->proto_field_id = 16;
-    event->fields.push_back(MakeField("name", 1, kProtoString));
-    event->fields.push_back(MakeField("state", 2, kProtoUint64));
-    event->fields.push_back(MakeField("cpu_id", 3, kProtoUint64));
-  }
-
-  {
-    events.emplace_back(Event{});
-    Event* event = &events.back();
-    event->name = "cpu_frequency";
-    event->group = "power";
-    event->proto_field_id = 11;
-    event->fields.push_back(MakeField("state", 1, kProtoUint32));
-    event->fields.push_back(MakeField("cpu_id", 2, kProtoUint32));
-  }
-
-  {
-    events.emplace_back(Event{});
-    Event* event = &events.back();
-    event->name = "cpu_frequency_limits";
-    event->group = "power";
-    event->proto_field_id = 12;
-    event->fields.push_back(MakeField("min_freq", 1, kProtoUint32));
-    event->fields.push_back(MakeField("max_freq", 2, kProtoUint32));
-    event->fields.push_back(MakeField("cpu_id", 3, kProtoUint32));
-  }
-
-  {
-    events.emplace_back(Event{});
-    Event* event = &events.back();
-    event->name = "cpu_idle";
-    event->group = "power";
-    event->proto_field_id = 13;
-    event->fields.push_back(MakeField("state", 1, kProtoUint32));
-    event->fields.push_back(MakeField("cpu_id", 2, kProtoUint32));
-  }
-
-  {
-    events.emplace_back(Event{});
-    Event* event = &events.back();
-    event->name = "suspend_resume";
-    event->group = "power";
-    event->proto_field_id = 113;
-    event->fields.push_back(MakeField("action", 1, kProtoString));
-    event->fields.push_back(MakeField("val", 2, kProtoInt32));
-    event->fields.push_back(MakeField("start", 3, kProtoUint32));
-  }
-
-  {
-    events.emplace_back(Event{});
-    Event* event = &events.back();
-    event->name = "regulator_disable";
-    event->group = "regulator";
-    event->proto_field_id = 60;
-    event->fields.push_back(MakeField("name", 1, kProtoString));
-  }
-
-  {
-    events.emplace_back(Event{});
-    Event* event = &events.back();
-    event->name = "regulator_disable_complete";
-    event->group = "regulator";
-    event->proto_field_id = 61;
-    event->fields.push_back(MakeField("name", 1, kProtoString));
-  }
-
-  {
-    events.emplace_back(Event{});
-    Event* event = &events.back();
-    event->name = "regulator_enable";
-    event->group = "regulator";
-    event->proto_field_id = 62;
-    event->fields.push_back(MakeField("name", 1, kProtoString));
-  }
-
-  {
-    events.emplace_back(Event{});
-    Event* event = &events.back();
-    event->name = "regulator_enable_complete";
-    event->group = "regulator";
-    event->proto_field_id = 63;
-    event->fields.push_back(MakeField("name", 1, kProtoString));
-  }
-
-  {
-    events.emplace_back(Event{});
-    Event* event = &events.back();
-    event->name = "regulator_enable_delay";
-    event->group = "regulator";
-    event->proto_field_id = 64;
-    event->fields.push_back(MakeField("name", 1, kProtoString));
-  }
-
-  {
-    events.emplace_back(Event{});
-    Event* event = &events.back();
-    event->name = "regulator_set_voltage";
-    event->group = "regulator";
-    event->proto_field_id = 65;
-    event->fields.push_back(MakeField("name", 1, kProtoString));
-    event->fields.push_back(MakeField("min", 2, kProtoInt32));
-    event->fields.push_back(MakeField("max", 3, kProtoInt32));
-  }
-
-  {
-    events.emplace_back(Event{});
-    Event* event = &events.back();
-    event->name = "regulator_set_voltage_complete";
-    event->group = "regulator";
-    event->proto_field_id = 66;
-    event->fields.push_back(MakeField("name", 1, kProtoString));
-    event->fields.push_back(MakeField("val", 2, kProtoUint32));
-  }
-
-  {
-    events.emplace_back(Event{});
-    Event* event = &events.back();
-    event->name = "sched_blocked_reason";
-    event->group = "sched";
-    event->proto_field_id = 18;
-    event->fields.push_back(MakeField("pid", 1, kProtoInt32));
-    event->fields.push_back(MakeField("caller", 2, kProtoUint64));
-    event->fields.push_back(MakeField("io_wait", 3, kProtoUint32));
-  }
-
-  {
-    events.emplace_back(Event{});
-    Event* event = &events.back();
-    event->name = "sched_cpu_hotplug";
-    event->group = "sched";
-    event->proto_field_id = 19;
-    event->fields.push_back(MakeField("affected_cpu", 1, kProtoInt32));
-    event->fields.push_back(MakeField("error", 2, kProtoInt32));
-    event->fields.push_back(MakeField("status", 3, kProtoInt32));
+    event->fields.push_back(MakeField("oldcomm", 2, kProtoString));
+    event->fields.push_back(MakeField("newcomm", 3, kProtoString));
+    event->fields.push_back(MakeField("oom_score_adj", 4, kProtoInt32));
   }
 
   {
@@ -2633,195 +2833,6 @@
   {
     events.emplace_back(Event{});
     Event* event = &events.back();
-    event->name = "sched_switch";
-    event->group = "sched";
-    event->proto_field_id = 4;
-    event->fields.push_back(MakeField("prev_comm", 1, kProtoString));
-    event->fields.push_back(MakeField("prev_pid", 2, kProtoInt32));
-    event->fields.push_back(MakeField("prev_prio", 3, kProtoInt32));
-    event->fields.push_back(MakeField("prev_state", 4, kProtoInt64));
-    event->fields.push_back(MakeField("next_comm", 5, kProtoString));
-    event->fields.push_back(MakeField("next_pid", 6, kProtoInt32));
-    event->fields.push_back(MakeField("next_prio", 7, kProtoInt32));
-  }
-
-  {
-    events.emplace_back(Event{});
-    Event* event = &events.back();
-    event->name = "sched_wakeup";
-    event->group = "sched";
-    event->proto_field_id = 17;
-    event->fields.push_back(MakeField("comm", 1, kProtoString));
-    event->fields.push_back(MakeField("pid", 2, kProtoInt32));
-    event->fields.push_back(MakeField("prio", 3, kProtoInt32));
-    event->fields.push_back(MakeField("success", 4, kProtoInt32));
-    event->fields.push_back(MakeField("target_cpu", 5, kProtoInt32));
-  }
-
-  {
-    events.emplace_back(Event{});
-    Event* event = &events.back();
-    event->name = "sched_wakeup_new";
-    event->group = "sched";
-    event->proto_field_id = 114;
-    event->fields.push_back(MakeField("comm", 1, kProtoString));
-    event->fields.push_back(MakeField("pid", 2, kProtoInt32));
-    event->fields.push_back(MakeField("prio", 3, kProtoInt32));
-    event->fields.push_back(MakeField("success", 4, kProtoInt32));
-    event->fields.push_back(MakeField("target_cpu", 5, kProtoInt32));
-  }
-
-  {
-    events.emplace_back(Event{});
-    Event* event = &events.back();
-    event->name = "sched_waking";
-    event->group = "sched";
-    event->proto_field_id = 20;
-    event->fields.push_back(MakeField("comm", 1, kProtoString));
-    event->fields.push_back(MakeField("pid", 2, kProtoInt32));
-    event->fields.push_back(MakeField("prio", 3, kProtoInt32));
-    event->fields.push_back(MakeField("success", 4, kProtoInt32));
-    event->fields.push_back(MakeField("target_cpu", 5, kProtoInt32));
-  }
-
-  {
-    events.emplace_back(Event{});
-    Event* event = &events.back();
-    event->name = "sync_pt";
-    event->group = "sync";
-    event->proto_field_id = 38;
-    event->fields.push_back(MakeField("timeline", 1, kProtoString));
-    event->fields.push_back(MakeField("value", 2, kProtoString));
-  }
-
-  {
-    events.emplace_back(Event{});
-    Event* event = &events.back();
-    event->name = "sync_timeline";
-    event->group = "sync";
-    event->proto_field_id = 39;
-    event->fields.push_back(MakeField("name", 1, kProtoString));
-    event->fields.push_back(MakeField("value", 2, kProtoString));
-  }
-
-  {
-    events.emplace_back(Event{});
-    Event* event = &events.back();
-    event->name = "sync_wait";
-    event->group = "sync";
-    event->proto_field_id = 40;
-    event->fields.push_back(MakeField("name", 1, kProtoString));
-    event->fields.push_back(MakeField("status", 2, kProtoInt32));
-    event->fields.push_back(MakeField("begin", 3, kProtoUint32));
-  }
-
-  {
-    events.emplace_back(Event{});
-    Event* event = &events.back();
-    event->name = "task_newtask";
-    event->group = "task";
-    event->proto_field_id = 235;
-    event->fields.push_back(MakeField("pid", 1, kProtoInt32));
-    event->fields.push_back(MakeField("comm", 2, kProtoString));
-    event->fields.push_back(MakeField("clone_flags", 3, kProtoUint64));
-    event->fields.push_back(MakeField("oom_score_adj", 4, kProtoInt32));
-  }
-
-  {
-    events.emplace_back(Event{});
-    Event* event = &events.back();
-    event->name = "task_rename";
-    event->group = "task";
-    event->proto_field_id = 236;
-    event->fields.push_back(MakeField("pid", 1, kProtoInt32));
-    event->fields.push_back(MakeField("oldcomm", 2, kProtoString));
-    event->fields.push_back(MakeField("newcomm", 3, kProtoString));
-    event->fields.push_back(MakeField("oom_score_adj", 4, kProtoInt32));
-  }
-
-  {
-    events.emplace_back(Event{});
-    Event* event = &events.back();
-    event->name = "mm_vmscan_direct_reclaim_begin";
-    event->group = "vmscan";
-    event->proto_field_id = 46;
-    event->fields.push_back(MakeField("order", 1, kProtoInt32));
-    event->fields.push_back(MakeField("may_writepage", 2, kProtoInt32));
-    event->fields.push_back(MakeField("gfp_flags", 3, kProtoUint32));
-  }
-
-  {
-    events.emplace_back(Event{});
-    Event* event = &events.back();
-    event->name = "mm_vmscan_direct_reclaim_end";
-    event->group = "vmscan";
-    event->proto_field_id = 47;
-    event->fields.push_back(MakeField("nr_reclaimed", 1, kProtoUint64));
-  }
-
-  {
-    events.emplace_back(Event{});
-    Event* event = &events.back();
-    event->name = "mm_vmscan_kswapd_sleep";
-    event->group = "vmscan";
-    event->proto_field_id = 49;
-    event->fields.push_back(MakeField("nid", 1, kProtoInt32));
-  }
-
-  {
-    events.emplace_back(Event{});
-    Event* event = &events.back();
-    event->name = "mm_vmscan_kswapd_wake";
-    event->group = "vmscan";
-    event->proto_field_id = 48;
-    event->fields.push_back(MakeField("nid", 1, kProtoInt32));
-    event->fields.push_back(MakeField("order", 2, kProtoInt32));
-  }
-
-  {
-    events.emplace_back(Event{});
-    Event* event = &events.back();
-    event->name = "workqueue_activate_work";
-    event->group = "workqueue";
-    event->proto_field_id = 56;
-    event->fields.push_back(MakeField("work", 1, kProtoUint64));
-  }
-
-  {
-    events.emplace_back(Event{});
-    Event* event = &events.back();
-    event->name = "workqueue_execute_end";
-    event->group = "workqueue";
-    event->proto_field_id = 57;
-    event->fields.push_back(MakeField("work", 1, kProtoUint64));
-  }
-
-  {
-    events.emplace_back(Event{});
-    Event* event = &events.back();
-    event->name = "workqueue_execute_start";
-    event->group = "workqueue";
-    event->proto_field_id = 58;
-    event->fields.push_back(MakeField("work", 1, kProtoUint64));
-    event->fields.push_back(MakeField("function", 2, kProtoUint64));
-  }
-
-  {
-    events.emplace_back(Event{});
-    Event* event = &events.back();
-    event->name = "workqueue_queue_work";
-    event->group = "workqueue";
-    event->proto_field_id = 59;
-    event->fields.push_back(MakeField("work", 1, kProtoUint64));
-    event->fields.push_back(MakeField("function", 2, kProtoUint64));
-    event->fields.push_back(MakeField("workqueue", 3, kProtoUint64));
-    event->fields.push_back(MakeField("req_cpu", 4, kProtoUint32));
-    event->fields.push_back(MakeField("cpu", 5, kProtoUint32));
-  }
-
-  {
-    events.emplace_back(Event{});
-    Event* event = &events.back();
     event->name = "f2fs_do_submit_bio";
     event->group = "f2fs";
     event->proto_field_id = 243;
diff --git a/tools/ftrace_proto_gen/BUILD.gn b/tools/ftrace_proto_gen/BUILD.gn
index 9808ab2..4163b47 100644
--- a/tools/ftrace_proto_gen/BUILD.gn
+++ b/tools/ftrace_proto_gen/BUILD.gn
@@ -18,6 +18,7 @@
     ":ftrace_proto_gen_src",
     "../../gn:default_deps",
     "../../gn:gtest_deps",
+    "../../gn:protobuf_full_deps",
   ]
   sources = [
     "ftrace_proto_gen_unittest.cc",
@@ -25,24 +26,29 @@
 }
 
 source_set("ftrace_proto_gen_src") {
+  testonly = true
   sources = [
     "ftrace_proto_gen.cc",
     "ftrace_proto_gen.h",
   ]
   deps = [
     "../../gn:default_deps",
+    "../../gn:protobuf_full_deps",
     "../../src/base",
     "../../src/ftrace_reader",
   ]
 }
 
 executable("ftrace_proto_gen") {
+  testonly = true
   sources = [
     "main.cc",
   ]
   deps = [
     ":ftrace_proto_gen_src",
     "../../gn:default_deps",
+    "../../gn:protobuf_full_deps",
+    "../../protos/perfetto/trace:lite",
     "../../src/base",
     "../../src/ftrace_reader",
   ]
diff --git a/tools/ftrace_proto_gen/ftrace_proto_gen.cc b/tools/ftrace_proto_gen/ftrace_proto_gen.cc
index c31a165..82a71d4 100644
--- a/tools/ftrace_proto_gen/ftrace_proto_gen.cc
+++ b/tools/ftrace_proto_gen/ftrace_proto_gen.cc
@@ -27,12 +27,38 @@
 
 namespace {
 
-std::string GetLastPathElement(std::string data) {
-  base::StringSplitter sp(std::move(data), '/');
-  std::string last;
-  while (sp.Next())
-    last = sp.cur_token();
-  return last;
+bool StartsWith(const std::string& str, const std::string& prefix) {
+  return str.compare(0, prefix.length(), prefix) == 0;
+}
+
+bool Contains(const std::string& haystack, const std::string& needle) {
+  return haystack.find(needle) != std::string::npos;
+}
+
+}  // namespace
+
+FtraceEventName::FtraceEventName(const std::string& full_name) {
+  if (full_name == "removed") {
+    valid_ = false;
+    return;
+  }
+  name_ = full_name.substr(full_name.find('/') + 1, std::string::npos);
+  group_ = full_name.substr(0, full_name.find('/'));
+  valid_ = true;
+}
+
+bool FtraceEventName::valid() const {
+  return valid_;
+}
+
+const std::string& FtraceEventName::name() const {
+  PERFETTO_CHECK(valid_);
+  return name_;
+}
+
+const std::string& FtraceEventName::group() const {
+  PERFETTO_CHECK(valid_);
+  return group_;
 }
 
 std::string ToCamelCase(const std::string& s) {
@@ -54,16 +80,6 @@
   return result;
 }
 
-bool StartsWith(const std::string& str, const std::string& prefix) {
-  return str.compare(0, prefix.length(), prefix) == 0;
-}
-
-bool Contains(const std::string& haystack, const std::string& needle) {
-  return haystack.find(needle) != std::string::npos;
-}
-
-}  // namespace
-
 ProtoType ProtoType::GetSigned() const {
   PERFETTO_CHECK(type == NUMERIC);
   if (is_signed)
@@ -110,6 +126,27 @@
   return {NUMERIC, size, is_signed};
 }
 
+// static
+ProtoType ProtoType::FromDescriptor(
+    google::protobuf::FieldDescriptor::Type type) {
+  if (type == google::protobuf::FieldDescriptor::Type::TYPE_UINT64)
+    return Numeric(64, false);
+
+  if (type == google::protobuf::FieldDescriptor::Type::TYPE_INT64)
+    return Numeric(64, true);
+
+  if (type == google::protobuf::FieldDescriptor::Type::TYPE_UINT32)
+    return Numeric(32, false);
+
+  if (type == google::protobuf::FieldDescriptor::Type::TYPE_INT32)
+    return Numeric(32, true);
+
+  if (type == google::protobuf::FieldDescriptor::Type::TYPE_STRING)
+    return String();
+
+  return Invalid();
+}
+
 ProtoType GetCommon(ProtoType one, ProtoType other) {
   // Always need to prefer the LHS as it is the one already present
   // in the proto.
@@ -124,18 +161,18 @@
   return ProtoType::Numeric(std::max(one.size, other.size), one.is_signed);
 }
 
-std::vector<std::string> GetFileLines(const std::string& filename) {
+std::vector<FtraceEventName> ReadWhitelist(const std::string& filename) {
   std::string line;
-  std::vector<std::string> lines;
+  std::vector<FtraceEventName> lines;
 
   std::ifstream fin(filename, std::ios::in);
   if (!fin) {
-    fprintf(stderr, "Failed to open whitelist %s\n", filename.c_str());
+    fprintf(stderr, "failed to open whitelist %s\n", filename.c_str());
     return lines;
   }
   while (std::getline(fin, line)) {
     if (!StartsWith(line, "#"))
-      lines.emplace_back(line);
+      lines.emplace_back(FtraceEventName(line));
   }
   return lines;
 }
@@ -224,6 +261,7 @@
 
 bool GenerateProto(const FtraceEvent& format, Proto* proto_out) {
   proto_out->name = ToCamelCase(format.name) + "FtraceEvent";
+  proto_out->event_name = format.name;
   std::set<std::string> seen;
   // TODO(hjd): We should be cleverer about id assignment.
   uint32_t i = 1;
@@ -245,7 +283,8 @@
   return true;
 }
 
-void GenerateFtraceEventProto(const std::vector<std::string>& raw_whitelist) {
+void GenerateFtraceEventProto(
+    const std::vector<FtraceEventName>& raw_whitelist) {
   std::string output_path = "protos/perfetto/trace/ftrace/ftrace_event.proto";
   std::ofstream fout(output_path.c_str(), std::ios::out);
   fout << "// Autogenerated by:\n";
@@ -254,12 +293,11 @@
   fout << R"(syntax = "proto2";)"
        << "\n";
   fout << "option optimize_for = LITE_RUNTIME;\n\n";
-  for (const std::string& event : raw_whitelist) {
-    std::string last_elem = GetLastPathElement(event);
-    if (event == "removed")
+  for (const FtraceEventName& event : raw_whitelist) {
+    if (!event.valid())
       continue;
 
-    fout << R"(import "perfetto/trace/ftrace/)" << last_elem << R"(.proto";)"
+    fout << R"(import "perfetto/trace/ftrace/)" << event.name() << R"(.proto";)"
          << "\n";
   }
 
@@ -278,48 +316,34 @@
 )";
 
   int i = 3;
-  for (const std::string& event : raw_whitelist) {
-    std::string last_elem = GetLastPathElement(event);
-    if (event == "removed") {
+  for (const FtraceEventName& event : raw_whitelist) {
+    if (!event.valid()) {
       fout << "    // removed field with id " << i << ";\n";
       ++i;
       continue;
     }
 
-    fout << "    " << ToCamelCase(last_elem) << "FtraceEvent " << last_elem
-         << " = " << i << ";\n";
+    fout << "    " << ToCamelCase(event.name()) << "FtraceEvent "
+         << event.name() << " = " << i << ";\n";
     ++i;
   }
   fout << "  }\n";
   fout << "}\n";
 }
 
-std::set<std::string> GetWhitelistedEvents(
-    const std::vector<std::string>& raw_whitelist) {
-  std::set<std::string> whitelist;
-  for (const std::string& line : raw_whitelist) {
-    if (!StartsWith(line, "#") && line != "removed") {
-      whitelist.insert(line);
-    }
-  }
-  return whitelist;
-}
-
 // Generates section of event_info.cc for a single event.
-std::string SingleEventInfo(perfetto::FtraceEvent format,
-                            perfetto::Proto proto,
+std::string SingleEventInfo(perfetto::Proto proto,
                             const std::string& group,
-                            const std::string& proto_field_id) {
+                            const uint32_t proto_field_id) {
   std::string s = "";
-  s += "    event->name = \"" + format.name + "\";\n";
+  s += "    event->name = \"" + proto.event_name + "\";\n";
   s += "    event->group = \"" + group + "\";\n";
-  s += "    event->proto_field_id = " + proto_field_id + ";\n";
+  s += "    event->proto_field_id = " + std::to_string(proto_field_id) + ";\n";
 
-  for (const auto& p : proto.fields) {
-    const Proto::Field& field = p.second;
-    s += "    event->fields.push_back(MakeField(\"" + field.name + "\", " +
-         std::to_string(field.number) + ", kProto" +
-         ToCamelCase(field.type.ToString()) + "));\n";
+  for (const auto& field : proto.SortedFields()) {
+    s += "    event->fields.push_back(MakeField(\"" + field->name + "\", " +
+         std::to_string(field->number) + ", kProto" +
+         ToCamelCase(field->type.ToString()) + "));\n";
   }
   return s;
 }
@@ -365,6 +389,29 @@
   fout.close();
 }
 
+Proto::Proto(std::string evt_name, const google::protobuf::Descriptor& desc)
+    : name(desc.name()), event_name(evt_name) {
+  for (int i = 0; i < desc.field_count(); ++i) {
+    const google::protobuf::FieldDescriptor* field = desc.field(i);
+    PERFETTO_CHECK(field);
+    AddField(Field{ProtoType::FromDescriptor(field->type()), field->name(),
+                   uint32_t(field->number())});
+  }
+}
+
+std::vector<const Proto::Field*> Proto::SortedFields() {
+  std::vector<const Proto::Field*> sorted_fields;
+
+  for (const auto& p : fields) {
+    sorted_fields.emplace_back(&p.second);
+  }
+  std::sort(sorted_fields.begin(), sorted_fields.end(),
+            [](const Proto::Field* a, const Proto::Field* b) {
+              return a->number < b->number;
+            });
+  return sorted_fields;
+}
+
 std::string Proto::ToString() {
   std::string s = "// Autogenerated by:\n";
   s += std::string("// ") + __FILE__ + "\n";
@@ -378,10 +425,9 @@
 )";
 
   s += "message " + name + " {\n";
-  for (const auto& p : fields) {
-    const Proto::Field& field = p.second;
-    s += "  optional " + field.type.ToString() + " " + field.name + " = " +
-         std::to_string(field.number) + ";\n";
+  for (const auto field : SortedFields()) {
+    s += "  optional " + field->type.ToString() + " " + field->name + " = " +
+         std::to_string(field->number) + ";\n";
   }
   s += "}\n";
   return s;
diff --git a/tools/ftrace_proto_gen/ftrace_proto_gen.h b/tools/ftrace_proto_gen/ftrace_proto_gen.h
index 8ca5bfa..deeed67 100644
--- a/tools/ftrace_proto_gen/ftrace_proto_gen.h
+++ b/tools/ftrace_proto_gen/ftrace_proto_gen.h
@@ -17,6 +17,7 @@
 #ifndef TOOLS_FTRACE_PROTO_GEN_FTRACE_PROTO_GEN_H_
 #define TOOLS_FTRACE_PROTO_GEN_FTRACE_PROTO_GEN_H_
 
+#include <google/protobuf/descriptor.h>
 #include <map>
 #include <set>
 #include <string>
@@ -26,6 +27,20 @@
 
 namespace perfetto {
 
+class FtraceEventName {
+ public:
+  explicit FtraceEventName(const std::string& full_name);
+
+  bool valid() const;
+  const std::string& name() const;
+  const std::string& group() const;
+
+ private:
+  bool valid_;
+  std::string name_;
+  std::string group_;
+};
+
 struct ProtoType {
   enum Type { INVALID, NUMERIC, STRING };
   Type type;
@@ -38,24 +53,29 @@
   static ProtoType Invalid();
   static ProtoType String();
   static ProtoType Numeric(uint16_t size, bool is_signed);
+  static ProtoType FromDescriptor(google::protobuf::FieldDescriptor::Type type);
 };
 
 struct Proto {
+  Proto() = default;
+  Proto(std::string evt_name, const google::protobuf::Descriptor& desc);
   struct Field {
     ProtoType type;
     std::string name;
     uint32_t number;
   };
   std::string name;
+  std::string event_name;
   std::map<std::string, Field> fields;
 
   std::string ToString();
   void MergeFrom(const Proto& other);
   void AddField(Proto::Field field);
-
+  std::vector<const Field*> SortedFields();
   uint32_t max_id = 0;
 };
 
+std::string ToCamelCase(const std::string& s);
 ProtoType GetCommon(ProtoType one, ProtoType other);
 void PrintFtraceEventProtoAdditions(const std::set<std::string>& events);
 void PrintEventFormatterMain(const std::set<std::string>& events);
@@ -67,14 +87,12 @@
 bool GenerateProto(const FtraceEvent& format, Proto* proto_out);
 ProtoType InferProtoType(const FtraceEvent::Field& field);
 
-std::vector<std::string> GetFileLines(const std::string& filename);
-std::set<std::string> GetWhitelistedEvents(
-    const std::vector<std::string>& raw_whitelist);
-void GenerateFtraceEventProto(const std::vector<std::string>& raw_whitelist);
-std::string SingleEventInfo(perfetto::FtraceEvent format,
-                            perfetto::Proto proto,
+std::vector<FtraceEventName> ReadWhitelist(const std::string& filename);
+void GenerateFtraceEventProto(
+    const std::vector<FtraceEventName>& raw_whitelist);
+std::string SingleEventInfo(perfetto::Proto proto,
                             const std::string& group,
-                            const std::string& proto_field_id);
+                            const uint32_t proto_field_id);
 void GenerateEventInfo(const std::vector<std::string>& events_info);
 
 }  // namespace perfetto
diff --git a/tools/ftrace_proto_gen/main.cc b/tools/ftrace_proto_gen/main.cc
index 2a806a5..a0b3a97 100644
--- a/tools/ftrace_proto_gen/main.cc
+++ b/tools/ftrace_proto_gen/main.cc
@@ -14,6 +14,7 @@
  * limitations under the License.
  */
 
+#include <getopt.h>
 #include <sys/stat.h>
 #include <fstream>
 #include <memory>
@@ -22,26 +23,80 @@
 #include <sstream>
 #include <string>
 
+#include <google/protobuf/descriptor.h>
+#include <google/protobuf/descriptor.pb.h>
 #include "perfetto/base/file_utils.h"
 #include "perfetto/ftrace_reader/format_parser.h"
 #include "perfetto/trace/ftrace/ftrace_event.pbzero.h"
 #include "tools/ftrace_proto_gen/ftrace_proto_gen.h"
 
-int main(int argc, const char** argv) {
-  if (argc != 4) {
-    fprintf(stderr, "Usage: ./%s whitelist_dir input_dir output_dir\n",
+int main(int argc, char** argv) {
+  static struct option long_options[] = {
+      {"whitelist_path", required_argument, nullptr, 'w'},
+      {"output_dir", required_argument, nullptr, 'o'},
+      {"proto_descriptor", required_argument, nullptr, 'd'},
+      {"update_build_files", no_argument, nullptr, 'b'},
+  };
+
+  int option_index;
+  int c;
+
+  std::string whitelist_path;
+  std::string output_dir;
+  std::string proto_descriptor;
+  bool update_build_files = false;
+
+  while ((c = getopt_long(argc, argv, "", long_options, &option_index)) != -1) {
+    switch (c) {
+      case 'w':
+        whitelist_path = optarg;
+        break;
+      case 'o':
+        output_dir = optarg;
+        break;
+      case 'd':
+        proto_descriptor = optarg;
+        break;
+      case 'b':
+        update_build_files = true;
+        break;
+    }
+  }
+
+  PERFETTO_CHECK(!whitelist_path.empty());
+  PERFETTO_CHECK(!output_dir.empty());
+  PERFETTO_CHECK(!proto_descriptor.empty());
+
+  if (optind >= argc) {
+    fprintf(stderr,
+            "Usage: ./%s -w whitelist_dir -o output_dir -d proto_descriptor "
+            "input_dir...\n",
             argv[0]);
     return 1;
   }
 
-  const char* whitelist_path = argv[1];
-  const char* input_dir = argv[2];
-  const char* output_dir = argv[3];
-
-  std::vector<std::string> whitelist = perfetto::GetFileLines(whitelist_path);
-  std::set<std::string> events = perfetto::GetWhitelistedEvents(whitelist);
+  std::vector<perfetto::FtraceEventName> whitelist =
+      perfetto::ReadWhitelist(whitelist_path);
   std::vector<std::string> events_info;
 
+  google::protobuf::DescriptorPool descriptor_pool;
+  descriptor_pool.AllowUnknownDependencies();
+  {
+    google::protobuf::FileDescriptorSet file_descriptor_set;
+    std::string descriptor_bytes;
+    if (!perfetto::base::ReadFile(proto_descriptor, &descriptor_bytes)) {
+      fprintf(stderr, "Failed to open %s\n", proto_descriptor.c_str());
+      return 1;
+    }
+    file_descriptor_set.ParseFromString(descriptor_bytes);
+
+    for (const auto& d : file_descriptor_set.file()) {
+      PERFETTO_CHECK(descriptor_pool.BuildFile(d));
+    }
+  }
+
+  perfetto::GenerateFtraceEventProto(whitelist);
+
   std::string ftrace;
   if (!perfetto::base::ReadFile(
           "protos/perfetto/trace/ftrace/ftrace_event.proto", &ftrace)) {
@@ -51,18 +106,18 @@
   }
 
   std::set<std::string> new_events;
-  for (const auto& event : events) {
-    std::string file_name =
-        event.substr(event.find('/') + 1, std::string::npos);
+  for (const auto& event : whitelist) {
+    if (!event.valid())
+      continue;
     struct stat buf;
-    if (stat(("protos/perfetto/trace/ftrace/" + file_name + ".proto").c_str(),
-             &buf) == -1) {
-      new_events.insert(file_name);
+    if (stat(
+            ("protos/perfetto/trace/ftrace/" + event.name() + ".proto").c_str(),
+            &buf) == -1) {
+      new_events.insert(event.name());
     }
   }
 
   if (!new_events.empty()) {
-    perfetto::GenerateFtraceEventProto(whitelist);
     perfetto::PrintEventFormatterMain(new_events);
     perfetto::PrintEventFormatterUsingStatements(new_events);
     perfetto::PrintEventFormatterFunctions(new_events);
@@ -71,49 +126,58 @@
         "tools/ftrace_proto_gen/ftrace_inode_handler.cc\n");
   }
 
-  for (auto event : events) {
-    std::string proto_file_name =
-        event.substr(event.find('/') + 1, std::string::npos) + ".proto";
-    std::string group = event.substr(0, event.find('/'));
-    std::string input_path = input_dir + event + std::string("/format");
+  // The first id used for events in FtraceEvent proto is 3.
+  // Because we increment before the loop, this is 2.
+  uint32_t proto_field_id = 2;
+  for (auto event : whitelist) {
+    ++proto_field_id;
+    if (!event.valid())
+      continue;
+    std::string proto_file_name = event.name() + ".proto";
     std::string output_path = output_dir + std::string("/") + proto_file_name;
 
-    std::string contents;
-    if (!perfetto::base::ReadFile(input_path, &contents)) {
-      fprintf(stderr, "Failed to open %s\n", input_path.c_str());
-      return 1;
-    }
-
-    perfetto::FtraceEvent format;
-    if (!perfetto::ParseFtraceEvent(contents, &format)) {
-      fprintf(stderr, "Could not parse file %s.\n", input_path.c_str());
-      return 1;
-    }
-
+    std::string proto_name =
+        perfetto::ToCamelCase(event.name()) + "FtraceEvent";
     perfetto::Proto proto;
-    if (!perfetto::GenerateProto(format, &proto)) {
-      fprintf(stderr, "Could not generate proto for file %s\n",
-              input_path.c_str());
-      return 1;
-    }
+    proto.name = proto_name;
+    proto.event_name = event.name();
+    const google::protobuf::Descriptor* d =
+        descriptor_pool.FindMessageTypeByName("perfetto.protos." + proto_name);
+    if (d)
+      proto = perfetto::Proto(event.name(), *d);
+    else
+      PERFETTO_LOG("Did not find %s", proto_name.c_str());
+    for (int i = optind; i < argc; ++i) {
+      std::string input_dir = argv[i];
+      std::string input_path = input_dir + event.group() + "/" + event.name() +
+                               std::string("/format");
 
-    std::smatch match;
-    std::regex event_regex(format.name + "\\s*=\\s*(\\d+)");
-    std::regex_search(ftrace, match, event_regex);
-    std::string proto_field_id = match[1].str().c_str();
-    if (proto_field_id == "") {
-      fprintf(stderr,
-              "Could not find proto_field_id for %s in ftrace_event.proto. "
-              "Please add it.\n",
-              format.name.c_str());
-      return 1;
+      std::string contents;
+      if (!perfetto::base::ReadFile(input_path, &contents)) {
+        fprintf(stderr, "Failed to open %s\n", input_path.c_str());
+        continue;
+      }
+
+      perfetto::FtraceEvent format;
+      if (!perfetto::ParseFtraceEvent(contents, &format)) {
+        fprintf(stderr, "Could not parse file %s.\n", input_path.c_str());
+        return 1;
+      }
+
+      perfetto::Proto event_proto;
+      if (!perfetto::GenerateProto(format, &event_proto)) {
+        fprintf(stderr, "Could not generate proto for file %s\n",
+                input_path.c_str());
+        return 1;
+      }
+      proto.MergeFrom(event_proto);
     }
 
     if (!new_events.empty())
-      PrintInodeHandlerMain(format.name, proto);
+      PrintInodeHandlerMain(proto.name, proto);
 
     events_info.push_back(
-        perfetto::SingleEventInfo(format, proto, group, proto_field_id));
+        perfetto::SingleEventInfo(proto, event.group(), proto_field_id));
 
     std::ofstream fout(output_path.c_str(), std::ios::out);
     if (!fout) {
@@ -126,4 +190,38 @@
   }
 
   perfetto::GenerateEventInfo(events_info);
+
+  if (update_build_files) {
+    std::ofstream f(output_dir + "/all_protos.gni");
+
+    f << R"(# Copyright (C) 2018 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.
+
+# Autogenerated by ftrace_proto_gen.
+
+ftrace_proto_names = [
+  "ftrace_event.proto",
+  "ftrace_event_bundle.proto",
+  "test_bundle_wrapper.proto",
+)";
+    for (const perfetto::FtraceEventName& event : whitelist) {
+      if (!event.valid())
+        continue;
+      f << "  \"" << event.name() << ".proto\",\n";
+    }
+    f << "]\n";
+    f.close();
+    PERFETTO_CHECK(!f.fail());
+  }
 }
diff --git a/tools/update_protos.py b/tools/update_protos.py
deleted file mode 100755
index 8444662..0000000
--- a/tools/update_protos.py
+++ /dev/null
@@ -1,109 +0,0 @@
-#!/usr/bin/env python
-# Copyright (C) 2017 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.
-
-# Generates proto definitions from ftrace format files.
-# Arguments:
-#   path to ftrace_proto_gen
-#   path to input directory full of format files
-#   path to output directory for proto definitions files
-#   Either:
-#    --whitelist PATH : path to a list of events to generate
-#    --event EVENT : a single event to generate
-#
-# Example:
-# ./tools/update_protos.py
-#    out/linux/ftrace_proto_gen
-#   libftrace/test/data/android_seed_N2F62_3.10.49
-#   protos/ftrace
-#   --whitelist tools/ftrace_proto_gen/event_whitelist
-
-
-from __future__ import print_function
-import argparse
-import os
-import subprocess
-import sys
-import tempfile
-
-
-HEADER = """# Copyright (C) 2018 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.
-
-"""
-
-
-def command(*args):
-  subprocess.check_call(args, stdout=sys.stdout, stderr=sys.stderr)
-
-def main():
-  parser = argparse.ArgumentParser(description='Generate protos.')
-  parser.add_argument('ftrace_proto_gen',
-                      help='an ftrace_proto_gen binary')
-  parser.add_argument('input_dir',
-                      help='input directory')
-  parser.add_argument('output_dir',
-                      help='output directory')
-  parser.add_argument('--whitelist', dest='whitelist_path',
-                      default=None,
-                      help='path to whitelist of events')
-  parser.add_argument('--event', dest='event',
-                      default=None,
-                      help='output directory')
-  parser.add_argument('--update-build-files', dest='update_build_files',
-                      action='store_true',
-                      help='should update metadata')
-  args = parser.parse_args()
-
-  gen_path = args.ftrace_proto_gen
-  input_dir = args.input_dir
-  output_dir = args.output_dir
-  whitelist_path = args.whitelist_path
-  update_build_files = args.update_build_files
-
-  if whitelist_path is not None and not os.path.isfile(whitelist_path):
-    parser.error('Whitelist file {} does not exist.'.format(whitelist_path))
-  if not os.path.isdir(input_dir):
-    parser.error('Input directory {} does not exist.'.format(input_dir))
-  if not os.path.isdir(output_dir):
-    parser.error('Output directory {} does not exist.'.format(output_dir))
-
-  # Run ftrace_proto_gen
-  command(gen_path, whitelist_path, input_dir, output_dir)
-
-  if update_build_files:
-    names = sorted(os.listdir(output_dir))
-    names = [name for name in names if name.endswith('.proto')]
-    names = ''.join(['  "{}",\n'.format(name) for name in names])
-    body = 'ftrace_proto_names = [\n{}]'.format(names)
-    with open(os.path.join(output_dir, 'all_protos.gni'), 'wb') as f:
-      f.write(HEADER)
-      f.write(body)
-
-  return 0
-
-
-if __name__ == '__main__':
-  sys.exit(main())