Blame view

init/main.c 24.7 KB
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1
2
3
4
5
6
7
8
  /*
   *  linux/init/main.c
   *
   *  Copyright (C) 1991, 1992  Linus Torvalds
   *
   *  GK 2/5/95  -  Changed to support mounting root fs via NFS
   *  Added initrd & change_root: Werner Almesberger & Hans Lermen, Feb '96
   *  Moan early if gcc is old, avoiding bogus kernels - Paul Gortmaker, May '96
dd4d9fecb   Fabian Frederick   init/main.c: code...
9
   *  Simplified starting of init:  Michael A. Griffith <grif@acm.org>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
10
   */
ea676e846   Andrew Morton   init/main.c: conv...
11
  #define DEBUG		/* Enable initcall_debug */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
12
13
14
  #include <linux/types.h>
  #include <linux/module.h>
  #include <linux/proc_fs.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
15
16
  #include <linux/kernel.h>
  #include <linux/syscalls.h>
9b5609fd7   Ingo Molnar   stackprotector: i...
17
  #include <linux/stackprotector.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
18
19
20
  #include <linux/string.h>
  #include <linux/ctype.h>
  #include <linux/delay.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
21
22
  #include <linux/ioport.h>
  #include <linux/init.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
23
  #include <linux/initrd.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
24
  #include <linux/bootmem.h>
4a7a16dc0   Len Brown   ACPI: move declar...
25
  #include <linux/acpi.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
26
  #include <linux/tty.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
27
28
  #include <linux/percpu.h>
  #include <linux/kmod.h>
db64fe022   Nick Piggin   mm: rewrite vmap ...
29
  #include <linux/vmalloc.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
30
  #include <linux/kernel_stat.h>
d7cd56111   Rusty Russell   [PATCH] i386: cpu...
31
  #include <linux/start_kernel.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
32
  #include <linux/security.h>
3d4422332   Jens Axboe   Add generic helpe...
33
  #include <linux/smp.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
34
35
36
37
38
39
40
  #include <linux/profile.h>
  #include <linux/rcupdate.h>
  #include <linux/moduleparam.h>
  #include <linux/kallsyms.h>
  #include <linux/writeback.h>
  #include <linux/cpu.h>
  #include <linux/cpuset.h>
ddbcc7e8e   Paul Menage   Task Control Grou...
41
  #include <linux/cgroup.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
42
  #include <linux/efi.h>
906568c9c   Thomas Gleixner   [PATCH] tick-mana...
43
  #include <linux/tick.h>
6168a702a   Andrew Morton   [PATCH] Declare i...
44
  #include <linux/interrupt.h>
c757249af   Shailabh Nagar   [PATCH] per-task-...
45
  #include <linux/taskstats_kern.h>
ca74e92b4   Shailabh Nagar   [PATCH] per-task-...
46
  #include <linux/delayacct.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
47
48
49
50
  #include <linux/unistd.h>
  #include <linux/rmap.h>
  #include <linux/mempolicy.h>
  #include <linux/key.h>
b6cd0b772   Adrian Bunk   [PATCH] fs/buffer...
51
  #include <linux/buffer_head.h>
eefa864b7   Joonsoo Kim   mm/page_ext: resu...
52
  #include <linux/page_ext.h>
9a11b49a8   Ingo Molnar   [PATCH] lockdep: ...
53
  #include <linux/debug_locks.h>
3ac7fe5a4   Thomas Gleixner   infrastructure to...
54
  #include <linux/debugobjects.h>
fbb9ce953   Ingo Molnar   [PATCH] lockdep: ...
55
  #include <linux/lockdep.h>
3c7b4e6b8   Catalin Marinas   kmemleak: Add the...
56
  #include <linux/kmemleak.h>
84d737866   Sukadev Bhattiprolu   [PATCH] add child...
57
  #include <linux/pid_namespace.h>
1f21782e6   Adrian Bunk   Driver core: prop...
58
  #include <linux/device.h>
73c279927   Eric W. Biederman   kthread: don't de...
59
  #include <linux/kthread.h>
e6fe6649b   Adrian Bunk   sched: proper pro...
60
  #include <linux/sched.h>
a1c9eea9e   Adrian Bunk   proper prototype ...
61
  #include <linux/signal.h>
199f0ca51   Akinobu Mita   idr: create idr_l...
62
  #include <linux/idr.h>
0b4b3827d   Jason Wessel   x86, kgdb, init: ...
63
  #include <linux/kgdb.h>
68bf21aa1   Steven Rostedt   ftrace: mcount ca...
64
  #include <linux/ftrace.h>
22a9d6456   Arjan van de Ven   async: Asynchrono...
65
  #include <linux/async.h>
dfec072ec   Vegard Nossum   kmemcheck: add th...
66
  #include <linux/kmemcheck.h>
6ae6996a4   Feng Tang   SFI: add platform...
67
  #include <linux/sfi.h>
2b2af54a5   Kay Sievers   Driver Core: devt...
68
  #include <linux/shmem_fs.h>
5a0e3ad6a   Tejun Heo   include cleanup: ...
69
  #include <linux/slab.h>
24a24bb6f   Peter Zijlstra   perf: Move perf_e...
70
  #include <linux/perf_event.h>
4a9d4b024   Al Viro   switch fput to ta...
71
  #include <linux/file.h>
a74fb73c1   Al Viro   infrastructure fo...
72
  #include <linux/ptrace.h>
bb813f4c9   Tejun Heo   init, block: try ...
73
74
  #include <linux/blkdev.h>
  #include <linux/elevator.h>
38ff87f77   Stephen Boyd   sched_clock: Make...
75
  #include <linux/sched_clock.h>
65f382fd0   Frederic Weisbecker   context_tracking:...
76
  #include <linux/context_tracking.h>
47d06e532   Theodore Ts'o   random: run rando...
77
  #include <linux/random.h>
7b0b73d76   Prarit Bhargava   init/main.c: add ...
78
  #include <linux/list.h>
c9cd2ce2b   Dmitry Kasatkin   integrity: provid...
79
  #include <linux/integrity.h>
e149ed2b8   Al Viro   take the targets ...
80
  #include <linux/proc_ns.h>
0ddab1d2e   Toshi Kani   lib/ioremap.c: ad...
81
  #include <linux/io.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
82
83
84
85
  
  #include <asm/io.h>
  #include <asm/bugs.h>
  #include <asm/setup.h>
a940199f2   Andi Kleen   [PATCH] x86_64: S...
86
  #include <asm/sections.h>
37b73c828   Arjan van de Ven   [PATCH] x86/x86_6...
87
  #include <asm/cacheflush.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
88

aae5f662a   Sam Ravnborg   kbuild: whitelist...
89
  static int kernel_init(void *);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
90
91
  
  extern void init_IRQ(void);
ff691f6e0   Heinrich Schuchardt   kernel/fork.c: ne...
92
  extern void fork_init(void);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
93
  extern void radix_tree_init(void);
37b73c828   Arjan van de Ven   [PATCH] x86/x86_6...
94
95
96
  #ifndef CONFIG_DEBUG_RODATA
  static inline void mark_rodata_ro(void) { }
  #endif
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
97

2ce802f62   Tejun Heo   lockdep: Move ear...
98
99
100
101
102
103
104
105
  /*
   * Debug helper: via this flag we know that we are in 'early bootup code'
   * where only the boot processor is running with IRQ disabled.  This means
   * two things - IRQ must not be enabled before the flag is cleared and some
   * operations which are not allowed with IRQ disabled are allowed while the
   * flag is set.
   */
  bool early_boot_irqs_disabled __read_mostly;
