From fb921a1c4e48ad16af868ffa3a0fd0b02c4faa4c Mon Sep 17 00:00:00 2001 From: Hridya Valsaraju Date: Sat, 12 Sep 2020 15:37:57 -0700 Subject: [PATCH] Let init mount/unmount debugfs for non-user builds This change will help non-user builds with keeping debugfs disabled during run time. Instead, debugfs will be mounted by init to enable boot time initializations to set up vendor debug data collection and unmounted after boot. It will be also be mounted by dumpstate for bug report generation and unmounted after. This change is only intended to help vendors (who depend on debugfs to collect debug information from userdebug/eng builds) keep debugfs disabled during runtime. Platform code must not depend on debugfs at all. Test: manual Bug: 176936478 Change-Id: I2e89d5b9540e3de094976563682d4b8c5c125876 --- init/init.cpp | 15 +++++++++++++++ rootdir/init.rc | 7 +++++++ 2 files changed, 22 insertions(+) diff --git a/init/init.cpp b/init/init.cpp index d1998a5c7..ed76c922a 100644 --- a/init/init.cpp +++ b/init/init.cpp @@ -872,6 +872,21 @@ int SecondStageMain(int argc, char** argv) { auto is_installed = android::gsi::IsGsiInstalled() ? "1" : "0"; SetProperty(gsi::kGsiInstalledProp, is_installed); + /* + * For debug builds of S launching devices, init mounts debugfs for + * enabling vendor debug data collection setup at boot time. Init will unmount it on + * boot-complete after vendor code has performed the required initializations + * during boot. Dumpstate will then mount debugfs in order to read data + * from the same using the dumpstate HAL during bugreport creation. + * Dumpstate will also unmount debugfs after bugreport creation. + * first_api_level comparison is done here instead + * of init.rc since init.rc parser does not support >/< operators. + */ + auto api_level = android::base::GetIntProperty("ro.product.first_api_level", 0); + bool is_debuggable = android::base::GetBoolProperty("ro.debuggable", false); + auto mount_debugfs = (is_debuggable && (api_level >= 31)) ? "1" : "0"; + SetProperty("init.mount_debugfs", mount_debugfs); + am.QueueBuiltinAction(SetupCgroupsAction, "SetupCgroups"); am.QueueBuiltinAction(SetKptrRestrictAction, "SetKptrRestrict"); am.QueueBuiltinAction(TestPerfEventSelinuxAction, "TestPerfEventSelinux"); diff --git a/rootdir/init.rc b/rootdir/init.rc index b305eb21b..71c7ba24e 100644 --- a/rootdir/init.rc +++ b/rootdir/init.rc @@ -933,6 +933,9 @@ on boot && property:ro.config.low_ram=true write /proc/sys/vm/dirty_expire_centisecs 200 write /proc/sys/vm/dirty_background_ratio 5 +on property:sys.boot_completed=1 && property:init.mount_debugfs=1 + umount /sys/kernel/debug + on boot # basic network init ifup lo @@ -1201,6 +1204,10 @@ on userspace-reboot-resume on property:sys.boot_completed=1 && property:sys.init.userspace_reboot.in_progress=1 setprop sys.init.userspace_reboot.in_progress "" +on early-init && property:init.mount_debugfs=1 + mount debugfs debugfs /sys/kernel/debug + chmod 0755 /sys/kernel/debug + # Migrate tasks again in case kernel threads are created during boot on property:sys.boot_completed=1 copy_per_line /dev/cpuctl/tasks /dev/cpuctl/system/tasks