diff --git a/init/bootchart.cpp b/init/bootchart.cpp index b7db9b6d6..f46fb0993 100644 --- a/init/bootchart.cpp +++ b/init/bootchart.cpp @@ -140,6 +140,20 @@ static void log_processes(FILE* log) { static void bootchart_thread_main() { LOG(INFO) << "Bootcharting started"; + // Unshare the mount namespace of this thread so that the init process itself can switch + // the mount namespace later while this thread is still running. + // Otherwise, setns() call invoked as part of `enter_default_mount_ns` fails with EINVAL. + // + // Note that after unshare()'ing the mount namespace from the main thread, this thread won't + // receive mount/unmount events from the other mount namespace unless the events are happening + // from under a sharable mount. + // + // The bootchart thread is safe to unshare the mount namespace because it only reads from /proc + // and write to /data which are not private mounts. + if (unshare(CLONE_NEWNS) == -1) { + PLOG(ERROR) << "Cannot create mount namespace"; + return; + } // Open log files. auto stat_log = fopen_unique("/data/bootchart/proc_stat.log", "we"); if (!stat_log) return;