aboutsummaryrefslogtreecommitdiffstats
path: root/init
diff options
context:
space:
mode:
authorArjan van de Ven <arjan@linux.intel.com>2009-01-07 11:45:46 -0500
committerArjan van de Ven <arjan@linux.intel.com>2009-01-07 11:45:46 -0500
commit22a9d645677feefd402befd02edd59b122289ef1 (patch)
tree9f1215cc8f7f0e1c36b03882b2926cc26ccfa5ff /init
parentede6f5aea054d3fb67c78857f7abdee602302043 (diff)
async: Asynchronous function calls to speed up kernel boot
Right now, most of the kernel boot is strictly synchronous, such that various hardware delays are done sequentially. In order to make the kernel boot faster, this patch introduces infrastructure to allow doing some of the initialization steps asynchronously, which will hide significant portions of the hardware delays in practice. In order to not change device order and other similar observables, this patch does NOT do full parallel initialization. Rather, it operates more in the way an out of order CPU does; the work may be done out of order and asynchronous, but the observable effects (instruction retiring for the CPU) are still done in the original sequence. Signed-off-by: Arjan van de Ven <arjan@linux.intel.com>
Diffstat (limited to 'init')
-rw-r--r--init/do_mounts.c2
-rw-r--r--init/main.c5
2 files changed, 6 insertions, 1 deletions
diff --git a/init/do_mounts.c b/init/do_mounts.c
index 5efca73b39f..708105e163d 100644
--- a/init/do_mounts.c
+++ b/init/do_mounts.c
@@ -13,6 +13,7 @@
13#include <linux/init.h> 13#include <linux/init.h>
14#include <linux/fs.h> 14#include <linux/fs.h>
15#include <linux/initrd.h> 15#include <linux/initrd.h>
16#include <linux/async.h>
16 17
17#include <linux/nfs_fs.h> 18#include <linux/nfs_fs.h>
18#include <linux/nfs_fs_sb.h> 19#include <linux/nfs_fs_sb.h>
@@ -372,6 +373,7 @@ void __init prepare_namespace(void)
372 /* wait for the known devices to complete their probing */ 373 /* wait for the known devices to complete their probing */
373 while (driver_probe_done() != 0) 374 while (driver_probe_done() != 0)
374 msleep(100); 375 msleep(100);
376 async_synchronize_full();
375 377
376 md_run_setup(); 378 md_run_setup();
377 379
diff --git a/init/main.c b/init/main.c
index b5a892c6837..f66715d8a85 100644
--- a/init/main.c
+++ b/init/main.c
@@ -62,6 +62,7 @@
62#include <linux/signal.h> 62#include <linux/signal.h>
63#include <linux/idr.h> 63#include <linux/idr.h>
64#include <linux/ftrace.h> 64#include <linux/ftrace.h>
65#include <linux/async.h>
65#include <trace/boot.h> 66#include <trace/boot.h>
66 67
67#include <asm/io.h> 68#include <asm/io.h>
@@ -684,7 +685,7 @@ asmlinkage void __init start_kernel(void)
684 rest_init(); 685 rest_init();
685} 686}
686 687
687static int initcall_debug; 688int initcall_debug;
688core_param(initcall_debug, initcall_debug, bool, 0644); 689core_param(initcall_debug, initcall_debug, bool, 0644);
689 690
690int do_one_initcall(initcall_t fn) 691int do_one_initcall(initcall_t fn)
@@ -785,6 +786,8 @@ static void run_init_process(char *init_filename)
785 */ 786 */
786static noinline int init_post(void) 787static noinline int init_post(void)
787{ 788{
789 /* need to finish all async __init code before freeing the memory */
790 async_synchronize_full();
788 free_initmem(); 791 free_initmem();
789 unlock_kernel(); 792 unlock_kernel();
790 mark_rodata_ro(); 793 mark_rodata_ro();