[PATCH 2/2] init/do_mounts.c: replace polling for root device with devtmpfs_wait_for_dev

From: tom . leiming
Date: Wed Jun 10 2009 - 10:28:41 EST


From: Ming Lei <tom.leiming@xxxxxxxxx>

This patch removes the polling for root device if rootwait parameter is
passed to kernel and CONFIG_DEVTMPFS is enabled. This way can lead to
a faster boot, especially booting from some asynchronous block device
(such as usb mass storage, mmc card, ...)

The patch has been verified in beagle board(mmc card as root device).

Signed-off-by: Ming Lei <tom.leiming@xxxxxxxxx>
---
init/do_mounts.c | 16 ++++++++++++++++
1 files changed, 16 insertions(+), 0 deletions(-)

diff --git a/init/do_mounts.c b/init/do_mounts.c
index aa56007..fcf3844 100644
--- a/init/do_mounts.c
+++ b/init/do_mounts.c
@@ -364,6 +364,7 @@ void __init mount_root(void)
void __init prepare_namespace(void)
{
int is_floppy;
+ int ret;

if (root_delay) {
printk(KERN_INFO "Waiting %dsec before mounting root device...\n",
@@ -371,6 +372,7 @@ void __init prepare_namespace(void)
ssleep(root_delay);
}

+#ifndef CONFIG_DEVTMPFS
/*
* wait for the known devices to complete their probing
*
@@ -379,6 +381,7 @@ void __init prepare_namespace(void)
* for the touchpad of a laptop to initialize.
*/
wait_for_device_probe();
+#endif

md_run_setup();

@@ -397,6 +400,7 @@ void __init prepare_namespace(void)
if (initrd_load())
goto out;

+#ifndef CONFIG_DEVTMPFS
/* wait for any asynchronous scanning to complete */
if ((ROOT_DEV == 0) && root_wait) {
printk(KERN_INFO "Waiting for root device %s...\n",
@@ -406,6 +410,18 @@ void __init prepare_namespace(void)
msleep(100);
async_synchronize_full();
}
+#else
+ /*wait for root device, and expire if 120 seconds elapse*/
+ if (!strncmp(saved_root_name, "/dev/", 5)) {
+ ret = devtmpfs_wait_for_dev(saved_root_name, 120);
+ printk(KERN_INFO "wait for %s based on devtmpfs:%d\n",
+ saved_root_name, ret);
+ }
+
+ ROOT_DEV = name_to_dev_t(saved_root_name);
+ if (!ROOT_DEV)
+ printk(KERN_ERR "Root device %s not found!\n", saved_root_name);
+#endif

is_floppy = MAJOR(ROOT_DEV) == FLOPPY_MAJOR;

--
1.6.0.GIT

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/