a68260483   Paul E. McKenney   rcu: Teach RCU th...
106
  enum system_states system_state __read_mostly;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
107
108
109
110
111
112
113
114
115
116
  EXPORT_SYMBOL(system_state);
  
  /*
   * Boot command-line arguments
   */
  #define MAX_INIT_ARGS CONFIG_INIT_ENV_ARG_LIMIT
  #define MAX_INIT_ENVS CONFIG_INIT_ENV_ARG_LIMIT
  
  extern void time_init(void);
  /* Default late time init is NULL. archs can override this later. */
d2e3192b6   Jan Beulich   init/main.c: mark...
117
  void (*__initdata late_time_init)(void);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
118

30d7e0d46   Alon Bar-Lev   [PATCH] Dynamic k...
119
120
121
122
123
124
  /* Untouched command line saved by arch-specific code. */
  char __initdata boot_command_line[COMMAND_LINE_SIZE];
  /* Untouched saved command line (eg. for /proc) */
  char *saved_command_line;
  /* Command line for parameter parsing */
  static char *static_command_line;
08746a65c   Krzysztof Mazur   init: fix in-plac...
125
126
  /* Command line for per-initcall parameter parsing */
  static char *initcall_command_line;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
127
128
  
  static char *execute_command;
ffdfc4097   Olof Johansson   [PATCH] Add rdini...
129
  static char *ramdisk_execute_command;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
130

8b3b29550   Jan Beulich   adjust nosmp hand...
131
  /*
c4b2c0c5f   Hannes Frederic Sowa   static_key: WARN ...
132
133
134
   * Used to generate warnings if static_key manipulation functions are used
   * before jump_label_init is called.
   */
dd4d9fecb   Fabian Frederick   init/main.c: code...
135
  bool static_key_initialized __read_mostly;
c4b2c0c5f   Hannes Frederic Sowa   static_key: WARN ...
136
137
138
  EXPORT_SYMBOL_GPL(static_key_initialized);
  
  /*
8b3b29550   Jan Beulich   adjust nosmp hand...
139
140
141
142
143
   * If set, this is an indication to the drivers that reset the underlying
   * device before going ahead with the initialization otherwise driver might
   * rely on the BIOS and skip the reset operation.
   *
   * This is useful if kernel is booting in an unreliable environment.
fc454fdc1   Frans Klaver   init/main: fix re...
144
   * For ex. kdump situation where previous kernel has crashed, BIOS has been
8b3b29550   Jan Beulich   adjust nosmp hand...
145
146
147
148
   * skipped and devices will be in unknown state.
   */
  unsigned int reset_devices;
  EXPORT_SYMBOL(reset_devices);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
149

7e96287dd   Vivek Goyal   [PATCH] kdump: in...
150
151
152
153
154
155
156
  static int __init set_reset_devices(char *str)
  {
  	reset_devices = 1;
  	return 1;
  }
  
  __setup("reset_devices", set_reset_devices);
dd4d9fecb   Fabian Frederick   init/main.c: code...
157
158
  static const char *argv_init[MAX_INIT_ARGS+2] = { "init", NULL, };
  const char *envp_init[MAX_INIT_ENVS+2] = { "HOME=/", "TERM=linux", NULL, };
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
159
  static const char *panic_later, *panic_param;
914dcaa84   Rusty Russell   param: make param...
160
  extern const struct obs_kernel_param __setup_start[], __setup_end[];
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
161
162
163
  
  static int __init obsolete_checksetup(char *line)
  {
914dcaa84   Rusty Russell   param: make param...
164
  	const struct obs_kernel_param *p;
33df0d19e   Rusty Russell   [PATCH] Allow ear...
165
  	int had_early_param = 0;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
166
167
168
169
  
  	p = __setup_start;
  	do {
  		int n = strlen(p->str);
b1e4d20cb   Michal Schmidt   params: make dash...
170
  		if (parameqn(line, p->str, n)) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
171
  			if (p->early) {
33df0d19e   Rusty Russell   [PATCH] Allow ear...
172
173
174
175
  				/* Already done in parse_early_param?
  				 * (Needs exact match on param part).
  				 * Keep iterating, as we can have early
  				 * params and __setups of same names 8( */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
176
  				if (line[n] == '\0' || line[n] == '=')
33df0d19e   Rusty Russell   [PATCH] Allow ear...
177
  					had_early_param = 1;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
178
  			} else if (!p->setup_func) {
ea676e846   Andrew Morton   init/main.c: conv...
179
180
181
  				pr_warn("Parameter %s is obsolete, ignored
  ",
  					p->str);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
182
183
184
185
186
187
  				return 1;
  			} else if (p->setup_func(line + n))
  				return 1;
  		}
  		p++;
  	} while (p < __setup_end);
33df0d19e   Rusty Russell   [PATCH] Allow ear...
188
189
  
  	return had_early_param;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
190
191
192
193
194
195
196
  }
  
  /*
   * This should be approx 2 Bo*oMips to start (note initial shift), and will
   * still work even if initially too large, it will just take slightly longer
   */
  unsigned long loops_per_jiffy = (1<<12);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
197
198
199
200
  EXPORT_SYMBOL(loops_per_jiffy);
  
  static int __init debug_kernel(char *str)
  {
a8fe19ebf   Borislav Petkov   kernel/printk: us...
201
  	console_loglevel = CONSOLE_LOGLEVEL_DEBUG;
f6f21c814   Yinghai Lu   Convert loglevel-...
202
  	return 0;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
203
204
205
206
  }
  
  static int __init quiet_kernel(char *str)
  {
a8fe19ebf   Borislav Petkov   kernel/printk: us...
207
  	console_loglevel = CONSOLE_LOGLEVEL_QUIET;
f6f21c814   Yinghai Lu   Convert loglevel-...
208
  	return 0;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
209
  }
f6f21c814   Yinghai Lu   Convert loglevel-...
210
211
  early_param("debug", debug_kernel);
  early_param("quiet", quiet_kernel);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
212
213
214
  
  static int __init loglevel(char *str)
  {
808bf29b9   Alexander Sverdlin   init: carefully h...
215
216
217
218
219
220
221
222
223
224
225
226
227
  	int newlevel;
  
  	/*
  	 * Only update loglevel value when a correct setting was passed,
  	 * to prevent blind crashes (when loglevel being set to 0) that
  	 * are quite hard to debug
  	 */
  	if (get_option(&str, &newlevel)) {
  		console_loglevel = newlevel;
  		return 0;
  	}
  
  	return -EINVAL;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
228
  }
f6f21c814   Yinghai Lu   Convert loglevel-...
229
  early_param("loglevel", loglevel);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
230

a99cd1125   Chris Metcalf   init: fix bug whe...
231
  /* Change NUL term back to "=", to make "param" the whole string. */
ecc861705   Luis R. Rodriguez   module: add extra...
232
233
  static int __init repair_env_string(char *param, char *val,
  				    const char *unused, void *arg)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
234
  {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
235
236
237
238
239
240
241
242
243
244
245
  	if (val) {
  		/* param=val or param="val"? */
  		if (val == param+strlen(param)+1)
  			val[-1] = '=';
  		else if (val == param+strlen(param)+2) {
  			val[-2] = '=';
  			memmove(val-1, val, strlen(val)+1);
  			val--;
  		} else
  			BUG();
  	}
a99cd1125   Chris Metcalf   init: fix bug whe...
246
247
  	return 0;
  }
