clean up duplicated alloc/free_thread_info
We duplicate alloc/free_thread_info defines on many platforms (the majority uses __get_free_pages/free_pages). This patch defines common defines and removes these duplicated defines. __HAVE_ARCH_THREAD_INFO_ALLOCATOR is introduced for platforms that do something different. Signed-off-by: FUJITA Tomonori <fujita.tomonori@lab.ntt.co.jp> Acked-by: Russell King <rmk+kernel@arm.linux.org.uk> Cc: Pekka Enberg <penberg@cs.helsinki.fi> Cc: <linux-arch@vger.kernel.org> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This commit is contained in:
		
							parent
							
								
									62ec30d45e
								
							
						
					
					
						commit
						b69c49b784
					
				| @ -50,10 +50,8 @@ register struct thread_info *__current_thread_info __asm__("$8"); | ||||
| #define current_thread_info()  __current_thread_info | ||||
| 
 | ||||
| /* Thread information allocation.  */ | ||||
| #define THREAD_SIZE_ORDER 1 | ||||
| #define THREAD_SIZE (2*PAGE_SIZE) | ||||
| #define alloc_thread_info(tsk) \ | ||||
|   ((struct thread_info *) __get_free_pages(GFP_KERNEL,1)) | ||||
| #define free_thread_info(ti) free_pages((unsigned long) (ti), 1) | ||||
| 
 | ||||
| #endif /* __ASSEMBLY__ */ | ||||
| 
 | ||||
|  | ||||
| @ -97,19 +97,6 @@ static inline struct thread_info *current_thread_info(void) | ||||
| 	return (struct thread_info *)(sp & ~(THREAD_SIZE - 1)); | ||||
| } | ||||
| 
 | ||||
| /* thread information allocation */ | ||||
| #ifdef CONFIG_DEBUG_STACK_USAGE | ||||
| #define alloc_thread_info(tsk) \ | ||||
| 	((struct thread_info *)__get_free_pages(GFP_KERNEL | __GFP_ZERO, \ | ||||
| 		THREAD_SIZE_ORDER)) | ||||
| #else | ||||
| #define alloc_thread_info(tsk) \ | ||||
| 	((struct thread_info *)__get_free_pages(GFP_KERNEL, THREAD_SIZE_ORDER)) | ||||
| #endif | ||||
| 
 | ||||
| #define free_thread_info(info) \ | ||||
| 	free_pages((unsigned long)info, THREAD_SIZE_ORDER); | ||||
| 
 | ||||
| #define thread_saved_pc(tsk)	\ | ||||
| 	((unsigned long)(pc_pointer(task_thread_info(tsk)->cpu_context.pc))) | ||||
| #define thread_saved_fp(tsk)	\ | ||||
|  | ||||
| @ -61,10 +61,6 @@ static inline struct thread_info *current_thread_info(void) | ||||
| 	return (struct thread_info *)addr; | ||||
| } | ||||
| 
 | ||||
| /* thread information allocation */ | ||||
| #define alloc_thread_info(ti) \ | ||||
| 	((struct thread_info *) __get_free_pages(GFP_KERNEL, THREAD_SIZE_ORDER)) | ||||
| #define free_thread_info(ti) free_pages((unsigned long)(ti), 1) | ||||
| #define get_thread_info(ti) get_task_struct((ti)->task) | ||||
| #define put_thread_info(ti) put_task_struct((ti)->task) | ||||
| 
 | ||||
|  | ||||
| @ -42,6 +42,7 @@ | ||||
| /*
 | ||||
|  * Size of kernel stack for each process. This must be a power of 2... | ||||
|  */ | ||||
| #define THREAD_SIZE_ORDER	1 | ||||
| #define THREAD_SIZE		8192	/* 2 pages */ | ||||
| 
 | ||||
| #ifndef __ASSEMBLY__ | ||||
| @ -94,10 +95,6 @@ static inline struct thread_info *current_thread_info(void) | ||||
| 	return (struct thread_info *)((long)ti & ~((long)THREAD_SIZE-1)); | ||||
| } | ||||
| 
 | ||||
