aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAl Viro <viro@zeniv.linux.org.uk>2012-10-10 19:57:26 -0400
committerAl Viro <viro@zeniv.linux.org.uk>2012-10-11 21:42:35 -0400
commitd6b2123802d2b7eee8c62cd0ebd73e8636cbb068 (patch)
tree70b01994296337051b8432b6d2bf46ff15e4e2c6
parentecf89e581acce83e8cd2a5530858be22c64441f7 (diff)
make sure that we always have a return path from kernel_execve()
The only place where kernel_execve() is called without a way to return to the caller of kernel_thread() callback is kernel_post(). Reorganize kernel_init()/kernel_post() - instead of the former calling the latter in the end (and getting freed by it), have the latter *begin* with calling the former (and turn the latter into kernel_thread() callback, of course). Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
-rw-r--r--init/main.c13
1 files changed, 5 insertions, 8 deletions
diff --git a/init/main.c b/init/main.c
index b28673087ac..a490ffecb7b 100644
--- a/init/main.c
+++ b/init/main.c
@@ -794,11 +794,11 @@ static void run_init_process(const char *init_filename)
794 kernel_execve(init_filename, argv_init, envp_init); 794 kernel_execve(init_filename, argv_init, envp_init);
795} 795}
796 796
797/* This is a non __init function. Force it to be noinline otherwise gcc 797static void __init kernel_init_freeable(void);
798 * makes it inline to init() and it becomes part of init.text section 798
799 */ 799static int __ref kernel_init(void *unused)
800static noinline int init_post(void)
801{ 800{
801 kernel_init_freeable();
802 /* need to finish all async __init code before freeing the memory */ 802 /* need to finish all async __init code before freeing the memory */
803 async_synchronize_full(); 803 async_synchronize_full();
804 free_initmem(); 804 free_initmem();
@@ -835,7 +835,7 @@ static noinline int init_post(void)
835 "See Linux Documentation/init.txt for guidance."); 835 "See Linux Documentation/init.txt for guidance.");
836} 836}
837 837
838static int __init kernel_init(void * unused) 838static void __init kernel_init_freeable(void)
839{ 839{
840 /* 840 /*
841 * Wait until kthreadd is all set-up. 841 * Wait until kthreadd is all set-up.
@@ -890,7 +890,4 @@ static int __init kernel_init(void * unused)
890 * we're essentially up and running. Get rid of the 890 * we're essentially up and running. Get rid of the
891 * initmem segments and start the user-mode stuff.. 891 * initmem segments and start the user-mode stuff..
892 */ 892 */
893
894 init_post();
895 return 0;
896} 893}