2009-03-15 18:24:58

by Arjan van de Ven

[permalink] [raw]
Subject: [2.6.30] What's in the async boot tree

The following changes since commit 326d8519fc97be186c55ac605c3a7c957c758ae1:
Linus Torvalds (1):
Merge branch 'upstream' of git://ftp.linux-mips.org/pub/scm/upstream-linus

are available in the git repository at:

git://git.kernel.org/pub/scm/linux/kernel/git/arjan/linux-2.6-async-for-30.git master

Arjan van de Ven (2):
async: remove the temporary (2.6.29) "async is off by default" code
ide/net: flip the order of SATA and network init

Li, Shaohua (1):
fastboot: remove duplicate unpack_to_rootfs()

drivers/Makefile | 5 ++-
init/initramfs.c | 71 ++++++++++++++++++++++++++++++++++++++++++-----------
kernel/async.c | 10 +-------
3 files changed, 60 insertions(+), 26 deletions(-)


I will reply to this email with the three patches


--
Arjan van de Ven Intel Open Source Technology Centre
For development, discussion and tips for power savings,
visit http://www.lesswatts.org


2009-03-15 18:25:27

by Arjan van de Ven

[permalink] [raw]
Subject: [PATCH] async: remove the temporary (2.6.29) "async is off by default" code

>From bfcfecd5ccfaa76011d8eba8f6c8ed486d57e0ab Mon Sep 17 00:00:00 2001
From: Arjan van de Ven <[email protected]>
Date: Sun, 15 Mar 2009 11:11:44 -0700
Subject: [PATCH] async: remove the temporary (2.6.29) "async is off by default" code

Now that everyone has been able to test the async code (and it's being used
in the Moblin betas by default), we can enable it by default.
The various fixes needed have gone into 2.6.29 already.

Signed-off-by: Arjan van de Ven <[email protected]>
---
kernel/async.c | 10 +---------
1 files changed, 1 insertions(+), 9 deletions(-)

diff --git a/kernel/async.c b/kernel/async.c
index f565891..247ab12 100644
--- a/kernel/async.c
+++ b/kernel/async.c
@@ -391,16 +391,8 @@ static int __init async_init(void)
if (IS_ERR(kthread_run(async_manager_thread, NULL,
"async/mgr")))
async_enabled = 0;
- return 0;
-}
-
-static int __init setup_async(char *str)
-{
async_enabled = 1;
- return 1;
+ return 0;
}

-__setup("fastboot", setup_async);
-
-
core_initcall(async_init);
--
1.6.0.6




--
Arjan van de Ven Intel Open Source Technology Centre
For development, discussion and tips for power savings,
visit http://www.lesswatts.org

2009-03-15 18:25:45

by Arjan van de Ven

[permalink] [raw]
Subject: [PATCH] ide/net: flip the order of SATA and network init

>From 7c73393acfcce11a8d8ee661e08bae24fc17af61 Mon Sep 17 00:00:00 2001
From: Arjan van de Ven <[email protected]>
Date: Mon, 26 Jan 2009 18:58:11 -0800
Subject: [PATCH] ide/net: flip the order of SATA and network init

this patch flips the order in which sata and network drivers are initialized.

SATA probing takes quite a bit of time, and with the asynchronous infrastructure
other drivers that run after it can execute in parallel. Network drivers do tend
to take some real time talking to the hardware, so running these later is
a good thing (the sata probe then runs concurrent)

This saves about 15% of my kernels boot time.

Both Dave and Jeff acked this patch and suggested it should go via the async
tree.

Signed-off-by: Arjan van de Ven <[email protected]>
Acked-by: David S. Miller <[email protected]>
Acked-by: Jeff Garzik <[email protected]>
---
drivers/Makefile | 5 +++--
1 files changed, 3 insertions(+), 2 deletions(-)

diff --git a/drivers/Makefile b/drivers/Makefile
index c1bf417..2618a61 100644
--- a/drivers/Makefile
+++ b/drivers/Makefile
@@ -36,13 +36,14 @@ obj-$(CONFIG_FB_INTEL) += video/intelfb/

obj-y += serial/
obj-$(CONFIG_PARPORT) += parport/
-obj-y += base/ block/ misc/ mfd/ net/ media/
+obj-y += base/ block/ misc/ mfd/ media/
obj-$(CONFIG_NUBUS) += nubus/
-obj-$(CONFIG_ATM) += atm/
obj-y += macintosh/
obj-$(CONFIG_IDE) += ide/
obj-$(CONFIG_SCSI) += scsi/
obj-$(CONFIG_ATA) += ata/
+obj-y += net/
+obj-$(CONFIG_ATM) += atm/
obj-$(CONFIG_FUSION) += message/
obj-$(CONFIG_FIREWIRE) += firewire/
obj-y += ieee1394/
--
1.6.0.6




--
Arjan van de Ven Intel Open Source Technology Centre
For development, discussion and tips for power savings,
visit http://www.lesswatts.org

2009-03-15 18:26:00

by Arjan van de Ven

[permalink] [raw]
Subject: [PATCH] fastboot: remove duplicate unpack_to_rootfs()

