]> git.proxmox.com Git - mirror_ubuntu-artful-kernel.git/blobdiff - init/main.c
netfilter: guarantee 8 byte minalign for template addresses
[mirror_ubuntu-artful-kernel.git] / init / main.c
index a8a58e2794a50469d465fad1a6939a4b68ec1114..b0c9d6facef9a5aced55d1443b40029a660011e8 100644 (file)
@@ -81,6 +81,7 @@
 #include <linux/integrity.h>
 #include <linux/proc_ns.h>
 #include <linux/io.h>
+#include <linux/cache.h>
 
 #include <asm/io.h>
 #include <asm/bugs.h>
@@ -448,6 +449,8 @@ void __init parse_early_param(void)
        done = 1;
 }
 
+void __init __weak arch_post_acpi_subsys_init(void) { }
+
 void __init __weak smp_setup_processor_id(void)
 {
 }
@@ -551,6 +554,14 @@ asmlinkage __visible void __init start_kernel(void)
                 "Interrupts were enabled *very* early, fixing it\n"))
                local_irq_disable();
        idr_init_cache();
+
+       /*
+        * Allow workqueue creation and work item queueing/cancelling
+        * early.  Work item execution depends on kthreads and starts after
+        * workqueue_init().
+        */
+       workqueue_init_early();
+
        rcu_init();
 
        /* trace_printk() and trace points may be used after this */
@@ -636,9 +647,8 @@ asmlinkage __visible void __init start_kernel(void)
        security_init();
        dbg_late_init();
        vfs_caches_init();
+       pagecache_init();
        signals_init();
-       /* rootfs populating might need page-writeback */
-       page_writeback_init();
        proc_root_init();
        nsfs_init();
        cpuset_init();
@@ -649,6 +659,7 @@ asmlinkage __visible void __init start_kernel(void)
        check_bugs();
 
        acpi_subsystem_init();
+       arch_post_acpi_subsys_init();
        sfi_init_late();
 
        if (efi_enabled(EFI_RUNTIME_SERVICES)) {
@@ -789,6 +800,7 @@ int __init_or_module do_one_initcall(initcall_t fn)
        }
        WARN(msgbuf[0], "initcall %pF returned with %s\n", fn, msgbuf);
 
+       add_latent_entropy();
        return ret;
 }
 
@@ -913,14 +925,16 @@ static int try_to_run_init_process(const char *init_filename)
 
 static noinline void __init kernel_init_freeable(void);
 
-#ifdef CONFIG_DEBUG_RODATA
-static bool rodata_enabled = true;
+#if defined(CONFIG_DEBUG_RODATA) || defined(CONFIG_DEBUG_SET_MODULE_RONX)
+bool rodata_enabled __ro_after_init = true;
 static int __init set_debug_rodata(char *str)
 {
        return strtobool(str, &rodata_enabled);
 }
 __setup("rodata=", set_debug_rodata);
+#endif
 
+#ifdef CONFIG_DEBUG_RODATA
 static void mark_readonly(void)
 {
        if (rodata_enabled)
@@ -979,7 +993,7 @@ static int __ref kernel_init(void *unused)
                return 0;
 
        panic("No working init found.  Try passing init= option to kernel. "
-             "See Linux Documentation/init.txt for guidance.");
+             "See Linux Documentation/admin-guide/init.rst for guidance.");
 }
 
 static noinline void __init kernel_init_freeable(void)
@@ -1005,6 +1019,8 @@ static noinline void __init kernel_init_freeable(void)
 
        smp_prepare_cpus(setup_max_cpus);
 
+       workqueue_init();
+
        do_pre_smp_initcalls();
        lockup_detector_init();