| /* thread information allocation */ | ||||
| #define alloc_thread_info(tsk) ((struct thread_info *) \ | ||||
| 				__get_free_pages(GFP_KERNEL, 1)) | ||||
| #define free_thread_info(ti)	free_pages((unsigned long) (ti), 1) | ||||
| #endif				/* __ASSEMBLY__ */ | ||||
| 
 | ||||
| /*
 | ||||
|  | ||||
| @ -11,6 +11,8 @@ | ||||
| 
 | ||||
| #ifdef __KERNEL__ | ||||
| 
 | ||||
| #define __HAVE_ARCH_THREAD_INFO_ALLOCATOR | ||||
| 
 | ||||
| #ifndef __ASSEMBLY__ | ||||
| #include <asm/types.h> | ||||
| #include <asm/processor.h> | ||||
|  | ||||
| @ -82,6 +82,8 @@ register struct thread_info *__current_thread_info asm("gr15"); | ||||
| 
 | ||||
| #define current_thread_info() ({ __current_thread_info; }) | ||||
| 
 | ||||
| #define __HAVE_ARCH_THREAD_INFO_ALLOCATOR | ||||
| 
 | ||||
| /* thread information allocation */ | ||||
| #ifdef CONFIG_DEBUG_STACK_USAGE | ||||
| #define alloc_thread_info(tsk)					\ | ||||
|  | ||||
| @ -49,6 +49,7 @@ struct thread_info { | ||||
| /*
 | ||||
|  * Size of kernel stack for each process. This must be a power of 2... | ||||
|  */ | ||||
| #define THREAD_SIZE_ORDER	1 | ||||
| #define THREAD_SIZE		8192	/* 2 pages */ | ||||
| 
 | ||||
| 
 | ||||
| @ -65,10 +66,6 @@ static inline struct thread_info *current_thread_info(void) | ||||
| 	return ti; | ||||
| } | ||||
| 
 | ||||
| /* thread information allocation */ | ||||
| #define alloc_thread_info(tsk) ((struct thread_info *) \ | ||||
| 				__get_free_pages(GFP_KERNEL, 1)) | ||||
| #define free_thread_info(ti)	free_pages((unsigned long) (ti), 1) | ||||
| #endif /* __ASSEMBLY__ */ | ||||
| 
 | ||||
| /*
 | ||||
|  | ||||
| @ -54,6 +54,8 @@ struct thread_info { | ||||
| 	},					\ | ||||
| } | ||||
| 
 | ||||
| #define __HAVE_ARCH_THREAD_INFO_ALLOCATOR | ||||
| 
 | ||||
| #ifndef ASM_OFFSETS_C | ||||
| /* how to get the thread information struct from C */ | ||||
| #define current_thread_info()	((struct thread_info *) ((char *) current + IA64_TASK_SIZE)) | ||||
|  | ||||
| @ -94,6 +94,8 @@ static inline struct thread_info *current_thread_info(void) | ||||
| 	return ti; | ||||
| } | ||||
| 
 | ||||
| #define __HAVE_ARCH_THREAD_INFO_ALLOCATOR | ||||
| 
 | ||||
| /* thread information allocation */ | ||||
| #ifdef CONFIG_DEBUG_STACK_USAGE | ||||
| #define alloc_thread_info(tsk)					\ | ||||
|  | ||||
| @ -25,13 +25,7 @@ struct thread_info { | ||||
| } | ||||
| 
 | ||||
