diff options
-rw-r--r-- | arch/arm/kernel/process.c | 61 | ||||
-rw-r--r-- | include/asm-arm/thread_info.h | 14 |
2 files changed, 12 insertions, 63 deletions
diff --git a/arch/arm/kernel/process.c b/arch/arm/kernel/process.c index bf35c178a877..a9e8f7e55fd6 100644 --- a/arch/arm/kernel/process.c +++ b/arch/arm/kernel/process.c | |||
@@ -281,67 +281,6 @@ void show_fpregs(struct user_fp *regs) | |||
281 | } | 281 | } |
282 | 282 | ||
283 | /* | 283 | /* |
284 | * Task structure and kernel stack allocation. | ||
285 | */ | ||
286 | struct thread_info_list { | ||
287 | unsigned long *head; | ||
288 | unsigned int nr; | ||
289 | }; | ||
290 | |||
291 | static DEFINE_PER_CPU(struct thread_info_list, thread_info_list) = { NULL, 0 }; | ||
292 | |||
293 | #define EXTRA_TASK_STRUCT 4 | ||
294 | |||
295 | struct thread_info *alloc_thread_info(struct task_struct *task) | ||
296 | { | ||
297 | struct thread_info *thread = NULL; | ||
298 | |||
299 | if (EXTRA_TASK_STRUCT) { | ||
300 | struct thread_info_list *th = &get_cpu_var(thread_info_list); | ||
301 | unsigned long *p = th->head; | ||
302 | |||
303 | if (p) { | ||
304 | th->head = (unsigned long *)p[0]; | ||
305 | th->nr -= 1; | ||
306 | } | ||
307 | put_cpu_var(thread_info_list); | ||
308 | |||
309 | thread = (struct thread_info *)p; | ||
310 | } | ||
311 | |||
312 | if (!thread) | ||
313 | thread = (struct thread_info *) | ||
314 | __get_free_pages(GFP_KERNEL, THREAD_SIZE_ORDER); | ||
315 | |||
316 | #ifdef CONFIG_DEBUG_STACK_USAGE | ||
317 | /* | ||
318 | * The stack must be cleared if you want SYSRQ-T to | ||
319 | * give sensible stack usage information | ||
320 | */ | ||
321 | if (thread) | ||
322 | memzero(thread, THREAD_SIZE); | ||
323 | #endif | ||
324 | return thread; | ||
325 | } | ||
326 | |||
327 | void free_thread_info(struct thread_info *thread) | ||
328 | { | ||
329 | if (EXTRA_TASK_STRUCT) { | ||
330 | struct thread_info_list *th = &get_cpu_var(thread_info_list); | ||
331 | if (th->nr < EXTRA_TASK_STRUCT) { | ||
332 | unsigned long *p = (unsigned long *)thread; | ||
333 | p[0] = (unsigned long)th->head; | ||
334 | th->head = p; | ||
335 | th->nr += 1; | ||
336 | put_cpu_var(thread_info_list); | ||
337 | return; | ||
338 | } | ||
339 | put_cpu_var(thread_info_list); | ||
340 | } | ||
341 | free_pages((unsigned long)thread, THREAD_SIZE_ORDER); | ||
342 | } | ||
343 | |||
344 | /* | ||
345 | * Free current thread data structures etc.. | 284 | * Free current thread data structures etc.. |
346 | */ | 285 | */ |
347 | void exit_thread(void) | 286 | void exit_thread(void) |
diff --git a/include/asm-arm/thread_info.h b/include/asm-arm/thread_info.h index f28b236139ed..d9b8bddc8732 100644 --- a/include/asm-arm/thread_info.h +++ b/include/asm-arm/thread_info.h | |||
@@ -94,8 +94,18 @@ static inline struct thread_info *current_thread_info(void) | |||
94 | return (struct thread_info *)(sp & ~(THREAD_SIZE - 1)); | 94 | return (struct thread_info *)(sp & ~(THREAD_SIZE - 1)); |
95 | } | 95 | } |
96 | 96 | ||
97 | extern struct thread_info *alloc_thread_info(struct task_struct *task); | 97 | /* thread information allocation */ |
98 | extern void free_thread_info(struct thread_info *); | 98 | #ifdef CONFIG_DEBUG_STACK_USAGE |
99 | #define alloc_thread_info(tsk) \ | ||
100 | ((struct thread_info *)__get_free_pages(GFP_KERNEL | __GFP_ZERO, \ | ||
101 | THREAD_SIZE_ORDER)) | ||
102 | #else | ||
103 | #define alloc_thread_info(tsk) \ | ||
104 | ((struct thread_info *)__get_free_pages(GFP_KERNEL, THREAD_SIZE_ORDER)) | ||
105 | #endif | ||
106 | |||
107 | #define free_thread_info(info) \ | ||
108 | free_pages((unsigned long)info, THREAD_SIZE_ORDER); | ||
99 | 109 | ||
100 | #define thread_saved_pc(tsk) \ | 110 | #define thread_saved_pc(tsk) \ |
101 | ((unsigned long)(pc_pointer(task_thread_info(tsk)->cpu_context.pc))) | 111 | ((unsigned long)(pc_pointer(task_thread_info(tsk)->cpu_context.pc))) |