51e158c12   Rusty Russell   param: hand argum...
248
  /* Anything after -- gets handed straight to init. */
ecc861705   Luis R. Rodriguez   module: add extra...
249
250
  static int __init set_init_arg(char *param, char *val,
  			       const char *unused, void *arg)
51e158c12   Rusty Russell   param: hand argum...
251
252
253
254
255
  {
  	unsigned int i;
  
  	if (panic_later)
  		return 0;
ecc861705   Luis R. Rodriguez   module: add extra...
256
  	repair_env_string(param, val, unused, NULL);
51e158c12   Rusty Russell   param: hand argum...
257
258
259
260
261
262
263
264
265
266
267
  
  	for (i = 0; argv_init[i]; i++) {
  		if (i == MAX_INIT_ARGS) {
  			panic_later = "init";
  			panic_param = param;
  			return 0;
  		}
  	}
  	argv_init[i] = param;
  	return 0;
  }
a99cd1125   Chris Metcalf   init: fix bug whe...
268
269
270
271
  /*
   * Unknown boot options get handed to init, unless they look like
   * unused parameters (modprobe will find them in /proc/cmdline).
   */
ecc861705   Luis R. Rodriguez   module: add extra...
272
273
  static int __init unknown_bootoption(char *param, char *val,
  				     const char *unused, void *arg)
a99cd1125   Chris Metcalf   init: fix bug whe...
274
  {
ecc861705   Luis R. Rodriguez   module: add extra...
275
  	repair_env_string(param, val, unused, NULL);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
276
277
278
279
  
  	/* Handle obsolete-style parameters */
  	if (obsolete_checksetup(param))
  		return 0;
f066a4f6d   Rusty Russell   param: don't comp...
280
281
  	/* Unused module parameter. */
  	if (strchr(param, '.') && (!val || strchr(param, '.') < val))
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
282
  		return 0;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
283
284
285
286
287
288
289
290
291
  
  	if (panic_later)
  		return 0;
  
  	if (val) {
  		/* Environment option */
  		unsigned int i;
  		for (i = 0; envp_init[i]; i++) {
  			if (i == MAX_INIT_ENVS) {
499a4584d   Tetsuo Handa   init: fix possibl...
292
  				panic_later = "env";
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
293
294
295
296
297
298
299
300
301
302
303
  				panic_param = param;
  			}
  			if (!strncmp(param, envp_init[i], val - param))
  				break;
  		}
  		envp_init[i] = param;
  	} else {
  		/* Command line option */
  		unsigned int i;
  		for (i = 0; argv_init[i]; i++) {
  			if (i == MAX_INIT_ARGS) {
499a4584d   Tetsuo Handa   init: fix possibl...
304
  				panic_later = "init";
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
  				panic_param = param;
  			}
  		}
  		argv_init[i] = param;
  	}
  	return 0;
  }
  
  static int __init init_setup(char *str)
  {
  	unsigned int i;
  
  	execute_command = str;
  	/*
  	 * In case LILO is going to boot us with default command line,
  	 * it prepends "auto" before the whole cmdline which makes
  	 * the shell think it should execute a script with such name.
  	 * So we ignore all arguments entered _before_ init=... [MJ]
  	 */
  	for (i = 1; i < MAX_INIT_ARGS; i++)
  		argv_init[i] = NULL;
  	return 1;
  }
  __setup("init=", init_setup);
ffdfc4097   Olof Johansson   [PATCH] Add rdini...
329
330
331
332
333
334
335
336
337
338
339
  static int __init rdinit_setup(char *str)
  {
  	unsigned int i;
  
  	ramdisk_execute_command = str;
  	/* See "auto" comment in init_setup */
  	for (i = 1; i < MAX_INIT_ARGS; i++)
  		argv_init[i] = NULL;
  	return 1;
  }
  __setup("rdinit=", rdinit_setup);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
340
  #ifndef CONFIG_SMP
34db18a05   Amerigo Wang   smp: move smp set...
341
  static const unsigned int setup_max_cpus = NR_CPUS;
e0982e90c   Mike Travis   init: move setup ...
342
  static inline void setup_nr_cpu_ids(void) { }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
343
  static inline void smp_prepare_cpus(unsigned int maxcpus) { }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
344
345
346
  #endif
  
  /*
30d7e0d46   Alon Bar-Lev   [PATCH] Dynamic k...
347
348
349
350
351
352
353
   * We need to store the untouched command line for future reference.
   * We also need to store the touched command line since the parameter
   * parsing is performed in place, and we should allow a component to
   * store reference of name/value for future reference.
   */
  static void __init setup_command_line(char *command_line)
  {
098b081b5   Santosh Shilimkar   init/main.c: use ...
354
355
356
357
358
  	saved_command_line =
  		memblock_virt_alloc(strlen(boot_command_line) + 1, 0);
  	initcall_command_line =
  		memblock_virt_alloc(strlen(boot_command_line) + 1, 0);
  	static_command_line = memblock_virt_alloc(strlen(command_line) + 1, 0);
dd4d9fecb   Fabian Frederick   init/main.c: code...
359
360
  	strcpy(saved_command_line, boot_command_line);
  	strcpy(static_command_line, command_line);
30d7e0d46   Alon Bar-Lev   [PATCH] Dynamic k...
361
362
363
  }
  
  /*
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
364
365
366
367
368
369
370
   * We need to finalize in a non-__init function or else race conditions
   * between the root thread and the init thread may cause start_kernel to
   * be reaped by free_initmem before the root thread has proceeded to
   * cpu_idle.
   *
   * gcc-3.4 accidentally inlines this function, so use noinline.
   */
b433c3d45   Peter Zijlstra   init, sched: Fix ...
371
  static __initdata DECLARE_COMPLETION(kthreadd_done);
f99ebf0a8   Rakib Mullick   init: properly pl...
372
  static noinline void __init_refok rest_init(void)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
