FAQ Search Today's Posts Mark Forums Read
» Video Reviews

» Linux Archive

Linux-archive is a website aiming to archive linux email lists and to make them easily accessible for linux users/developers.


» Sponsor

» Partners

» Sponsor

Go Back   Linux Archive > Ubuntu > Ubuntu Kernel Team

 
 
LinkBack Thread Tools
 
Old 12-07-2009, 04:32 PM
Surbhi Palande
 
Default Populate rootfs asynchronously for boot performance

populate_rootfs() is called asynchronously to reduce the boot time.

Signed-off-by: Surbhi Palande <surbhi.palande@canonical.com>
---
init/initramfs.c | 15 ++++++++++++---
init/main.c | 7 +++++++
2 files changed, 19 insertions(+), 3 deletions(-)

diff --git a/init/initramfs.c b/init/initramfs.c
index 4c00edc..aad2c28 100644
--- a/init/initramfs.c
+++ b/init/initramfs.c
@@ -8,6 +8,7 @@
#include <linux/dirent.h>
#include <linux/syscalls.h>
#include <linux/utime.h>
+#include <linux/async.h>

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)
+extern struct list_head rootfs_fn_list;
+
+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, &rootfs_fn_list);
+}
+
rootfs_initcall(populate_rootfs);
diff --git a/init/main.c b/init/main.c
index 4051d75..d40ca6f 100644
--- a/init/main.c
+++ b/init/main.c
@@ -752,6 +752,7 @@ int do_one_initcall(initcall_t fn)


extern initcall_t __initcall_start[], __initcall_end[], __early_initcall_end[];
+LIST_HEAD(rootfs_fn_list);

static void __init do_initcalls(void)
{
@@ -879,6 +880,12 @@ static int __init kernel_init(void * unused)
do_basic_setup();

/*
+ * putting it here to ensure that rootfs is populated by the end of
+ * this call
+ */
+ async_synchronize_full_domain(&rootfs_fn_list);
+
+ /*
* check if there is an early userspace init. If yes, let it do all
* the work
*/
--
1.6.3.3


--
kernel-team mailing list
kernel-team@lists.ubuntu.com
https://lists.ubuntu.com/mailman/listinfo/kernel-team
 
Old 12-07-2009, 05:20 PM
Andy Whitcroft
 
Default Populate rootfs asynchronously for boot performance

On Mon, Dec 07, 2009 at 07:32:06PM +0200, Surbhi Palande wrote:
> populate_rootfs() is called asynchronously to reduce the boot time.
>
> Signed-off-by: Surbhi Palande <surbhi.palande@canonical.com>
> ---
> init/initramfs.c | 15 ++++++++++++---
> init/main.c | 7 +++++++
> 2 files changed, 19 insertions(+), 3 deletions(-)
>
> diff --git a/init/initramfs.c b/init/initramfs.c
> index 4c00edc..aad2c28 100644
> --- a/init/initramfs.c
> +++ b/init/initramfs.c
> @@ -8,6 +8,7 @@
> #include <linux/dirent.h>
> #include <linux/syscalls.h>
> #include <linux/utime.h>
> +#include <linux/async.h>
>
> 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)
> +extern struct list_head rootfs_fn_list;

Externs are frowned upon heavily in .c files, as it is possible to get
an undetected type missmatch leading to unexpected behaviour. You
should move the extern to a header that these two files both include,
there is likely something already. Also I would rather see the
declaration here in this file as its the primary consumer of it.

I also think the name is a bit wierd, as its not a function list? If
anything its an async_t list, but you are not meant to know that, its an
opaque type. populate_rootfs_domain or something seems more sensible to
my eye.

> +
> +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, &rootfs_fn_list);
> +}
> +
> rootfs_initcall(populate_rootfs);
> diff --git a/init/main.c b/init/main.c
> index 4051d75..d40ca6f 100644
> --- a/init/main.c
> +++ b/init/main.c
> @@ -752,6 +752,7 @@ int do_one_initcall(initcall_t fn)
>
>
> extern initcall_t __initcall_start[], __initcall_end[], __early_initcall_end[];
> +LIST_HEAD(rootfs_fn_list);
>
> static void __init do_initcalls(void)
> {
> @@ -879,6 +880,12 @@ static int __init kernel_init(void * unused)
> do_basic_setup();
>
> /*
> + * putting it here to ensure that rootfs is populated by the end of

putting it here?

/*
* We need to ensure the filesystem is ready by this point, wait for
* async_populate_rootfs to complete.
*/

> + * this call
> + */
> + async_synchronize_full_domain(&rootfs_fn_list);
> +
> + /*
> * check if there is an early userspace init. If yes, let it do all
> * the work
> */

-apw

--
kernel-team mailing list
kernel-team@lists.ubuntu.com
https://lists.ubuntu.com/mailman/listinfo/kernel-team
 

Thread Tools




All times are GMT. The time now is 10:00 PM.

VBulletin, Copyright ©2000 - 2014, Jelsoft Enterprises Ltd.
Content Relevant URLs by vBSEO ©2007, Crawlability, Inc.
Copyright 2007 - 2008, www.linux-archive.org