diff options
author | Heinrich Schuchardt <xypron.glpk@gmx.de> | 2015-04-16 15:47:44 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2015-04-17 09:04:06 -0400 |
commit | ff691f6e03815dc8f99461ea509df863a879fc3a (patch) | |
tree | acc3b3c61ff40365d15cbe89952c743b301016af /kernel/fork.c | |
parent | 3ea7f5e25ec271909451b7dc17be37581b888de6 (diff) |
kernel/fork.c: new function for max_threads
PAGE_SIZE is not guaranteed to be equal to or less than 8 times the
THREAD_SIZE.
E.g. architecture hexagon may have page size 1M and thread size 4096.
This would lead to a division by zero in the calculation of max_threads.
With this patch the buggy code is moved to a separate function
set_max_threads. The error is not fixed.
After fixing the problem in a separate patch the new function can be
reused to adjust max_threads after adding or removing memory.
Argument mempages of function fork_init() is removed as totalram_pages is
an exported symbol.
The creation of separate patches for refactoring to a new function and for
fixing the logic was suggested by Ingo Molnar.
Signed-off-by: Heinrich Schuchardt <xypron.glpk@gmx.de>
Cc: Oleg Nesterov <oleg@redhat.com>
Cc: Ingo Molnar <mingo@kernel.org>
Cc: Guenter Roeck <linux@roeck-us.net>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'kernel/fork.c')
-rw-r--r-- | kernel/fork.c | 34 |
1 files changed, 21 insertions, 13 deletions
diff --git a/kernel/fork.c b/kernel/fork.c index c507e29bcb01..01038e6f51a8 100644 --- a/kernel/fork.c +++ b/kernel/fork.c | |||
@@ -253,7 +253,26 @@ EXPORT_SYMBOL_GPL(__put_task_struct); | |||
253 | 253 | ||
254 | void __init __weak arch_task_cache_init(void) { } | 254 | void __init __weak arch_task_cache_init(void) { } |
255 | 255 | ||
256 | void __init fork_init(unsigned long mempages) | 256 | /* |
257 | * set_max_threads | ||
258 | */ | ||
259 | static void set_max_threads(void) | ||
260 | { | ||
261 | /* | ||
262 | * The default maximum number of threads is set to a safe | ||
263 | * value: the thread structures can take up at most one | ||
264 | * eighth of the memory. | ||
265 | */ | ||
266 | max_threads = totalram_pages / (8 * THREAD_SIZE / PAGE_SIZE); | ||
267 | |||
268 | /* | ||
269 | * we need to allow at least 20 threads to boot a system | ||
270 | */ | ||
271 | if (max_threads < 20) | ||
272 | max_threads = 20; | ||
273 | } | ||
274 | |||
275 | void __init fork_init(void) | ||
257 | { | 276 | { |
258 | #ifndef CONFIG_ARCH_TASK_STRUCT_ALLOCATOR | 277 | #ifndef CONFIG_ARCH_TASK_STRUCT_ALLOCATOR |
259 | #ifndef ARCH_MIN_TASKALIGN | 278 | #ifndef ARCH_MIN_TASKALIGN |
@@ -268,18 +287,7 @@ void __init fork_init(unsigned long mempages) | |||
268 | /* do the arch specific task caches init */ | 287 | /* do the arch specific task caches init */ |
269 | arch_task_cache_init(); | 288 | arch_task_cache_init(); |
270 | 289 | ||
271 | /* | 290 | set_max_threads(); |
272 | * The default maximum number of threads is set to a safe | ||
273 | * value: the thread structures can take up at most one | ||
274 | * eighth of the memory. | ||
275 | */ | ||
276 | max_threads = mempages / (8 * THREAD_SIZE / PAGE_SIZE); | ||
277 | |||
278 | /* | ||
279 | * we need to allow at least 20 threads to boot a system | ||
280 | */ | ||
281 | if (max_threads < 20) | ||
282 | max_threads = 20; | ||
283 | 291 | ||
284 | init_task.signal->rlim[RLIMIT_NPROC].rlim_cur = max_threads/2; | 292 | init_task.signal->rlim[RLIMIT_NPROC].rlim_cur = max_threads/2; |
285 | init_task.signal->rlim[RLIMIT_NPROC].rlim_max = max_threads/2; | 293 | init_task.signal->rlim[RLIMIT_NPROC].rlim_max = max_threads/2; |