diff options
| author | Al Viro <viro@zeniv.linux.org.uk> | 2012-10-10 19:57:26 -0400 |
|---|---|---|
| committer | Al Viro <viro@zeniv.linux.org.uk> | 2012-10-11 21:42:35 -0400 |
| commit | d6b2123802d2b7eee8c62cd0ebd73e8636cbb068 (patch) | |
| tree | 70b01994296337051b8432b6d2bf46ff15e4e2c6 | |
| parent | ecf89e581acce83e8cd2a5530858be22c64441f7 (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.c | 13 |
1 files changed, 5 insertions, 8 deletions
diff --git a/init/main.c b/init/main.c index b28673087ac0..a490ffecb7b9 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 | 797 | static void __init kernel_init_freeable(void); |
| 798 | * makes it inline to init() and it becomes part of init.text section | 798 | |
| 799 | */ | 799 | static int __ref kernel_init(void *unused) |
| 800 | static 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 | ||
| 838 | static int __init kernel_init(void * unused) | 838 | static 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 | } |
