diff options
Diffstat (limited to 'init')
-rw-r--r-- | init/Kconfig | 196 | ||||
-rw-r--r-- | init/do_mounts.c | 6 | ||||
-rw-r--r-- | init/do_mounts_md.c | 2 | ||||
-rw-r--r-- | init/do_mounts_rd.c | 14 | ||||
-rw-r--r-- | init/initramfs.c | 1 | ||||
-rw-r--r-- | init/main.c | 17 |
6 files changed, 141 insertions, 95 deletions
diff --git a/init/Kconfig b/init/Kconfig index f9633c03cb12..a3e3bf548046 100644 --- a/init/Kconfig +++ b/init/Kconfig | |||
@@ -331,59 +331,6 @@ config LOG_BUF_SHIFT | |||
331 | 13 => 8 KB | 331 | 13 => 8 KB |
332 | 12 => 4 KB | 332 | 12 => 4 KB |
333 | 333 | ||
334 | config CGROUPS | ||
335 | bool "Control Group support" | ||
336 | help | ||
337 | This option will let you use process cgroup subsystems | ||
338 | such as Cpusets | ||
339 | |||
340 | Say N if unsure. | ||
341 | |||
342 | config CGROUP_DEBUG | ||
343 | bool "Example debug cgroup subsystem" | ||
344 | depends on CGROUPS | ||
345 | default n | ||
346 | help | ||
347 | This option enables a simple cgroup subsystem that | ||
348 | exports useful debugging information about the cgroups | ||
349 | framework | ||
350 | |||
351 | Say N if unsure | ||
352 | |||
353 | config CGROUP_NS | ||
354 | bool "Namespace cgroup subsystem" | ||
355 | depends on CGROUPS | ||
356 | help | ||
357 | Provides a simple namespace cgroup subsystem to | ||
358 | provide hierarchical naming of sets of namespaces, | ||
359 | for instance virtual servers and checkpoint/restart | ||
360 | jobs. | ||
361 | |||
362 | config CGROUP_FREEZER | ||
363 | bool "control group freezer subsystem" | ||
364 | depends on CGROUPS | ||
365 | help | ||
366 | Provides a way to freeze and unfreeze all tasks in a | ||
367 | cgroup. | ||
368 | |||
369 | config CGROUP_DEVICE | ||
370 | bool "Device controller for cgroups" | ||
371 | depends on CGROUPS && EXPERIMENTAL | ||
372 | help | ||
373 | Provides a cgroup implementing whitelists for devices which | ||
374 | a process in the cgroup can mknod or open. | ||
375 | |||
376 | config CPUSETS | ||
377 | bool "Cpuset support" | ||
378 | depends on SMP && CGROUPS | ||
379 | help | ||
380 | This option will let you create and manage CPUSETs which | ||
381 | allow dynamically partitioning a system into sets of CPUs and | ||
382 | Memory Nodes and assigning tasks to run only within those sets. | ||
383 | This is primarily useful on large SMP or NUMA systems. | ||
384 | |||
385 | Say N if unsure. | ||
386 | |||
387 | # | 334 | # |
388 | # Architectures with an unreliable sched_clock() should select this: | 335 | # Architectures with an unreliable sched_clock() should select this: |
389 | # | 336 | # |
@@ -397,6 +344,8 @@ config GROUP_SCHED | |||
397 | help | 344 | help |
398 | This feature lets CPU scheduler recognize task groups and control CPU | 345 | This feature lets CPU scheduler recognize task groups and control CPU |
399 | bandwidth allocation to such task groups. | 346 | bandwidth allocation to such task groups. |
347 | In order to create a group from arbitrary set of processes, use | ||
348 | CONFIG_CGROUPS. (See Control Group support.) | ||
400 | 349 | ||
401 | config FAIR_GROUP_SCHED | 350 | config FAIR_GROUP_SCHED |
402 | bool "Group scheduling for SCHED_OTHER" | 351 | bool "Group scheduling for SCHED_OTHER" |
@@ -439,6 +388,66 @@ config CGROUP_SCHED | |||
439 | 388 | ||
440 | endchoice | 389 | endchoice |
441 | 390 | ||
391 | menu "Control Group support" | ||
392 | config CGROUPS | ||
393 | bool "Control Group support" | ||
394 | help | ||
395 | This option add support for grouping sets of processes together, for | ||
396 | use with process control subsystems such as Cpusets, CFS, memory | ||
397 | controls or device isolation. | ||
398 | See | ||
399 | - Documentation/cpusets.txt (Cpusets) | ||
400 | - Documentation/scheduler/sched-design-CFS.txt (CFS) | ||
401 | - Documentation/cgroups/ (features for grouping, isolation) | ||
402 | - Documentation/controllers/ (features for resource control) | ||
403 | |||
404 | Say N if unsure. | ||
405 | |||
406 | config CGROUP_DEBUG | ||
407 | bool "Example debug cgroup subsystem" | ||
408 | depends on CGROUPS | ||
409 | default n | ||
410 | help | ||
411 | This option enables a simple cgroup subsystem that | ||
412 | exports useful debugging information about the cgroups | ||
413 | framework | ||
414 | |||
415 | Say N if unsure | ||
416 | |||
417 | config CGROUP_NS | ||
418 | bool "Namespace cgroup subsystem" | ||
419 | depends on CGROUPS | ||
420 | help | ||
421 | Provides a simple namespace cgroup subsystem to | ||
422 | provide hierarchical naming of sets of namespaces, | ||
423 | for instance virtual servers and checkpoint/restart | ||
424 | jobs. | ||
425 | |||
426 | config CGROUP_FREEZER | ||
427 | bool "control group freezer subsystem" | ||
428 | depends on CGROUPS | ||
429 | help | ||
430 | Provides a way to freeze and unfreeze all tasks in a | ||
431 | cgroup. | ||
432 | |||
433 | config CGROUP_DEVICE | ||
434 | bool "Device controller for cgroups" | ||
435 | depends on CGROUPS && EXPERIMENTAL | ||
436 | help | ||
437 | Provides a cgroup implementing whitelists for devices which | ||
438 | a process in the cgroup can mknod or open. | ||
439 | |||
440 | config CPUSETS | ||
441 | bool "Cpuset support" | ||
442 | depends on SMP && CGROUPS | ||
443 | help | ||
444 | This option will let you create and manage CPUSETs which | ||
445 | allow dynamically partitioning a system into sets of CPUs and | ||
446 | Memory Nodes and assigning tasks to run only within those sets. | ||
447 | This is primarily useful on large SMP or NUMA systems. | ||
448 | |||
449 | Say N if unsure. | ||
450 | |||
442 | config CGROUP_CPUACCT | 451 | config CGROUP_CPUACCT |
443 | bool "Simple CPU accounting cgroup subsystem" | 452 | bool "Simple CPU accounting cgroup subsystem" |
444 | depends on CGROUPS | 453 | depends on CGROUPS |
@@ -453,9 +462,6 @@ config RESOURCE_COUNTERS | |||
453 | infrastructure that works with cgroups | 462 | infrastructure that works with cgroups |
454 | depends on CGROUPS | 463 | depends on CGROUPS |
455 | 464 | ||
456 | config MM_OWNER | ||
457 | bool | ||
458 | |||
459 | config CGROUP_MEM_RES_CTLR | 465 | config CGROUP_MEM_RES_CTLR |
460 | bool "Memory Resource Controller for Control Groups" | 466 | bool "Memory Resource Controller for Control Groups" |
461 | depends on CGROUPS && RESOURCE_COUNTERS | 467 | depends on CGROUPS && RESOURCE_COUNTERS |
@@ -474,36 +480,68 @@ config CGROUP_MEM_RES_CTLR | |||
474 | sure you need the memory resource controller. Even when you enable | 480 | sure you need the memory resource controller. Even when you enable |
475 | this, you can set "cgroup_disable=memory" at your boot option to | 481 | this, you can set "cgroup_disable=memory" at your boot option to |
476 | disable memory resource controller and you can avoid overheads. | 482 | disable memory resource controller and you can avoid overheads. |
477 | (and lose benefits of memory resource contoller) | 483 | (and lose benefits of memory resource controller) |
478 | 484 | ||
479 | This config option also selects MM_OWNER config option, which | 485 | This config option also selects MM_OWNER config option, which |
480 | could in turn add some fork/exit overhead. | 486 | could in turn add some fork/exit overhead. |
481 | 487 | ||
488 | config MM_OWNER | ||
489 | bool | ||
490 | |||
491 | config CGROUP_MEM_RES_CTLR_SWAP | ||
492 | bool "Memory Resource Controller Swap Extension(EXPERIMENTAL)" | ||
493 | depends on CGROUP_MEM_RES_CTLR && SWAP && EXPERIMENTAL | ||
494 | help | ||
495 | Add swap management feature to memory resource controller. When you | ||
496 | enable this, you can limit mem+swap usage per cgroup. In other words, | ||
497 | when you disable this, memory resource controller has no cares to | ||
498 | usage of swap...a process can exhaust all of the swap. This extension | ||
499 | is useful when you want to avoid exhaustion swap but this itself | ||
500 | adds more overheads and consumes memory for remembering information. | ||
501 | Especially if you use 32bit system or small memory system, please | ||
502 | be careful about enabling this. When memory resource controller | ||
503 | is disabled by boot option, this will be automatically disabled and | ||
504 | there will be no overhead from this. Even when you set this config=y, | ||
505 | if boot option "noswapaccount" is set, swap will not be accounted. | ||
506 | |||
507 | |||
508 | endmenu | ||
509 | |||
482 | config SYSFS_DEPRECATED | 510 | config SYSFS_DEPRECATED |
483 | bool | 511 | bool |
484 | 512 | ||
485 | config SYSFS_DEPRECATED_V2 | 513 | config SYSFS_DEPRECATED_V2 |
486 | bool "Create deprecated sysfs files" | 514 | bool "Create deprecated sysfs layout for older userspace tools" |
487 | depends on SYSFS | 515 | depends on SYSFS |
488 | default y | 516 | default y |
489 | select SYSFS_DEPRECATED | 517 | select SYSFS_DEPRECATED |
490 | help | 518 | help |
491 | This option creates deprecated symlinks such as the | 519 | This option switches the layout of sysfs to the deprecated |
492 | "device"-link, the <subsystem>:<name>-link, and the | 520 | version. |
493 | "bus"-link. It may also add deprecated key in the | 521 | |
494 | uevent environment. | 522 | The current sysfs layout features a unified device tree at |
495 | None of these features or values should be used today, as | 523 | /sys/devices/, which is able to express a hierarchy between |
496 | they export driver core implementation details to userspace | 524 | class devices. If the deprecated option is set to Y, the |
497 | or export properties which can't be kept stable across kernel | 525 | unified device tree is split into a bus device tree at |
498 | releases. | 526 | /sys/devices/ and several individual class device trees at |
499 | 527 | /sys/class/. The class and bus devices will be connected by | |
500 | If enabled, this option will also move any device structures | 528 | "<subsystem>:<name>" and the "device" links. The "block" |
501 | that belong to a class, back into the /sys/class hierarchy, in | 529 | class devices, will not show up in /sys/class/block/. Some |
502 | order to support older versions of udev and some userspace | 530 | subsystems will suppress the creation of some devices which |
503 | programs. | 531 | depend on the unified device tree. |
504 | 532 | ||
505 | If you are using a distro with the most recent userspace | 533 | This option is not a pure compatibility option that can |
506 | packages, it should be safe to say N here. | 534 | be safely enabled on newer distributions. It will change the |
535 | layout of sysfs to the non-extensible deprecated version, | ||
536 | and disable some features, which can not be exported without | ||
537 | confusing older userspace tools. Since 2007/2008 all major | ||
538 | distributions do not enable this option, and ship no tools which | ||
539 | depend on the deprecated layout or this option. | ||
540 | |||
541 | If you are using a new kernel on an older distribution, or use | ||
542 | older userspace tools, you might need to say Y here. Do not say Y, | ||
543 | if the original kernel, that came with your distribution, has | ||
544 | this option set to N. | ||
507 | 545 | ||
508 | config PROC_PID_CPUSET | 546 | config PROC_PID_CPUSET |
509 | bool "Include legacy /proc/<pid>/cpuset file" | 547 | bool "Include legacy /proc/<pid>/cpuset file" |
@@ -898,10 +936,6 @@ config RT_MUTEXES | |||
898 | boolean | 936 | boolean |
899 | select PLIST | 937 | select PLIST |
900 | 938 | ||
901 | config TINY_SHMEM | ||
902 | default !SHMEM | ||
903 | bool | ||
904 | |||
905 | config BASE_SMALL | 939 | config BASE_SMALL |
906 | int | 940 | int |
907 | default 0 if BASE_FULL | 941 | default 0 if BASE_FULL |
@@ -976,12 +1010,6 @@ config MODULE_SRCVERSION_ALL | |||
976 | the version). With this option, such a "srcversion" field | 1010 | the version). With this option, such a "srcversion" field |
977 | will be created for all modules. If unsure, say N. | 1011 | will be created for all modules. If unsure, say N. |
978 | 1012 | ||
979 | config KMOD | ||
980 | def_bool y | ||
981 | help | ||
982 | This is being removed soon. These days, CONFIG_MODULES | ||
983 | implies CONFIG_KMOD, so use that instead. | ||
984 | |||
985 | endif # MODULES | 1013 | endif # MODULES |
986 | 1014 | ||
987 | config INIT_ALL_POSSIBLE | 1015 | config INIT_ALL_POSSIBLE |
diff --git a/init/do_mounts.c b/init/do_mounts.c index d055b1914c3d..708105e163df 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> |
@@ -220,10 +221,10 @@ static int __init do_mount_root(char *name, char *fs, int flags, void *data) | |||
220 | 221 | ||
221 | sys_chdir("/root"); | 222 | sys_chdir("/root"); |
222 | ROOT_DEV = current->fs->pwd.mnt->mnt_sb->s_dev; | 223 | ROOT_DEV = current->fs->pwd.mnt->mnt_sb->s_dev; |
223 | printk("VFS: Mounted root (%s filesystem)%s.\n", | 224 | printk("VFS: Mounted root (%s filesystem)%s on device %u:%u.\n", |
224 | current->fs->pwd.mnt->mnt_sb->s_type->name, | 225 | current->fs->pwd.mnt->mnt_sb->s_type->name, |
225 | current->fs->pwd.mnt->mnt_sb->s_flags & MS_RDONLY ? | 226 | current->fs->pwd.mnt->mnt_sb->s_flags & MS_RDONLY ? |
226 | " readonly" : ""); | 227 | " readonly" : "", MAJOR(ROOT_DEV), MINOR(ROOT_DEV)); |
227 | return 0; | 228 | return 0; |
228 | } | 229 | } |
229 | 230 | ||
@@ -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/do_mounts_md.c b/init/do_mounts_md.c index d6da5cdd3c38..ff95e3192884 100644 --- a/init/do_mounts_md.c +++ b/init/do_mounts_md.c | |||
@@ -271,7 +271,7 @@ static int __init raid_setup(char *str) | |||
271 | __setup("raid=", raid_setup); | 271 | __setup("raid=", raid_setup); |
272 | __setup("md=", md_setup); | 272 | __setup("md=", md_setup); |
273 | 273 | ||
274 | static void autodetect_raid(void) | 274 | static void __init autodetect_raid(void) |
275 | { | 275 | { |
276 | int fd; | 276 | int fd; |
277 | 277 | ||
diff --git a/init/do_mounts_rd.c b/init/do_mounts_rd.c index a06ed4f92e0e..a015e267fd17 100644 --- a/init/do_mounts_rd.c +++ b/init/do_mounts_rd.c | |||
@@ -9,6 +9,7 @@ | |||
9 | #include <linux/string.h> | 9 | #include <linux/string.h> |
10 | 10 | ||
11 | #include "do_mounts.h" | 11 | #include "do_mounts.h" |
12 | #include "../fs/squashfs/squashfs_fs.h" | ||
12 | 13 | ||
13 | #include <linux/decompress/generic.h> | 14 | #include <linux/decompress/generic.h> |
14 | 15 | ||
@@ -44,6 +45,7 @@ static int __init crd_load(int in_fd, int out_fd, decompress_fn deco); | |||
44 | * ext2 | 45 | * ext2 |
45 | * romfs | 46 | * romfs |
46 | * cramfs | 47 | * cramfs |
48 | * squashfs | ||
47 | * gzip | 49 | * gzip |
48 | */ | 50 | */ |
49 | static int __init | 51 | static int __init |
@@ -54,6 +56,7 @@ identify_ramdisk_image(int fd, int start_block, decompress_fn *decompressor) | |||
54 | struct ext2_super_block *ext2sb; | 56 | struct ext2_super_block *ext2sb; |
55 | struct romfs_super_block *romfsb; | 57 | struct romfs_super_block *romfsb; |
56 | struct cramfs_super *cramfsb; | 58 | struct cramfs_super *cramfsb; |
59 | struct squashfs_super_block *squashfsb; | ||
57 | int nblocks = -1; | 60 | int nblocks = -1; |
58 | unsigned char *buf; | 61 | unsigned char *buf; |
59 | const char *compress_name; | 62 | const char *compress_name; |
@@ -66,6 +69,7 @@ identify_ramdisk_image(int fd, int start_block, decompress_fn *decompressor) | |||
66 | ext2sb = (struct ext2_super_block *) buf; | 69 | ext2sb = (struct ext2_super_block *) buf; |
67 | romfsb = (struct romfs_super_block *) buf; | 70 | romfsb = (struct romfs_super_block *) buf; |
68 | cramfsb = (struct cramfs_super *) buf; | 71 | cramfsb = (struct cramfs_super *) buf; |
72 | squashfsb = (struct squashfs_super_block *) buf; | ||
69 | memset(buf, 0xe5, size); | 73 | memset(buf, 0xe5, size); |
70 | 74 | ||
71 | /* | 75 | /* |
@@ -100,6 +104,16 @@ identify_ramdisk_image(int fd, int start_block, decompress_fn *decompressor) | |||
100 | goto done; | 104 | goto done; |
101 | } | 105 | } |
102 | 106 | ||
107 | /* squashfs is at block zero too */ | ||
108 | if (le32_to_cpu(squashfsb->s_magic) == SQUASHFS_MAGIC) { | ||
109 | printk(KERN_NOTICE | ||
110 | "RAMDISK: squashfs filesystem found at block %d\n", | ||
111 | start_block); | ||
112 | nblocks = (le64_to_cpu(squashfsb->bytes_used) + BLOCK_SIZE - 1) | ||
113 | >> BLOCK_SIZE_BITS; | ||
114 | goto done; | ||
115 | } | ||
116 | |||
103 | /* | 117 | /* |
104 | * Read block 1 to test for minix and ext2 superblock | 118 | * Read block 1 to test for minix and ext2 superblock |
105 | */ | 119 | */ |
diff --git a/init/initramfs.c b/init/initramfs.c index 2f42984e5582..f8241e832aa3 100644 --- a/init/initramfs.c +++ b/init/initramfs.c | |||
@@ -317,6 +317,7 @@ static int __init do_name(void) | |||
317 | if (wfd >= 0) { | 317 | if (wfd >= 0) { |
318 | sys_fchown(wfd, uid, gid); | 318 | sys_fchown(wfd, uid, gid); |
319 | sys_fchmod(wfd, mode); | 319 | sys_fchmod(wfd, mode); |
320 | sys_ftruncate(wfd, body_len); | ||
320 | vcollected = kstrdup(collected, GFP_KERNEL); | 321 | vcollected = kstrdup(collected, GFP_KERNEL); |
321 | state = CopyFile; | 322 | state = CopyFile; |
322 | } | 323 | } |
diff --git a/init/main.c b/init/main.c index cd168ebc5924..844209453c02 100644 --- a/init/main.c +++ b/init/main.c | |||
@@ -50,7 +50,6 @@ | |||
50 | #include <linux/rmap.h> | 50 | #include <linux/rmap.h> |
51 | #include <linux/mempolicy.h> | 51 | #include <linux/mempolicy.h> |
52 | #include <linux/key.h> | 52 | #include <linux/key.h> |
53 | #include <linux/unwind.h> | ||
54 | #include <linux/buffer_head.h> | 53 | #include <linux/buffer_head.h> |
55 | #include <linux/page_cgroup.h> | 54 | #include <linux/page_cgroup.h> |
56 | #include <linux/debug_locks.h> | 55 | #include <linux/debug_locks.h> |
@@ -63,6 +62,7 @@ | |||
63 | #include <linux/signal.h> | 62 | #include <linux/signal.h> |
64 | #include <linux/idr.h> | 63 | #include <linux/idr.h> |
65 | #include <linux/ftrace.h> | 64 | #include <linux/ftrace.h> |
65 | #include <linux/async.h> | ||
66 | #include <trace/boot.h> | 66 | #include <trace/boot.h> |
67 | 67 | ||
68 | #include <asm/io.h> | 68 | #include <asm/io.h> |
@@ -108,7 +108,7 @@ EXPORT_SYMBOL(system_state); | |||
108 | 108 | ||
109 | extern void time_init(void); | 109 | extern void time_init(void); |
110 | /* Default late time init is NULL. archs can override this later. */ | 110 | /* Default late time init is NULL. archs can override this later. */ |
111 | void (*late_time_init)(void); | 111 | void (*__initdata late_time_init)(void); |
112 | extern void softirq_init(void); | 112 | extern void softirq_init(void); |
113 | 113 | ||
114 | /* Untouched command line saved by arch-specific code. */ | 114 | /* Untouched command line saved by arch-specific code. */ |
@@ -447,7 +447,7 @@ static void __init setup_command_line(char *command_line) | |||
447 | * gcc-3.4 accidentally inlines this function, so use noinline. | 447 | * gcc-3.4 accidentally inlines this function, so use noinline. |
448 | */ | 448 | */ |
449 | 449 | ||
450 | static void noinline __init_refok rest_init(void) | 450 | static noinline void __init_refok rest_init(void) |
451 | __releases(kernel_lock) | 451 | __releases(kernel_lock) |
452 | { | 452 | { |
453 | int pid; | 453 | int pid; |
@@ -537,7 +537,6 @@ asmlinkage void __init start_kernel(void) | |||
537 | * Need to run as early as possible, to initialize the | 537 | * Need to run as early as possible, to initialize the |
538 | * lockdep hash: | 538 | * lockdep hash: |
539 | */ | 539 | */ |
540 | unwind_init(); | ||
541 | lockdep_init(); | 540 | lockdep_init(); |
542 | debug_objects_early_init(); | 541 | debug_objects_early_init(); |
543 | cgroup_init_early(); | 542 | cgroup_init_early(); |
@@ -559,7 +558,6 @@ asmlinkage void __init start_kernel(void) | |||
559 | setup_arch(&command_line); | 558 | setup_arch(&command_line); |
560 | mm_init_owner(&init_mm, &init_task); | 559 | mm_init_owner(&init_mm, &init_task); |
561 | setup_command_line(command_line); | 560 | setup_command_line(command_line); |
562 | unwind_setup(); | ||
563 | setup_per_cpu_areas(); | 561 | setup_per_cpu_areas(); |
564 | setup_nr_cpu_ids(); | 562 | setup_nr_cpu_ids(); |
565 | smp_prepare_boot_cpu(); /* arch-specific boot-cpu hooks */ | 563 | smp_prepare_boot_cpu(); /* arch-specific boot-cpu hooks */ |
@@ -602,7 +600,8 @@ asmlinkage void __init start_kernel(void) | |||
602 | sched_clock_init(); | 600 | sched_clock_init(); |
603 | profile_init(); | 601 | profile_init(); |
604 | if (!irqs_disabled()) | 602 | if (!irqs_disabled()) |
605 | printk("start_kernel(): bug: interrupts were enabled early\n"); | 603 | printk(KERN_CRIT "start_kernel(): bug: interrupts were " |
604 | "enabled early\n"); | ||
606 | early_boot_irqs_on(); | 605 | early_boot_irqs_on(); |
607 | local_irq_enable(); | 606 | local_irq_enable(); |
608 | 607 | ||
@@ -687,7 +686,7 @@ asmlinkage void __init start_kernel(void) | |||
687 | rest_init(); | 686 | rest_init(); |
688 | } | 687 | } |
689 | 688 | ||
690 | static int initcall_debug; | 689 | int initcall_debug; |
691 | core_param(initcall_debug, initcall_debug, bool, 0644); | 690 | core_param(initcall_debug, initcall_debug, bool, 0644); |
692 | 691 | ||
693 | int do_one_initcall(initcall_t fn) | 692 | int do_one_initcall(initcall_t fn) |
@@ -786,8 +785,10 @@ static void run_init_process(char *init_filename) | |||
786 | /* This is a non __init function. Force it to be noinline otherwise gcc | 785 | /* This is a non __init function. Force it to be noinline otherwise gcc |
787 | * makes it inline to init() and it becomes part of init.text section | 786 | * makes it inline to init() and it becomes part of init.text section |
788 | */ | 787 | */ |
789 | static int noinline init_post(void) | 788 | static noinline int init_post(void) |
790 | { | 789 | { |
790 | /* need to finish all async __init code before freeing the memory */ | ||
791 | async_synchronize_full(); | ||
791 | free_initmem(); | 792 | free_initmem(); |
792 | unlock_kernel(); | 793 | unlock_kernel(); |
793 | mark_rodata_ro(); | 794 | mark_rodata_ro(); |