>From 4ea6c5331652555dcc96b86e078b7dceaa38005b Mon Sep 17 00:00:00 2001
From: Li, Shaohua <[email protected]>
Date: Wed, 13 Aug 2008 17:26:01 +0800
Subject: [PATCH] fastboot: remove duplicate unpack_to_rootfs()

we check if initrd is initramfs first and then do the real unpack. The check
isn't required, we can directly do unpack. If the initrd isn't an
initramfs, we can remove the garbage. In my laptop, this saves 0.1s boot
time.

This patch penalizes non-initramfs initrd case, but nowadays, initramfs is
the most widely used method for initrds.

Signed-off-by: Shaohua Li <[email protected]>
Acked-by: Arjan van de Ven <[email protected]>
Signed-off-by: Ingo Molnar <[email protected]>
---
init/initramfs.c | 71 ++++++++++++++++++++++++++++++++++++++++++-----------
1 files changed, 56 insertions(+), 15 deletions(-)

diff --git a/init/initramfs.c b/init/initramfs.c
index d9c941c..d3c56fc 100644
--- a/init/initramfs.c
+++ b/init/initramfs.c
@@ -5,6 +5,7 @@
#include <linux/fcntl.h>
#include <linux/delay.h>
#include <linux/string.h>
+#include <linux/dirent.h>
#include <linux/syscalls.h>
#include <linux/utime.h>

@@ -166,8 +167,6 @@ static __initdata char *victim;
static __initdata unsigned count;
static __initdata loff_t this_header, next_header;

-static __initdata int dry_run;
-
static inline void __init eat(unsigned n)
{
victim += n;
@@ -229,10 +228,6 @@ static int __init do_header(void)
parse_header(collected);
next_header = this_header + N_ALIGN(name_len) + body_len;
next_header = (next_header + 3) & ~3;
- if (dry_run) {
- read_into(name_buf, N_ALIGN(name_len), GotName);
- return 0;
- }
state = SkipIt;
if (name_len <= 0 || name_len > PATH_MAX)
return 0;
@@ -303,8 +298,6 @@ static int __init do_name(void)
free_hash();
return 0;
}
- if (dry_run)
- return 0;
clean_path(collected, mode);
if (S_ISREG(mode)) {
int ml = maybe_link();
@@ -476,10 +469,9 @@ static void __init flush_window(void)
outcnt = 0;
}

-static char * __init unpack_to_rootfs(char *buf, unsigned len, int check_only)
+static char * __init unpack_to_rootfs(char *buf, unsigned len)
{
int written;
- dry_run = check_only;
header_buf = kmalloc(110, GFP_KERNEL);
symlink_buf = kmalloc(PATH_MAX + N_ALIGN(PATH_MAX) + 1, GFP_KERNEL);
name_buf = kmalloc(N_ALIGN(PATH_MAX), GFP_KERNEL);
@@ -574,10 +566,57 @@ skip:
initrd_end = 0;
}

+#define BUF_SIZE 1024
+static void __init clean_rootfs(void)
+{
+ int fd;
+ void *buf;
+ struct linux_dirent64 *dirp;
+ int count;
+
+ fd = sys_open("/", O_RDONLY, 0);
+ WARN_ON(fd < 0);
+ if (fd < 0)
+ return;
+ buf = kzalloc(BUF_SIZE, GFP_KERNEL);
+ WARN_ON(!buf);
+ if (!buf) {
+ sys_close(fd);
+ return;
+ }
+
+ dirp = buf;
+ count = sys_getdents64(fd, dirp, BUF_SIZE);
+ while (count > 0) {
+ while (count > 0) {
+ struct stat st;
+ int ret;
+
+ ret = sys_newlstat(dirp->d_name, &st);
+ WARN_ON_ONCE(ret);
+ if (!ret) {
+ if (S_ISDIR(st.st_mode))
+ sys_rmdir(dirp->d_name);
+ else
+ sys_unlink(dirp->d_name);
+ }
+
+ count -= dirp->d_reclen;
+ dirp = (void *)dirp + dirp->d_reclen;
+ }
+ dirp = buf;
+ memset(buf, 0, BUF_SIZE);
+ count = sys_getdents64(fd, dirp, BUF_SIZE);
+ }
+
+ sys_close(fd);
+ kfree(buf);
+}
+
static int __init populate_rootfs(void)
{
char *err = unpack_to_rootfs(__initramfs_start,
- __initramfs_end - __initramfs_start, 0);
+ __initramfs_end - __initramfs_start);
if (err)
panic(err);
if (initrd_start) {
@@ -585,13 +624,15 @@ static int __init populate_rootfs(void)
int fd;
printk(KERN_INFO "checking if image is initramfs...");
err = unpack_to_rootfs((char *)initrd_start,
- initrd_end - initrd_start, 1);
+ initrd_end - initrd_start);
if (!err) {
printk(" it is\n");
- unpack_to_rootfs((char *)initrd_start,
- initrd_end - initrd_start, 0);
free_initrd();
return 0;
+ } else {
+ clean_rootfs();
+ unpack_to_rootfs(__initramfs_start,
+ __initramfs_end - __initramfs_start);
}
printk("it isn't (%s); looks like an initrd\n", err);
fd = sys_open("/initrd.image", O_WRONLY|O_CREAT, 0700);
@@ -604,7 +645,7 @@ static int __init populate_rootfs(void)
#else
printk(KERN_INFO "Unpacking initramfs...");
err = unpack_to_rootfs((char *)initrd_start,
- initrd_end - initrd_start, 0);
+ initrd_end - initrd_start);
if (err)
panic(err);
printk(" done\n");
--
1.6.0.6