| /* THREAD_SIZE should be 8k, so handle differently for 4k and 8k machines */ | ||||
| #if PAGE_SHIFT == 13 /* 8k machines */ | ||||
| #define alloc_thread_info(tsk)   ((struct thread_info *)__get_free_pages(GFP_KERNEL,0)) | ||||
| #define free_thread_info(ti)  free_pages((unsigned long)(ti),0) | ||||
| #else /* otherwise assume 4k pages */ | ||||
| #define alloc_thread_info(tsk)   ((struct thread_info *)__get_free_pages(GFP_KERNEL,1)) | ||||
| #define free_thread_info(ti)  free_pages((unsigned long)(ti),1) | ||||
| #endif /* PAGE_SHIFT == 13 */ | ||||
| #define THREAD_SIZE_ORDER (13 - PAGE_SHIFT) | ||||
| 
 | ||||
| #define init_thread_info	(init_task.thread.info) | ||||
| #define init_stack		(init_thread_union.stack) | ||||
|  | ||||
| @ -71,10 +71,6 @@ static inline struct thread_info *current_thread_info(void) | ||||
| 	return ti; | ||||
| } | ||||
| 
 | ||||
| /* thread information allocation */ | ||||
| #define alloc_thread_info(tsk) ((struct thread_info *) \ | ||||
| 				__get_free_pages(GFP_KERNEL, THREAD_SIZE_ORDER)) | ||||
| #define free_thread_info(ti)	free_pages((unsigned long) (ti), THREAD_SIZE_ORDER) | ||||
| #endif /* __ASSEMBLY__ */ | ||||
| 
 | ||||
| #define	PREEMPT_ACTIVE	0x4000000 | ||||
|  | ||||
| @ -82,6 +82,8 @@ register struct thread_info *__current_thread_info __asm__("$28"); | ||||
| #define THREAD_SIZE (PAGE_SIZE << THREAD_SIZE_ORDER) | ||||
| #define THREAD_MASK (THREAD_SIZE - 1UL) | ||||
| 
 | ||||
| #define __HAVE_ARCH_THREAD_INFO_ALLOCATOR | ||||
| 
 | ||||
| #ifdef CONFIG_DEBUG_STACK_USAGE | ||||
| #define alloc_thread_info(tsk)					\ | ||||
| ({								\ | ||||
|  | ||||
| @ -112,6 +112,8 @@ static inline unsigned long current_stack_pointer(void) | ||||
| 	return sp; | ||||
| } | ||||
| 
 | ||||
| #define __HAVE_ARCH_THREAD_INFO_ALLOCATOR | ||||
| 
 | ||||
| /* thread information allocation */ | ||||
| #ifdef CONFIG_DEBUG_STACK_USAGE | ||||
| #define alloc_thread_info(tsk) kzalloc(THREAD_SIZE, GFP_KERNEL) | ||||
|  | ||||
| @ -34,15 +34,11 @@ struct thread_info { | ||||
| 
 | ||||
| /* thread information allocation */ | ||||
| 
 | ||||
| #define THREAD_ORDER            2 | ||||
| #define THREAD_SIZE_ORDER            2 | ||||
| /* Be sure to hunt all references to this down when you change the size of
 | ||||
|  * the kernel stack */ | ||||
| #define THREAD_SIZE             (PAGE_SIZE << THREAD_ORDER) | ||||
| #define THREAD_SHIFT            (PAGE_SHIFT + THREAD_ORDER) | ||||
| 
 | ||||
| #define alloc_thread_info(tsk) ((struct thread_info *) \ | ||||
| 			__get_free_pages(GFP_KERNEL, THREAD_ORDER)) | ||||
| #define free_thread_info(ti)    free_pages((unsigned long) (ti), THREAD_ORDER) | ||||
| #define THREAD_SIZE             (PAGE_SIZE << THREAD_SIZE_ORDER) | ||||
| #define THREAD_SHIFT            (PAGE_SHIFT + THREAD_SIZE_ORDER) | ||||
| 
 | ||||
| /* how to get the thread information struct from C */ | ||||
| #define current_thread_info()	((struct thread_info *)mfctl(30)) | ||||
|  | ||||
| @ -66,20 +66,12 @@ struct thread_info { | ||||
| 
 | ||||
| #if THREAD_SHIFT >= PAGE_SHIFT | ||||
| 
 | ||||
| #define THREAD_ORDER	(THREAD_SHIFT - PAGE_SHIFT) | ||||
| 
 | ||||
| #ifdef CONFIG_DEBUG_STACK_USAGE | ||||
| #define alloc_thread_info(tsk)	\ | ||||
| 	((struct thread_info *)__get_free_pages(GFP_KERNEL | \ | ||||
| 		__GFP_ZERO, THREAD_ORDER)) | ||||
| #else | ||||
| #define alloc_thread_info(tsk)	\ | ||||
| 	((struct thread_info *)__get_free_pages(GFP_KERNEL, THREAD_ORDER)) | ||||
| #endif | ||||
| #define free_thread_info(ti)	free_pages((unsigned long)ti, THREAD_ORDER) | ||||
| #define THREAD_SIZE_ORDER	(THREAD_SHIFT - PAGE_SHIFT) | ||||
| 
 | ||||
| #else /* THREAD_SHIFT < PAGE_SHIFT */ | ||||
| 
 | ||||
| #define __HAVE_ARCH_THREAD_INFO_ALLOCATOR | ||||
| 
 | ||||
| extern struct thread_info *alloc_thread_info(struct task_struct *tsk); | ||||
| extern void free_thread_info(struct thread_info *ti); | ||||
| 
 | ||||
|  | ||||
| @ -78,10 +78,7 @@ static inline struct thread_info *current_thread_info(void) | ||||
| 	return (struct thread_info *)((*(unsigned long *) __LC_KERNEL_STACK)-THREAD_SIZE); | ||||
| } | ||||
| 
 | ||||
| /* thread information allocation */ | ||||
| #define alloc_thread_info(tsk) ((struct thread_info *) \ | ||||
| 	__get_free_pages(GFP_KERNEL,THREAD_ORDER)) | ||||
| #define free_thread_info(ti) free_pages((unsigned long) (ti),THREAD_ORDER) | ||||
| #define THREAD_SIZE_ORDER THREAD_ORDER | ||||
| 
 | ||||
