[PATCH 2/2] async_populate_rootfs: move rootfs init earlier

Bryan Wu bryan.wu at canonical.com
Fri Feb 5 01:41:06 UTC 2010


From: Andy Whitcroft <apw at canonical.com>

Check to see if the machine has more than one active CPU, if it does
then it is worth starting the decode of the rootfs earlier.

Signed-off-by: Andy Whitcroft <apw at canonical.com>

[cherry-pick from a7baa7164fdf25b2819798ee2238a3cc7b4ada75 for backporting]
Signed-off-by: Bryan Wu <bryan.wu at canonical.com>
---
 include/asm-generic/vmlinux.lds.h |    1 +
 include/linux/init.h              |    1 +
 init/initramfs.c                  |   15 ++++++++++++++-
 3 files changed, 16 insertions(+), 1 deletions(-)

diff --git a/include/asm-generic/vmlinux.lds.h b/include/asm-generic/vmlinux.lds.h
index 6ad76bf..45e2d65 100644
--- a/include/asm-generic/vmlinux.lds.h
+++ b/include/asm-generic/vmlinux.lds.h
@@ -587,6 +587,7 @@
   	*(.initcall0s.init)						\
   	*(.initcall1.init)						\
   	*(.initcall1s.init)						\
+	*(.initcallearlyrootfs.init)					\
   	*(.initcall2.init)						\
   	*(.initcall2s.init)						\
   	*(.initcall3.init)						\
diff --git a/include/linux/init.h b/include/linux/init.h
index 5a33056..33d7ac8 100644
--- a/include/linux/init.h
+++ b/include/linux/init.h
@@ -186,6 +186,7 @@ extern void (*late_time_init)(void);
 
 #define core_initcall(fn)		__define_initcall("1",fn,1)
 #define core_initcall_sync(fn)		__define_initcall("1s",fn,1s)
+#define earlyrootfs_initcall(fn)	__define_initcall("earlyrootfs",fn,rootfs)
 #define postcore_initcall(fn)		__define_initcall("2",fn,2)
 #define postcore_initcall_sync(fn)	__define_initcall("2s",fn,2s)
 #define arch_initcall(fn)		__define_initcall("3",fn,3)
diff --git a/init/initramfs.c b/init/initramfs.c
index b8f9e3c..d9e6e81 100644
--- a/init/initramfs.c
+++ b/init/initramfs.c
@@ -609,9 +609,22 @@ static void __init async_populate_rootfs(void)
 	return;
 }
 
+static int __initdata rootfs_populated;
+
+static int __init populate_rootfs_early(void)
+{
+	if (num_online_cpus() > 1) {
+		rootfs_populated = 1;
+		async_schedule_domain(async_populate_rootfs, NULL,
+						&populate_rootfs_domain);
+	}
+}
 static int __init populate_rootfs(void)
 {
-	async_schedule_domain(async_populate_rootfs, NULL, &populate_rootfs_domain);
+	if (!rootfs_populated)
+		async_schedule_domain(async_populate_rootfs, NULL,
+						&populate_rootfs_domain);
 }
 
+earlyrootfs_initcall(populate_rootfs_early);
 rootfs_initcall(populate_rootfs);
-- 
1.6.3.3





More information about the kernel-team mailing list