--
Arjan van de Ven Intel Open Source Technology Centre
For development, discussion and tips for power savings,
visit http://www.lesswatts.org

2009-03-16 16:13:27

by Woody Suwalski

[permalink] [raw]
Subject: Re: [PATCH] async: remove the temporary (2.6.29) "async is off by default" code

Arjan van de Ven wrote:
> From bfcfecd5ccfaa76011d8eba8f6c8ed486d57e0ab Mon Sep 17 00:00:00 2001
> From: Arjan van de Ven <[email protected]>
> Date: Sun, 15 Mar 2009 11:11:44 -0700
> Subject: [PATCH] async: remove the temporary (2.6.29) "async is off by default" code
>
> Now that everyone has been able to test the async code (and it's being used
> in the Moblin betas by default), we can enable it by default.
> The various fixes needed have gone into 2.6.29 already.
>
> Signed-off-by: Arjan van de Ven <[email protected]>
> ---
> kernel/async.c | 10 +---------
> 1 files changed, 1 insertions(+), 9 deletions(-)
>
> diff --git a/kernel/async.c b/kernel/async.c
> index f565891..247ab12 100644
> --- a/kernel/async.c
> +++ b/kernel/async.c
> @@ -391,16 +391,8 @@ static int __init async_init(void)
> if (IS_ERR(kthread_run(async_manager_thread, NULL,
> "async/mgr")))
> async_enabled = 0;
> - return 0;
> -}
> -
> -static int __init setup_async(char *str)
> -{
> async_enabled = 1;
> - return 1;
> + return 0;
> }
>
> -__setup("fastboot", setup_async);
> -
> -
> core_initcall(async_init);
>
Arjan, when I try this one - kernel will not boot. I see it initializing
the touchpad and then wait for ever.
If I pass fastboot on cmdline - it works OK. Any ideas?

Thanks, Woody


--
Woody Suwalski, Xandros, Ottawa, Canada, 1-613-842-3498 x414

2009-03-16 19:29:22

by Stefan Richter

[permalink] [raw]
Subject: Re: [PATCH] async: remove the temporary (2.6.29) "async is off by default" code

On 15 Mar, Arjan van de Ven wrote:
> --- a/kernel/async.c
> +++ b/kernel/async.c
> @@ -391,16 +391,8 @@ static int __init async_init(void)
> if (IS_ERR(kthread_run(async_manager_thread, NULL,
> "async/mgr")))
> async_enabled = 0;
> - return 0;
> -}
> -
> -static int __init setup_async(char *str)
> -{
> async_enabled = 1;
> - return 1;
> + return 0;
> }
>
> -__setup("fastboot", setup_async);
> -
> -
> core_initcall(async_init);


From: Stefan Richter <[email protected]>
Subject: async: enable it for real

Fix 'async: remove the temporary (2.6.29) "async is off by default" code'.

Also warn if the thread couldn't be started. A start failure may have
serious side effects when more code starts to use <linux/async.h>.

Signed-off-by: Stefan Richter <[email protected]>
---

Only compile-tested.

kernel/async.c | 10 +++++-----
1 file changed, 5 insertions(+), 5 deletions(-)

Index: linux/kernel/async.c
===================================================================
--- linux.orig/kernel/async.c
+++ linux/kernel/async.c
@@ -49,6 +49,7 @@ asynchronous and synchronous parts of th
*/

#include <linux/async.h>
+#include <linux/bug.h>
#include <linux/module.h>
#include <linux/wait.h>
#include <linux/sched.h>
@@ -387,11 +388,10 @@ static int async_manager_thread(void *un

static int __init async_init(void)
{
- if (async_enabled)
- if (IS_ERR(kthread_run(async_manager_thread, NULL,
- "async/mgr")))
- async_enabled = 0;
- async_enabled = 1;
+ async_enabled =
+ !IS_ERR(kthread_run(async_manager_thread, NULL, "async/mgr"));
+
+ WARN_ON(!async_enabled);
return 0;
}



--
Stefan Richter
-=====-==--= --== =----
http://arcgraph.de/sr/

2009-03-16 20:25:27

by Arjan van de Ven

[permalink] [raw]
Subject: Re: [PATCH] async: remove the temporary (2.6.29) "async is off by default" code

On Mon, 16 Mar 2009 20:29:04 +0100 (CET)
Stefan Richter <[email protected]> wrote:

> (async_manager_thread, NULL,
> >

DOh brown paper bag time.

This is so bad that I feel I need to redo the original patch; I'll
credit it to you though.


--
Arjan van de Ven Intel Open Source Technology Centre
For development, discussion and tips for power savings,
visit http://www.lesswatts.org