| #endif | ||||
| 
 | ||||
|  | ||||
| @ -92,6 +92,8 @@ static inline struct thread_info *current_thread_info(void) | ||||
| 	return ti; | ||||
| } | ||||
| 
 | ||||
| #define __HAVE_ARCH_THREAD_INFO_ALLOCATOR | ||||
| 
 | ||||
| /* thread information allocation */ | ||||
| #ifdef CONFIG_DEBUG_STACK_USAGE | ||||
| #define alloc_thread_info(ti)	kzalloc(THREAD_SIZE, GFP_KERNEL) | ||||
|  | ||||
| @ -86,6 +86,8 @@ register struct thread_info *current_thread_info_reg asm("g6"); | ||||
| #define THREAD_INFO_ORDER  1 | ||||
| #endif | ||||
| 
 | ||||
| #define __HAVE_ARCH_THREAD_INFO_ALLOCATOR | ||||
| 
 | ||||
| BTFIXUPDEF_CALL(struct thread_info *, alloc_thread_info, void) | ||||
| #define alloc_thread_info(tsk) BTFIXUP_CALL(alloc_thread_info)() | ||||
| 
 | ||||
|  | ||||
| @ -155,6 +155,8 @@ register struct thread_info *current_thread_info_reg asm("g6"); | ||||
| #define __THREAD_INFO_ORDER	0 | ||||
| #endif /* PAGE_SHIFT == 13 */ | ||||
| 
 | ||||
| #define __HAVE_ARCH_THREAD_INFO_ALLOCATOR | ||||
| 
 | ||||
