2 #include <linux/kernel.h>
3 #include <linux/slab.h>
4 #include <linux/sched.h>
6 struct kmem_cache
*task_xstate_cachep
= NULL
;
7 unsigned int xstate_size
;
9 int arch_dup_task_struct(struct task_struct
*dst
, struct task_struct
*src
)
13 if (src
->thread
.xstate
) {
14 dst
->thread
.xstate
= kmem_cache_alloc(task_xstate_cachep
,
16 if (!dst
->thread
.xstate
)
18 memcpy(dst
->thread
.xstate
, src
->thread
.xstate
, xstate_size
);
24 void free_thread_xstate(struct task_struct
*tsk
)
26 if (tsk
->thread
.xstate
) {
27 kmem_cache_free(task_xstate_cachep
, tsk
->thread
.xstate
);
28 tsk
->thread
.xstate
= NULL
;
32 #if THREAD_SHIFT < PAGE_SHIFT
33 static struct kmem_cache
*thread_info_cache
;
35 struct thread_info
*alloc_thread_info_node(struct task_struct
*tsk
, int node
)
37 struct thread_info
*ti
;
38 #ifdef CONFIG_DEBUG_STACK_USAGE
39 gfp_t mask
= GFP_KERNEL
| __GFP_ZERO
;
41 gfp_t mask
= GFP_KERNEL
;
44 ti
= kmem_cache_alloc_node(thread_info_cache
, mask
, node
);
48 void free_thread_info(struct thread_info
*ti
)
50 free_thread_xstate(ti
->task
);
51 kmem_cache_free(thread_info_cache
, ti
);
54 void thread_info_cache_init(void)
56 thread_info_cache
= kmem_cache_create("thread_info", THREAD_SIZE
,
57 THREAD_SIZE
, SLAB_PANIC
, NULL
);
60 struct thread_info
*alloc_thread_info_node(struct task_struct
*tsk
, int node
)
62 #ifdef CONFIG_DEBUG_STACK_USAGE
63 gfp_t mask
= GFP_KERNEL
| __GFP_ZERO
;
65 gfp_t mask
= GFP_KERNEL
;
67 struct page
*page
= alloc_pages_node(node
, mask
, THREAD_SIZE_ORDER
);
69 return page
? page_address(page
) : NULL
;
72 void free_thread_info(struct thread_info
*ti
)
74 free_thread_xstate(ti
->task
);
75 free_pages((unsigned long)ti
, THREAD_SIZE_ORDER
);
77 #endif /* THREAD_SHIFT < PAGE_SHIFT */
79 void arch_task_cache_init(void)
84 task_xstate_cachep
= kmem_cache_create("task_xstate", xstate_size
,
85 __alignof__(union thread_xstate
),
86 SLAB_PANIC
| SLAB_NOTRACK
, NULL
);
89 #ifdef CONFIG_SH_FPU_EMU
90 # define HAVE_SOFTFP 1
92 # define HAVE_SOFTFP 0
95 void __cpuinit
init_thread_xstate(void)
97 if (boot_cpu_data
.flags
& CPU_HAS_FPU
)
98 xstate_size
= sizeof(struct sh_fpu_hard_struct
);
100 xstate_size
= sizeof(struct sh_fpu_soft_struct
);