aboutsummaryrefslogtreecommitdiffstats
path: root/kernel
diff options
context:
space:
mode:
authorDave Hansen <dave@sr71.net>2015-07-17 06:28:11 -0400
committerIngo Molnar <mingo@kernel.org>2015-07-17 21:42:35 -0400
commit0c8c0f03e3a292e031596484275c14cf39c0ab7a (patch)
treec1d012c83722e9fa3b7bc152e64697828f6cbc35 /kernel
parenta97439aa1aec10387797b4abae3cf117de1c90d7 (diff)
x86/fpu, sched: Dynamically allocate 'struct fpu'
The FPU rewrite removed the dynamic allocations of 'struct fpu'. But, this potentially wastes massive amounts of memory (2k per task on systems that do not have AVX-512 for instance). Instead of having a separate slab, this patch just appends the space that we need to the 'task_struct' which we dynamically allocate already. This saves from doing an extra slab allocation at fork(). The only real downside here is that we have to stick everything and the end of the task_struct. But, I think the BUILD_BUG_ON()s I stuck in there should keep that from being too fragile. Signed-off-by: Dave Hansen <dave.hansen@linux.intel.com> Cc: Andy Lutomirski <luto@amacapital.net> Cc: Borislav Petkov <bp@alien8.de> Cc: Brian Gerst <brgerst@gmail.com> Cc: Dave Hansen <dave@sr71.net> Cc: Denys Vlasenko <dvlasenk@redhat.com> Cc: H. Peter Anvin <hpa@zytor.com> Cc: Linus Torvalds <torvalds@linux-foundation.org> Cc: Oleg Nesterov <oleg@redhat.com> Cc: Peter Zijlstra <peterz@infradead.org> Cc: Thomas Gleixner <tglx@linutronix.de> Link: http://lkml.kernel.org/r/1437128892-9831-2-git-send-email-mingo@kernel.org Signed-off-by: Ingo Molnar <mingo@kernel.org>
Diffstat (limited to 'kernel')
-rw-r--r--kernel/fork.c8
1 files changed, 7 insertions, 1 deletions
diff --git a/kernel/fork.c b/kernel/fork.c
index 1bfefc6f96a4..431b67a6098c 100644
--- a/kernel/fork.c
+++ b/kernel/fork.c
@@ -287,15 +287,21 @@ static void set_max_threads(unsigned int max_threads_suggested)
287 max_threads = clamp_t(u64, threads, MIN_THREADS, MAX_THREADS); 287 max_threads = clamp_t(u64, threads, MIN_THREADS, MAX_THREADS);
288} 288}
289 289
290int __weak arch_task_struct_size(void)
291{
292 return sizeof(struct task_struct);
293}
294
290void __init fork_init(void) 295void __init fork_init(void)
291{ 296{
297 int task_struct_size = arch_task_struct_size();
292#ifndef CONFIG_ARCH_TASK_STRUCT_ALLOCATOR 298#ifndef CONFIG_ARCH_TASK_STRUCT_ALLOCATOR
293#ifndef ARCH_MIN_TASKALIGN 299#ifndef ARCH_MIN_TASKALIGN
294#define ARCH_MIN_TASKALIGN L1_CACHE_BYTES 300#define ARCH_MIN_TASKALIGN L1_CACHE_BYTES
295#endif 301#endif
296 /* create a slab on which task_structs can be allocated */ 302 /* create a slab on which task_structs can be allocated */
297 task_struct_cachep = 303 task_struct_cachep =
298 kmem_cache_create("task_struct", sizeof(struct task_struct), 304 kmem_cache_create("task_struct", task_struct_size,
299 ARCH_MIN_TASKALIGN, SLAB_PANIC | SLAB_NOTRACK, NULL); 305 ARCH_MIN_TASKALIGN, SLAB_PANIC | SLAB_NOTRACK, NULL);
300#endif 306#endif
301 307