| #ifdef CONFIG_DEBUG_STACK_USAGE | ||||
| #define alloc_thread_info(tsk)					\ | ||||
| ({								\ | ||||
|  | ||||
| @ -53,21 +53,7 @@ static inline struct thread_info *current_thread_info(void) | ||||
| 	return ti; | ||||
| } | ||||
| 
 | ||||
| #ifdef CONFIG_DEBUG_STACK_USAGE | ||||
| 
 | ||||
| #define alloc_thread_info(tsk) \ | ||||
| 	((struct thread_info *) __get_free_pages(GFP_KERNEL | __GFP_ZERO, \ | ||||
| 						 CONFIG_KERNEL_STACK_ORDER)) | ||||
| #else | ||||
| 
 | ||||
| /* thread information allocation */ | ||||
| #define alloc_thread_info(tsk) \ | ||||
| 	((struct thread_info *) __get_free_pages(GFP_KERNEL, \ | ||||
| 						 CONFIG_KERNEL_STACK_ORDER)) | ||||
| #endif | ||||
| 
 | ||||
| #define free_thread_info(ti) \ | ||||
| 	free_pages((unsigned long)(ti),CONFIG_KERNEL_STACK_ORDER) | ||||
| #define THREAD_SIZE_ORDER CONFIG_KERNEL_STACK_ORDER | ||||
| 
 | ||||
| #endif | ||||
| 
 | ||||
|  | ||||
| @ -152,6 +152,8 @@ struct thread_info { | ||||
| #define THREAD_FLAGS GFP_KERNEL | ||||
| #endif | ||||
| 
 | ||||
| #define __HAVE_ARCH_THREAD_INFO_ALLOCATOR | ||||
| 
 | ||||
| #define alloc_thread_info(tsk)						\ | ||||
| 	((struct thread_info *)__get_free_pages(THREAD_FLAGS, THREAD_ORDER)) | ||||
| 
 | ||||
|  | ||||
| @ -111,10 +111,6 @@ static inline struct thread_info *current_thread_info(void) | ||||
| 	return ti; | ||||
| } | ||||
| 
 | ||||
| /* thread information allocation */ | ||||
| #define alloc_thread_info(tsk) ((struct thread_info *) __get_free_pages(GFP_KERNEL,1)) | ||||
| #define free_thread_info(ti) free_pages((unsigned long) (ti), 1) | ||||
| 
 | ||||
| #else /* !__ASSEMBLY__ */ | ||||
| 
 | ||||
| /* how to get the thread information struct from ASM */ | ||||
| @ -160,6 +156,7 @@ static inline struct thread_info *current_thread_info(void) | ||||
| #define TS_USEDFPU		0x0001	/* FPU was used by this task this quantum (SMP) */ | ||||
| 
 | ||||
| #define THREAD_SIZE 8192	//(2*PAGE_SIZE)
 | ||||
| #define THREAD_SIZE_ORDER 1 | ||||
| 
 | ||||
| #endif	/* __KERNEL__ */ | ||||
| #endif	/* _XTENSA_THREAD_INFO */ | ||||
|  | ||||
| @ -93,6 +93,23 @@ int nr_processes(void) | ||||
| static struct kmem_cache *task_struct_cachep; | ||||
| #endif | ||||
| 
 | ||||
| #ifndef __HAVE_ARCH_THREAD_INFO_ALLOCATOR | ||||
| static inline struct thread_info *alloc_thread_info(struct task_struct *tsk) | ||||
| { | ||||
| #ifdef CONFIG_DEBUG_STACK_USAGE | ||||
| 	gfp_t mask = GFP_KERNEL | __GFP_ZERO; | ||||
| #else | ||||
| 	gfp_t mask = GFP_KERNEL; | ||||
| #endif | ||||
| 	return (struct thread_info *)__get_free_pages(mask, THREAD_SIZE_ORDER); | ||||
| } | ||||
| 
 | ||||
| static inline void free_thread_info(struct thread_info *ti) | ||||
| { | ||||
| 	free_pages((unsigned long)ti, THREAD_SIZE_ORDER); | ||||
| } | ||||
| #endif | ||||
| 
 | ||||
| /* SLAB cache for signal_struct structures (tsk->signal) */ | ||||
| static struct kmem_cache *signal_cachep; | ||||
| 
 | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user