From patchwork Tue Dec 8 09:44:34 2009 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Surbhi Palande X-Patchwork-Id: 40605 X-Patchwork-Delegate: apw@canonical.com Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from chlorine.canonical.com (chlorine.canonical.com [91.189.94.204]) by ozlabs.org (Postfix) with ESMTP id 66A80B7BC2 for ; Tue, 8 Dec 2009 20:45:06 +1100 (EST) Received: from localhost ([127.0.0.1] helo=chlorine.canonical.com) by chlorine.canonical.com with esmtp (Exim 4.60) (envelope-from ) id 1NHwcv-0006fY-LS; Tue, 08 Dec 2009 09:45:01 +0000 Received: from adelie.canonical.com ([91.189.90.139]) by chlorine.canonical.com with esmtp (Exim 4.60) (envelope-from ) id 1NHwcZ-0006WB-0v for kernel-team@lists.ubuntu.com; Tue, 08 Dec 2009 09:44:39 +0000 Received: from hutte.canonical.com ([91.189.90.181]) by adelie.canonical.com with esmtp (Exim 4.69 #1 (Debian)) id 1NHwcY-0006eO-Tk for ; Tue, 08 Dec 2009 09:44:38 +0000 Received: from a88-112-252-196.elisa-laajakaista.fi ([88.112.252.196] helo=canonical.com) by hutte.canonical.com with esmtpsa (TLS-1.0:DHE_RSA_AES_128_CBC_SHA1:16) (Exim 4.69) (envelope-from ) id 1NHwcY-0005lb-LX for kernel-team@lists.ubuntu.com; Tue, 08 Dec 2009 09:44:38 +0000 From: Surbhi Palande To: kernel-team@lists.ubuntu.com Subject: [v2] [PATCH 0/2] Populate rootfs asynchronously and early Date: Tue, 8 Dec 2009 11:44:34 +0200 Message-Id: <1260265475-4303-2-git-send-email-surbhi.palande@canonical.com> X-Mailer: git-send-email 1.6.3.3 In-Reply-To: <1260265475-4303-1-git-send-email-surbhi.palande@canonical.com> References: <1260265475-4303-1-git-send-email-surbhi.palande@canonical.com> X-BeenThere: kernel-team@lists.ubuntu.com X-Mailman-Version: 2.1.8 Precedence: list List-Id: Kernel team discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , MIME-Version: 1.0 Sender: kernel-team-bounces@lists.ubuntu.com Errors-To: kernel-team-bounces@lists.ubuntu.com populate_rootfs() is called asynchronously to reduce the boot time. Signed-off-by: Surbhi Palande --- include/linux/init.h | 2 ++ init/initramfs.c | 15 ++++++++++++--- init/main.c | 6 ++++++ 3 files changed, 20 insertions(+), 3 deletions(-) diff --git a/include/linux/init.h b/include/linux/init.h index ff8bde5..b57935f 100644 --- a/include/linux/init.h +++ b/include/linux/init.h @@ -213,6 +213,8 @@ extern void (*late_time_init)(void); static initcall_t __initcall_##fn \ __used __section(.security_initcall.init) = fn +extern struct list_head populate_rootfs_domain; + struct obs_kernel_param { const char *str; int (*setup_func)(char *); diff --git a/init/initramfs.c b/init/initramfs.c index 4c00edc..b8f9e3c 100644 --- a/init/initramfs.c +++ b/init/initramfs.c @@ -8,6 +8,7 @@ #include #include #include +#include static __initdata char *message; static void __init error(char *x) @@ -565,7 +566,9 @@ static void __init clean_rootfs(void) } #endif -static int __init populate_rootfs(void) +LIST_HEAD(populate_rootfs_domain); + +static void __init async_populate_rootfs(void) { char *err = unpack_to_rootfs(__initramfs_start, __initramfs_end - __initramfs_start); @@ -579,7 +582,7 @@ static int __init populate_rootfs(void) initrd_end - initrd_start); if (!err) { free_initrd(); - return 0; + return; } else { clean_rootfs(); unpack_to_rootfs(__initramfs_start, @@ -603,6 +606,12 @@ static int __init populate_rootfs(void) free_initrd(); #endif } - return 0; + return; } + +static int __init populate_rootfs(void) +{ + async_schedule_domain(async_populate_rootfs, NULL, &populate_rootfs_domain); +} + rootfs_initcall(populate_rootfs); diff --git a/init/main.c b/init/main.c index 28bc963..3b74ddf 100644 --- a/init/main.c +++ b/init/main.c @@ -884,6 +884,12 @@ static int __init kernel_init(void * unused) do_basic_setup(); /* + * We need to ensure that the filesystem is ready by this point, wait for + * async_populate_rootfs to complete. + */ + async_synchronize_full_domain(&populate_rootfs_domain); + + /* * check if there is an early userspace init. If yes, let it do all * the work */