373
  {
73c279927   Eric W. Biederman   kthread: don't de...
374
  	int pid;
7db905e63   Paul E. McKenney   rcu: Move end of ...
375
  	rcu_scheduler_starting();
00df35f99   Paul E. McKenney   cpu: Defer smpboo...
376
  	smpboot_thread_init();
b433c3d45   Peter Zijlstra   init, sched: Fix ...
377
  	/*
971585692   Peter Zijlstra   init: Fix comment
378
  	 * We need to spawn init first so that it obtains pid 1, however
b433c3d45   Peter Zijlstra   init, sched: Fix ...
379
380
381
  	 * the init task will end up wanting to create kthreads, which, if
  	 * we schedule it before we create kthreadd, will OOPS.
  	 */
34a1b7236   Oleg Nesterov   kthreads: kill CL...
382
  	kernel_thread(kernel_init, NULL, CLONE_FS);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
383
  	numa_default_policy();
73c279927   Eric W. Biederman   kthread: don't de...
384
  	pid = kernel_thread(kthreadd, NULL, CLONE_FS | CLONE_FILES);
d11c563dd   Paul E. McKenney   sched: Use lockde...
385
  	rcu_read_lock();
5cd204550   Pavel Emelyanov   Deprecate find_ta...
386
  	kthreadd_task = find_task_by_pid_ns(pid, &init_pid_ns);
d11c563dd   Paul E. McKenney   sched: Use lockde...
387
  	rcu_read_unlock();
b433c3d45   Peter Zijlstra   init, sched: Fix ...
388
  	complete(&kthreadd_done);
f340c0d1a   Ingo Molnar   [PATCH] Tweak idl...
389
390
391
  
  	/*
  	 * The boot idle thread must execute schedule()
1df21055e   Ingo Molnar   sched: add init_i...
392
  	 * at least once to get things moving:
f340c0d1a   Ingo Molnar   [PATCH] Tweak idl...
393
  	 */
1df21055e   Ingo Molnar   sched: add init_i...
394
  	init_idle_bootup_task(current);
bd2f55361   Thomas Gleixner   sched/rt: Use sch...
395
  	schedule_preempt_disabled();
5bfb5d690   Nick Piggin   [PATCH] sched: di...
396
  	/* Call into cpu_idle with preempt disabled */
a1a04ec3c   Thomas Gleixner   idle: Provide a g...
397
  	cpu_startup_entry(CPUHP_ONLINE);
1df21055e   Ingo Molnar   sched: add init_i...
398
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
399
400
  
  /* Check for early params. */
ecc861705   Luis R. Rodriguez   module: add extra...
401
402
  static int __init do_early_param(char *param, char *val,
  				 const char *unused, void *arg)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
403
  {
914dcaa84   Rusty Russell   param: make param...
404
  	const struct obs_kernel_param *p;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
405
406
  
  	for (p = __setup_start; p < __setup_end; p++) {
b1e4d20cb   Michal Schmidt   params: make dash...
407
  		if ((p->early && parameq(param, p->str)) ||
18a8bd949   Yinghai Lu   serial: convert e...
408
409
410
  		    (strcmp(param, "console") == 0 &&
  		     strcmp(p->str, "earlycon") == 0)
  		) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
411
  			if (p->setup_func(val) != 0)
ea676e846   Andrew Morton   init/main.c: conv...
412
413
  				pr_warn("Malformed early option '%s'
  ", param);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
414
415
416
417
418
  		}
  	}
  	/* We accept everything at this stage. */
  	return 0;
  }
13977091a   Magnus Damm   Driver Core: earl...
419
420
  void __init parse_early_options(char *cmdline)
  {
ecc861705   Luis R. Rodriguez   module: add extra...
421
422
  	parse_args("early options", cmdline, NULL, 0, 0, 0, NULL,
  		   do_early_param);
13977091a   Magnus Damm   Driver Core: earl...
423
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
424
425
426
  /* Arch code calls this early on, or if not, just before other parsing. */
  void __init parse_early_param(void)
  {
dd4d9fecb   Fabian Frederick   init/main.c: code...
427
428
  	static int done __initdata;
  	static char tmp_cmdline[COMMAND_LINE_SIZE] __initdata;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
429
430
431
432
433
  
  	if (done)
  		return;
  
  	/* All fall through to do_early_param. */
30d7e0d46   Alon Bar-Lev   [PATCH] Dynamic k...
434
  	strlcpy(tmp_cmdline, boot_command_line, COMMAND_LINE_SIZE);
13977091a   Magnus Damm   Driver Core: earl...
435
  	parse_early_options(tmp_cmdline);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
436
437
438
439
440
441
  	done = 1;
  }
  
  /*
   *	Activate the first processor.
   */
44fd22992   Stas Sergeev   [PATCH] Register ...
442
443
444
445
  static void __init boot_cpu_init(void)
  {
  	int cpu = smp_processor_id();
  	/* Mark the boot cpu "present", "online" etc for SMP and UP case */
915441b60   Rusty Russell   cpumask: Use acce...
446
  	set_cpu_online(cpu, true);
933b0618d   Peter Zijlstra   sched: Mark boot-...
447
  	set_cpu_active(cpu, true);
915441b60   Rusty Russell   cpumask: Use acce...
448
449
  	set_cpu_present(cpu, true);
  	set_cpu_possible(cpu, true);
44fd22992   Stas Sergeev   [PATCH] Register ...
450
  }
839ad62e7   Benjamin Herrenschmidt   [POWERPC] Use __w...
451
  void __init __weak smp_setup_processor_id(void)
033ab7f8e   Andrew Morton   [PATCH] add smp_s...
452
453
  {
  }
eded09ccf   David Howells   FRV: gcc-4.1.2 al...
454
  # if THREAD_SIZE >= PAGE_SIZE
8c9843e57   Benjamin Herrenschmidt   [POWERPC] Add thr...
455
456
457
  void __init __weak thread_info_cache_init(void)
  {
  }
eded09ccf   David Howells   FRV: gcc-4.1.2 al...
458
  #endif
8c9843e57   Benjamin Herrenschmidt   [POWERPC] Add thr...
459

444f478f6   Pekka Enberg   init: introduce m...
460
461
462
463
464
  /*
   * Set up kernel memory allocators
   */
  static void __init mm_init(void)
  {
eefa864b7   Joonsoo Kim   mm/page_ext: resu...
465
466
467
468
469
  	/*
  	 * page_ext requires contiguous pages,
  	 * bigger than MAX_ORDER unless SPARSEMEM.
  	 */
  	page_ext_init_flatmem();
444f478f6   Pekka Enberg   init: introduce m...
470
471
  	mem_init();
  	kmem_cache_init();
099a19d91   Tejun Heo   percpu: allow lim...
472
  	percpu_init_late();
b35f1819a   Kirill A. Shutemov   mm: create a sepa...
473
  	pgtable_init();
444f478f6   Pekka Enberg   init: introduce m...
474
  	vmalloc_init();
0ddab1d2e   Toshi Kani   lib/ioremap.c: ad...
475
  	ioremap_huge_init();
444f478f6   Pekka Enberg   init: introduce m...
476
  }
722a9f929   Andi Kleen   asmlinkage: Add e...
477
  asmlinkage __visible void __init start_kernel(void)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
478
  {
dd4d9fecb   Fabian Frederick   init/main.c: code...
479
480
  	char *command_line;
  	char *after_dashes;
033ab7f8e   Andrew Morton   [PATCH] add smp_s...
481

fbb9ce953   Ingo Molnar   [PATCH] lockdep: ...
482
483
484
485
486
  	/*
  	 * Need to run as early as possible, to initialize the
  	 * lockdep hash:
  	 */
  	lockdep_init();
d4311ff1a   Aaron Tomlin   init/main.c: Give...
487
  	set_task_stack_end_magic(&init_task);
73839c5b2   Ming Lei   init/main.c: Exec...
488
  	smp_setup_processor_id();
3ac7fe5a4   Thomas Gleixner   infrastructure to...
489
  	debug_objects_early_init();
420594296   Ingo Molnar   x86: fix the stac...
490
491
492
493
494
  
  	/*
  	 * Set up the the initial canary ASAP:
  	 */
  	boot_init_stack_canary();
ddbcc7e8e   Paul Menage   Task Control Grou...
495
  	cgroup_init_early();
fbb9ce953   Ingo Molnar   [PATCH] lockdep: ...
496
497
  
  	local_irq_disable();
2ce802f62   Tejun Heo   lockdep: Move ear...
498
  	early_boot_irqs_disabled = true;
fbb9ce953   Ingo Molnar   [PATCH] lockdep: ...
499

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
500
501
502
503
  /*
   * Interrupts are still disabled. Do necessary setups, then
   * enable them
   */
44fd22992   Stas Sergeev   [PATCH] Register ...
504
  	boot_cpu_init();
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
505
  	page_address_init();
ea676e846   Andrew Morton   init/main.c: conv...
506
  	pr_notice("%s", linux_banner);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
507
  	setup_arch(&command_line);
6345d24da   Linus Torvalds   mm: Fix boot cras...
508
  	mm_init_cpumask(&init_mm);
30d7e0d46   Alon Bar-Lev   [PATCH] Dynamic k...
509
  	setup_command_line(command_line);
e0982e90c   Mike Travis   init: move setup ...
510
  	setup_nr_cpu_ids();
d6647bdf9   Tejun Heo   init: set nr_cpu_...
511
  	setup_per_cpu_areas();
44fd22992   Stas Sergeev   [PATCH] Register ...
512
  	smp_prepare_boot_cpu();	/* arch-specific boot-cpu hooks */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
513

9adb62a5d   Jiang Liu   mm/hotplug: corre...
514
  	build_all_zonelists(NULL, NULL);
83b519e8b   Pekka Enberg   slab: setup alloc...
515
  	page_alloc_init();
ea676e846   Andrew Morton   init/main.c: conv...
516
517
  	pr_notice("Kernel command line: %s
  ", boot_command_line);
83b519e8b   Pekka Enberg   slab: setup alloc...
518
  	parse_early_param();
51e158c12   Rusty Russell   param: hand argum...
519
520
521
  	after_dashes = parse_args("Booting kernel",
  				  static_command_line, __start___param,
  				  __stop___param - __start___param,
ecc861705   Luis R. Rodriguez   module: add extra...
522
  				  -1, -1, NULL, &unknown_bootoption);
3438cf549   Daniel Thompson   param: fix crash ...
523
  	if (!IS_ERR_OR_NULL(after_dashes))
51e158c12   Rusty Russell   param: hand argum...
524
  		parse_args("Setting init args", after_dashes, NULL, 0, -1, -1,
ecc861705   Luis R. Rodriguez   module: add extra...
525
  			   NULL, set_init_arg);
97ce2c88f   Jeremy Fitzhardinge   jump-label: initi...
526
527
  
  	jump_label_init();
83b519e8b   Pekka Enberg   slab: setup alloc...
528
529
530
531
  	/*
  	 * These use large bootmem allocations and must precede
  	 * kmem_cache_init()
  	 */
162a7e750   Mike Travis   printk: allocate ...
532
  	setup_log_buf(0);
83b519e8b   Pekka Enberg   slab: setup alloc...
533
  	pidhash_init();
83b519e8b   Pekka Enberg   slab: setup alloc...
534
535
536
  	vfs_caches_init_early();
  	sort_main_extable();
  	trap_init();
444f478f6   Pekka Enberg   init: introduce m...
537
  	mm_init();
de03c72cf   KOSAKI Motohiro   mm: convert mm->c...
538

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
539
540
541
542
543
544
545
546
547
548
549
  	/*
  	 * Set up the scheduler prior starting any interrupts (such as the
  	 * timer interrupt). Full topology setup happens at smp_init()
  	 * time - but meanwhile we still have a functioning scheduler.
  	 */
  	sched_init();
  	/*
  	 * Disable preemption - early bootup scheduling is extremely
  	 * fragile until we cpu_idle() for the first time.
  	 */
  	preempt_disable();
dd4d9fecb   Fabian Frederick   init/main.c: code...
550
551
552
  	if (WARN(!irqs_disabled(),
  		 "Interrupts were enabled *very* early, fixing it
  "))
c4a68306b   Ard van Breemen   [PATCH] start_ker...
553
  		local_irq_disable();
9f58a205c   Peter Zijlstra   init: Initialized...
554
  	idr_init_cache();
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
555
  	rcu_init();
5f893b263   Steven Rostedt (Red Hat)   tracing: Move ena...
556
557
558
  
  	/* trace_printk() and trace points may be used after this */
  	trace_init();
65f382fd0   Frederic Weisbecker   context_tracking:...
559
  	context_tracking_init();
773e3eb7b   Yinghai Lu   init: Move radix_...
560
  	radix_tree_init();
0b8f1efad   Yinghai Lu   sparse irq_desc[]...
561
562
  	/* init some links before init_ISA_irqs() */
  	early_irq_init();
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
563
  	init_IRQ();
ad2b13536   Thomas Gleixner   tick: Call tick_i...
564
  	tick_init();
d6dd50e07   Linus Torvalds   Merge branch 'cor...
565
  	rcu_init_nohz();
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
566
  	init_timers();
c0a313296   Thomas Gleixner   [PATCH] hrtimer: ...
567
  	hrtimers_init();
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
568
  	softirq_init();
ad596171e   John Stultz   [PATCH] Time: Use...
569
  	timekeeping_init();
88fecaa27   John Stultz   [PATCH] time init...
570
  	time_init();
38ff87f77   Stephen Boyd   sched_clock: Make...
571
  	sched_clock_postinit();
9e6302056   Stephane Eranian   perf: Use hrtimer...
572
  	perf_event_init();
93e028148   Heiko Carstens   [PATCH] lockdep: ...
573
  	profile_init();
d8ad7d112   Takao Indoh   generic-ipi: Fix ...
574
  	call_function_init();
f91eb62f7   Steven Rostedt   init: scream bloo...
575
576
  	WARN(!irqs_disabled(), "Interrupts were enabled early
  ");
2ce802f62   Tejun Heo   lockdep: Move ear...
577
  	early_boot_irqs_disabled = false;
93e028148   Heiko Carstens   [PATCH] lockdep: ...
578
  	local_irq_enable();
dcce284a2   Benjamin Herrenschmidt   mm: Extend gfp ma...
579

7e85ee0c1   Pekka Enberg   slab,slub: don't ...
580
  	kmem_cache_init_late();
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
581
582
583
584
585
586
587
588
  
  	/*
  	 * HACK ALERT! This is early. We're enabling the console before
  	 * we've done PCI setups etc, and console_init() must be aware of
  	 * this. But we do want output early, in case something goes wrong.
  	 */
  	console_init();
  	if (panic_later)
499a4584d   Tetsuo Handa   init: fix possibl...
589
590
  		panic("Too many boot %s vars at `%s'", panic_later,
  		      panic_param);
fbb9ce953   Ingo Molnar   [PATCH] lockdep: ...
591
592
  
  	lockdep_info();
9a11b49a8   Ingo Molnar   [PATCH] lockdep: ...
593
594
595
596
597
598
  	/*
  	 * Need to run this when irqs are enabled, because it wants
  	 * to self-test [hard/soft]-irqs on/off lock inversion bugs
  	 * too:
  	 */
  	locking_selftest();
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
599
600
  #ifdef CONFIG_BLK_DEV_INITRD
  	if (initrd_start && !initrd_below_start_ok &&
bd673c7c3   Geert Uytterhoeven   initrd: cast `ini...
601
  	    page_to_pfn(virt_to_page((void *)initrd_start)) < min_low_pfn) {
ea676e846   Andrew Morton   init/main.c: conv...
602
603
  		pr_crit("initrd overwritten (0x%08lx < 0x%08lx) - disabling it.
  ",
bd673c7c3   Geert Uytterhoeven   initrd: cast `ini...
604
605
  		    page_to_pfn(virt_to_page((void *)initrd_start)),
  		    min_low_pfn);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
606
607
608
  		initrd_start = 0;
  	}
  #endif
eefa864b7   Joonsoo Kim   mm/page_ext: resu...
609
  	page_ext_init();
3ac7fe5a4   Thomas Gleixner   infrastructure to...
610
  	debug_objects_mem_init();
9b090f2da   Catalin Marinas   kmemleak: Initial...
611
  	kmemleak_init();
e7c8d5c99   Christoph Lameter   [PATCH] node loca...
612
  	setup_per_cpu_pageset();
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
613
614
615
  	numa_policy_init();
  	if (late_time_init)
  		late_time_init();
fa84e9eec   Thomas Gleixner   init: Move sched_...
616
  	sched_clock_init();
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
617
618
  	calibrate_delay();
  	pidmap_init();
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
619
  	anon_vma_init();
c4e1acbb3   Rafael J. Wysocki   ACPI / init: Invo...
620
  	acpi_early_init();
11520e5e7   Linus Torvalds   Revert "x86-64/ef...
621
  #ifdef CONFIG_X86
83e681897   Matt Fleming   efi: Make 'efi_en...
622
  	if (efi_enabled(EFI_RUNTIME_SERVICES))
11520e5e7   Linus Torvalds   Revert "x86-64/ef...
623
624
  		efi_enter_virtual_mode();
  #endif
197725de6   H. Peter Anvin   x86, espfix: Make...
625
  #ifdef CONFIG_X86_ESPFIX64
3891a04aa   H. Peter Anvin   x86-64, espfix: D...
626
627
628
  	/* Should be run before the first non-init thread is created */
  	init_espfix_bsp();
  #endif
8c9843e57   Benjamin Herrenschmidt   [POWERPC] Add thr...
629
  	thread_info_cache_init();
d84f4f992   David Howells   CRED: Inaugurate ...
630
  	cred_init();
ff691f6e0   Heinrich Schuchardt   kernel/fork.c: ne...
631
  	fork_init();
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
632
633
  	proc_caches_init();
  	buffer_init();
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
634
635
  	key_init();
  	security_init();
0b4b3827d   Jason Wessel   x86, kgdb, init: ...
636
  	dbg_late_init();
4248b0da4   Mel Gorman   fs, file table: r...
637
  	vfs_caches_init();
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
638
639
640
  	signals_init();
  	/* rootfs populating might need page-writeback */
  	page_writeback_init();
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
641
  	proc_root_init();
e149ed2b8   Al Viro   take the targets ...
642
  	nsfs_init();
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
643
  	cpuset_init();
695df2132   Zefan Li   cpuset: initializ...
644
  	cgroup_init();
c757249af   Shailabh Nagar   [PATCH] per-task-...
645
  	taskstats_init_early();
ca74e92b4   Shailabh Nagar   [PATCH] per-task-...
646
  	delayacct_init();
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
647
648
  
  	check_bugs();
b064a8fa7   Rafael J. Wysocki   ACPI / init: Swit...
649
  	acpi_subsystem_init();
6ae6996a4   Feng Tang   SFI: add platform...
650
  	sfi_init_late();
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
651

83e681897   Matt Fleming   efi: Make 'efi_en...
652
  	if (efi_enabled(EFI_RUNTIME_SERVICES)) {
2223af389   Josh Triplett   efi: Fix the ACPI...
653
  		efi_late_init();
785107923   Josh Triplett   efi: Defer freein...
654
  		efi_free_boot_services();
2223af389   Josh Triplett   efi: Fix the ACPI...
655
  	}
785107923   Josh Triplett   efi: Defer freein...
656

68bf21aa1   Steven Rostedt   ftrace: mcount ca...
657
  	ftrace_init();
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
658
659
660
  	/* Do the rest non-__init'ed, we're now alive */
  	rest_init();
  }
b99b87f70   Peter Oberparleiter   kernel: construct...
661
662
663
664
  /* Call all constructor functions linked into the kernel. */
  static void __init do_ctors(void)
  {
  #ifdef CONFIG_CONSTRUCTORS
196a15b4e   H Hartley Sweeten   init/main.c: fix ...
665
  	ctor_fn_t *fn = (ctor_fn_t *) __ctors_start;
b99b87f70   Peter Oberparleiter   kernel: construct...
666

196a15b4e   H Hartley Sweeten   init/main.c: fix ...
667
668
  	for (; fn < (ctor_fn_t *) __ctors_end; fn++)
  		(*fn)();
b99b87f70   Peter Oberparleiter   kernel: construct...
669
670
  #endif
  }
2329abfa3   Rusty Russell   module_param: mak...
671
  bool initcall_debug;
d0ea3d7d2   Rusty Russell   Make initcall_deb...
672
  core_param(initcall_debug, initcall_debug, bool, 0644);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
673

7b0b73d76   Prarit Bhargava   init/main.c: add ...
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
  #ifdef CONFIG_KALLSYMS
  struct blacklist_entry {
  	struct list_head next;
  	char *buf;
  };
  
  static __initdata_or_module LIST_HEAD(blacklisted_initcalls);
  
  static int __init initcall_blacklist(char *str)
  {
  	char *str_entry;
  	struct blacklist_entry *entry;
  
  	/* str argument is a comma-separated list of functions */
  	do {
  		str_entry = strsep(&str, ",");
  		if (str_entry) {
  			pr_debug("blacklisting initcall %s
  ", str_entry);
  			entry = alloc_bootmem(sizeof(*entry));
  			entry->buf = alloc_bootmem(strlen(str_entry) + 1);
  			strcpy(entry->buf, str_entry);
  			list_add(&entry->next, &blacklisted_initcalls);
  		}
  	} while (str_entry);
  
  	return 0;
  }
  
  static bool __init_or_module initcall_blacklisted(initcall_t fn)
  {
  	struct list_head *tmp;
  	struct blacklist_entry *entry;
  	char *fn_name;
  
  	fn_name = kasprintf(GFP_KERNEL, "%pf", fn);
  	if (!fn_name)
  		return false;
  
  	list_for_each(tmp, &blacklisted_initcalls) {
  		entry = list_entry(tmp, struct blacklist_entry, next);
  		if (!strcmp(fn_name, entry->buf)) {
  			pr_debug("initcall %s blacklisted
  ", fn_name);
  			kfree(fn_name);
  			return true;
  		}
  	}
  
  	kfree(fn_name);
  	return false;
  }
  #else
  static int __init initcall_blacklist(char *str)
  {
  	pr_warn("initcall_blacklist requires CONFIG_KALLSYMS
  ");
  	return 0;
  }
  
  static bool __init_or_module initcall_blacklisted(initcall_t fn)
  {
  	return false;
  }
  #endif
  __setup("initcall_blacklist=", initcall_blacklist);
e44612713   Kevin Winchester   init/main.c: mark...
740
  static int __init_or_module do_one_initcall_debug(initcall_t fn)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
741
  {
742390728   Frederic Weisbecker   tracing/fastboot:...
742
  	ktime_t calltime, delta, rettime;
30dbb20e6   Américo Wang   tracing: Remove b...
743
744
  	unsigned long long duration;
  	int ret;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
745

d62cf8152   Andrew Morton   init/main.c: don'...
746
747
  	printk(KERN_DEBUG "calling  %pF @ %i
  ", fn, task_pid_nr(current));
22c5c03b4   Kevin Winchester   init/main.c: fix ...
748
  	calltime = ktime_get();
30dbb20e6   Américo Wang   tracing: Remove b...
749
  	ret = fn();
22c5c03b4   Kevin Winchester   init/main.c: fix ...
750
751
752
  	rettime = ktime_get();
  	delta = ktime_sub(rettime, calltime);
  	duration = (unsigned long long) ktime_to_ns(delta) >> 10;
d62cf8152   Andrew Morton   init/main.c: don'...
753
754
  	printk(KERN_DEBUG "initcall %pF returned %d after %lld usecs
  ",
ea676e846   Andrew Morton   init/main.c: conv...
755
  		 fn, ret, duration);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
756

22c5c03b4   Kevin Winchester   init/main.c: fix ...
757
758
  	return ret;
  }
e44612713   Kevin Winchester   init/main.c: mark...
759
  int __init_or_module do_one_initcall(initcall_t fn)
22c5c03b4   Kevin Winchester   init/main.c: fix ...
760
761
762
  {
  	int count = preempt_count();
  	int ret;
ff1c8fac8   Steven Rostedt   init: remove perm...
763
  	char msgbuf[64];
22c5c03b4   Kevin Winchester   init/main.c: fix ...
764

7b0b73d76   Prarit Bhargava   init/main.c: add ...
765
766
  	if (initcall_blacklisted(fn))
  		return -EPERM;
22c5c03b4   Kevin Winchester   init/main.c: fix ...
767
768
769
770
  	if (initcall_debug)
  		ret = do_one_initcall_debug(fn);
  	else
  		ret = fn();
8f0c45cdf   Ingo Molnar   enhance initcall_...
771

e0df154f4   Linus Torvalds   Split up 'do_init...
772
  	msgbuf[0] = 0;
e662e1cfd   Cyrill Gorcunov   init: don't lose ...
773

e0df154f4   Linus Torvalds   Split up 'do_init...
774
  	if (preempt_count() != count) {
bf5d770bd   Steven Rostedt   init: Do not warn...
775
  		sprintf(msgbuf, "preemption imbalance ");
4a2b4b222   Peter Zijlstra   sched: Introduce ...
776
  		preempt_count_set(count);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
777
  	}
e0df154f4   Linus Torvalds   Split up 'do_init...
778
  	if (irqs_disabled()) {
a76bfd0da   Cyrill Gorcunov   initcalls: Fix m6...
779
  		strlcat(msgbuf, "disabled interrupts ", sizeof(msgbuf));
e0df154f4   Linus Torvalds   Split up 'do_init...
780
781
  		local_irq_enable();
  	}
f91eb62f7   Steven Rostedt   init: scream bloo...
782
783
  	WARN(msgbuf[0], "initcall %pF returned with %s
  ", fn, msgbuf);
59f9415ff   Arjan van de Ven   modules: extend i...
784

30dbb20e6   Américo Wang   tracing: Remove b...
785
  	return ret;
e0df154f4   Linus Torvalds   Split up 'do_init...
786
  }
026cee008   Pawel Moll   params: <level>_i...
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
  extern initcall_t __initcall_start[];
  extern initcall_t __initcall0_start[];
  extern initcall_t __initcall1_start[];
  extern initcall_t __initcall2_start[];
  extern initcall_t __initcall3_start[];
  extern initcall_t __initcall4_start[];
  extern initcall_t __initcall5_start[];
  extern initcall_t __initcall6_start[];
  extern initcall_t __initcall7_start[];
  extern initcall_t __initcall_end[];
  
  static initcall_t *initcall_levels[] __initdata = {
  	__initcall0_start,
  	__initcall1_start,
  	__initcall2_start,
  	__initcall3_start,
  	__initcall4_start,
  	__initcall5_start,
  	__initcall6_start,
  	__initcall7_start,
  	__initcall_end,
  };
96263d286   Jim Cromie   init: add comment...
809
  /* Keep these in sync with initcalls in include/linux/init.h */
026cee008   Pawel Moll   params: <level>_i...
810
  static char *initcall_level_names[] __initdata = {
9fb48c744   Jim Cromie   params: add 3rd a...
811
812
813
814
815
816
817
818
  	"early",
  	"core",
  	"postcore",
  	"arch",
  	"subsys",
  	"fs",
  	"device",
  	"late",
026cee008   Pawel Moll   params: <level>_i...
819
  };
026cee008   Pawel Moll   params: <level>_i...
820
  static void __init do_initcall_level(int level)
e0df154f4   Linus Torvalds   Split up 'do_init...
821
  {
196a15b4e   H Hartley Sweeten   init/main.c: fix ...
822
  	initcall_t *fn;
e0df154f4   Linus Torvalds   Split up 'do_init...
823

08746a65c   Krzysztof Mazur   init: fix in-plac...
824
  	strcpy(initcall_command_line, saved_command_line);
026cee008   Pawel Moll   params: <level>_i...
825
  	parse_args(initcall_level_names[level],
08746a65c   Krzysztof Mazur   init: fix in-plac...
826
  		   initcall_command_line, __start___param,
026cee008   Pawel Moll   params: <level>_i...
827
828
  		   __stop___param - __start___param,
  		   level, level,
ecc861705   Luis R. Rodriguez   module: add extra...
829
  		   NULL, &repair_env_string);
026cee008   Pawel Moll   params: <level>_i...
830
831
  
  	for (fn = initcall_levels[level]; fn < initcall_levels[level+1]; fn++)
196a15b4e   H Hartley Sweeten   init/main.c: fix ...
832
  		do_one_initcall(*fn);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
833
  }
026cee008   Pawel Moll   params: <level>_i...
834
835
836
  static void __init do_initcalls(void)
  {
  	int level;
19efb72fd   Borislav Petkov   init: Drop initca...
837
  	for (level = 0; level < ARRAY_SIZE(initcall_levels) - 1; level++)
026cee008   Pawel Moll   params: <level>_i...
838
839
  		do_initcall_level(level);
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
840
841
842
843
844
845
846
847
848
  /*
   * Ok, the machine is now initialized. None of the devices
   * have been touched yet, but the CPU subsystem is up and
   * running, and memory and process management works.
   *
   * Now we can finally start doing some real work..
   */
  static void __init do_basic_setup(void)
  {
759ee0915   Lai Jiangshan   init,cpuset: fix ...
849
  	cpuset_init_smp();
41ffe5d5c   Hugh Dickins   tmpfs: miscellane...
850
  	shmem_init();
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
851
  	driver_init();
b04c3afb2   Eric W. Biederman   [PATCH] sysctl: m...
852
  	init_irq_proc();
b99b87f70   Peter Oberparleiter   kernel: construct...
853
  	do_ctors();
d5767c535   Linus Torvalds   bootup: move 'use...
854
  	usermodehelper_enable();
b0f84374b   wangyanqing   bootup: move 'use...
855
  	do_initcalls();
47d06e532   Theodore Ts'o   random: run rando...
856
  	random_int_secret_init();
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
857
  }
7babe8db9   Eduard - Gabriel Munteanu   Full conversion t...
858
  static void __init do_pre_smp_initcalls(void)
c2147a509   Eduard - Gabriel Munteanu   Better interface ...
859
  {
196a15b4e   H Hartley Sweeten   init/main.c: fix ...
860
  	initcall_t *fn;
c2147a509   Eduard - Gabriel Munteanu   Better interface ...
861

026cee008   Pawel Moll   params: <level>_i...
862
  	for (fn = __initcall_start; fn < __initcall0_start; fn++)
196a15b4e   H Hartley Sweeten   init/main.c: fix ...
863
  		do_one_initcall(*fn);
c2147a509   Eduard - Gabriel Munteanu   Better interface ...
864
  }
bb813f4c9   Tejun Heo   init, block: try ...
865
866
867
868
869
870
871
872
873
874
  /*
   * This function requests modules which should be loaded by default and is
   * called twice right after initrd is mounted and right before init is
   * exec'd.  If such modules are on either initrd or rootfs, they will be
   * loaded before control is passed to userland.
   */
  void __init load_default_modules(void)
  {
  	load_default_elevator_module();
  }
a74fb73c1   Al Viro   infrastructure fo...
875
  static int run_init_process(const char *init_filename)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
876
877
  {
  	argv_init[0] = init_filename;
c4ad8f98b   Linus Torvalds   execve: use 'stru...
878
  	return do_execve(getname_kernel(init_filename),
ae903caae   Al Viro   Bury the conditio...
879
880
  		(const char __user *const __user *)argv_init,
  		(const char __user *const __user *)envp_init);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
881
  }
ba24762bd   Michael Opdenacker   init: make init f...
882
883
884
885
886
887
888
889
890
891
892
893
894
895
  static int try_to_run_init_process(const char *init_filename)
  {
  	int ret;
  
  	ret = run_init_process(init_filename);
  
  	if (ret && ret != -ENOENT) {
  		pr_err("Starting init: %s exists but couldn't execute it (error %d)
  ",
  		       init_filename, ret);
  	}
  
  	return ret;
  }
f80b0c904   Vineet Gupta   Ensure that kerne...
896
  static noinline void __init kernel_init_freeable(void);
d6b212380   Al Viro   make sure that we...
897
898
  
  static int __ref kernel_init(void *unused)
ee5bfa642   Vivek Goyal   [PATCH] generic: ...
899
  {
ba24762bd   Michael Opdenacker   init: make init f...
900
  	int ret;
d6b212380   Al Viro   make sure that we...
901
  	kernel_init_freeable();
22a9d6456   Arjan van de Ven   async: Asynchrono...
902
903
  	/* need to finish all async __init code before freeing the memory */
  	async_synchronize_full();
ee5bfa642   Vivek Goyal   [PATCH] generic: ...
904
  	free_initmem();
ee5bfa642   Vivek Goyal   [PATCH] generic: ...
905
906
907
  	mark_rodata_ro();
  	system_state = SYSTEM_RUNNING;
  	numa_default_policy();
4a9d4b024   Al Viro   switch fput to ta...
908
  	flush_delayed_fput();
fae5fa44f   Oleg Nesterov   signals: fix /sbi...
909

ee5bfa642   Vivek Goyal   [PATCH] generic: ...
910
  	if (ramdisk_execute_command) {
ba24762bd   Michael Opdenacker   init: make init f...
911
912
  		ret = run_init_process(ramdisk_execute_command);
  		if (!ret)
a74fb73c1   Al Viro   infrastructure fo...
913
  			return 0;
ba24762bd   Michael Opdenacker   init: make init f...
914
915
916
  		pr_err("Failed to execute %s (error %d)
  ",
  		       ramdisk_execute_command, ret);
ee5bfa642   Vivek Goyal   [PATCH] generic: ...
917
918
919
920
921
922
923
924
925
  	}
  
  	/*
  	 * We try each of these until one succeeds.
  	 *
  	 * The Bourne shell can be used instead of init if we are
  	 * trying to recover a really broken machine.
  	 */
  	if (execute_command) {
ba24762bd   Michael Opdenacker   init: make init f...
926
927
  		ret = run_init_process(execute_command);
  		if (!ret)
a74fb73c1   Al Viro   infrastructure fo...
928
  			return 0;
6ef4536e2   Andy Lutomirski   init: allow CONFI...
929
930
  		panic("Requested init %s failed (error %d).",
  		      execute_command, ret);
ee5bfa642   Vivek Goyal   [PATCH] generic: ...
931
  	}
ba24762bd   Michael Opdenacker   init: make init f...
932
933
934
935
  	if (!try_to_run_init_process("/sbin/init") ||
  	    !try_to_run_init_process("/etc/init") ||
  	    !try_to_run_init_process("/bin/init") ||
  	    !try_to_run_init_process("/bin/sh"))
a74fb73c1   Al Viro   infrastructure fo...
936
  		return 0;
ee5bfa642   Vivek Goyal   [PATCH] generic: ...
937

ba24762bd   Michael Opdenacker   init: make init f...
938
  	panic("No working init found.  Try passing init= option to kernel. "
9a85b8d60   Andreas Mohr   init/main.c: impr...
939
  	      "See Linux Documentation/init.txt for guidance.");
ee5bfa642   Vivek Goyal   [PATCH] generic: ...
940
  }
f80b0c904   Vineet Gupta   Ensure that kerne...
941
  static noinline void __init kernel_init_freeable(void)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
942
  {
b433c3d45   Peter Zijlstra   init, sched: Fix ...
943
944
945
946
  	/*
  	 * Wait until kthreadd is all set-up.
  	 */
  	wait_for_completion(&kthreadd_done);
31a67102f   Linus Torvalds   Fix blocking allo...
947
948
949
  
  	/* Now the scheduler is fully set up and can do blocking allocations */
  	gfp_allowed_mask = __GFP_BITS_MASK;
58568d2a8   Miao Xie   cpuset,mm: update...
950
951
952
  	/*
  	 * init can allocate pages on any node
  	 */
3c466d46a   Lai Jiangshan   init: use N_MEMOR...
953
  	set_mems_allowed(node_states[N_MEMORY]);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
954
955
956
  	/*
  	 * init can run on any cpu.
  	 */
1a2142afa   Rusty Russell   cpumask: remove d...
957
  	set_cpus_allowed_ptr(current, cpu_all_mask);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
958

9ec52099e   Cedric Le Goater   [PATCH] replace c...
959
  	cad_pid = task_pid(current);
ca74a6f84   Andi Kleen   x86: optimize loc...
960
  	smp_prepare_cpus(setup_max_cpus);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
961
962
  
  	do_pre_smp_initcalls();
004417a6d   Peter Zijlstra   perf, arch: Clean...
963
  	lockup_detector_init();
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
964

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
965
966
  	smp_init();
  	sched_init_smp();
0e1cc95b4   Mel Gorman   mm: meminit: fini...
967
  	page_alloc_init_late();
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
968
  	do_basic_setup();
2bd3a997b   Eric W. Biederman   init: Open /dev/c...
969
970
  	/* Open the /dev/console on the rootfs, this should never fail */
  	if (sys_open((const char __user *) "/dev/console", O_RDWR, 0) < 0)
ea676e846   Andrew Morton   init/main.c: conv...
971
972
  		pr_err("Warning: unable to open an initial console.
  ");
2bd3a997b   Eric W. Biederman   init: Open /dev/c...
973
974
975
  
  	(void) sys_dup(0);
  	(void) sys_dup(0);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
976
977
978
979
  	/*
  	 * check if there is an early userspace init.  If yes, let it do all
  	 * the work
  	 */
ffdfc4097   Olof Johansson   [PATCH] Add rdini...
980
981
982
983
984
985
  
  	if (!ramdisk_execute_command)
  		ramdisk_execute_command = "/init";
  
  	if (sys_access((const char __user *) ramdisk_execute_command, 0) != 0) {
  		ramdisk_execute_command = NULL;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
986
  		prepare_namespace();
ffdfc4097   Olof Johansson   [PATCH] Add rdini...
987
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
988
989
990
991
992
  
  	/*
  	 * Ok, we have completed the initial bootup, and
  	 * we're essentially up and running. Get rid of the
  	 * initmem segments and start the user-mode stuff..
c9cd2ce2b   Dmitry Kasatkin   integrity: provid...
993
994
995
  	 *
  	 * rootfs is available now, try loading the public keys
  	 * and default modules
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
996
  	 */
bb813f4c9   Tejun Heo   init, block: try ...
997

c9cd2ce2b   Dmitry Kasatkin   integrity: provid...
998
  	integrity_load_keys();
bb813f4c9   Tejun Heo   init, block: try ...
999
  	load_default_modules();
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1000
  }