Merge branch 'master' of /pub/scm/linux/kernel/git/torvalds/linux-2.6
[sfrench/cifs-2.6.git] / arch / x86 / kernel / process.c
1 #include <linux/errno.h>
2 #include <linux/kernel.h>
3 #include <linux/mm.h>
4 #include <linux/smp.h>
5 #include <linux/slab.h>
6 #include <linux/sched.h>
7
8 struct kmem_cache *task_xstate_cachep;
9
10 int arch_dup_task_struct(struct task_struct *dst, struct task_struct *src)
11 {
12         *dst = *src;
13         if (src->thread.xstate) {
14                 dst->thread.xstate = kmem_cache_alloc(task_xstate_cachep,
15                                                       GFP_KERNEL);
16                 if (!dst->thread.xstate)
17                         return -ENOMEM;
18                 WARN_ON((unsigned long)dst->thread.xstate & 15);
19                 memcpy(dst->thread.xstate, src->thread.xstate, xstate_size);
20         }
21         return 0;
22 }
23
24 void free_thread_xstate(struct task_struct *tsk)
25 {
26         if (tsk->thread.xstate) {
27                 kmem_cache_free(task_xstate_cachep, tsk->thread.xstate);
28                 tsk->thread.xstate = NULL;
29         }
30 }
31
32 void free_thread_info(struct thread_info *ti)
33 {
34         free_thread_xstate(ti->task);
35         free_pages((unsigned long)ti, get_order(THREAD_SIZE));
36 }
37
38 void arch_task_cache_init(void)
39 {
40         task_xstate_cachep =
41                 kmem_cache_create("task_xstate", xstate_size,
42                                   __alignof__(union thread_xstate),
43                                   SLAB_PANIC, NULL);
44 }