0e613e7e7b5ec3bff1357baabb3bbb24452c48fe
[linux-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
33 void free_thread_info(struct thread_info *ti)
34 {
35         free_thread_xstate(ti->task);
36         free_pages((unsigned long)(ti), get_order(THREAD_SIZE));
37 }
38
39 void arch_task_cache_init(void)
40 {
41         task_xstate_cachep =
42                 kmem_cache_create("task_xstate", xstate_size,
43                                   __alignof__(union thread_xstate),
44                                   SLAB_PANIC, NULL);
45 }