mirror of https://gitee.com/openkylin/linux.git
x86: Use common threadinfo allocator
The only difference is the free_thread_info function, which frees xstate. Use the new arch_release_task_struct() function instead and switch over to the core allocator. Signed-off-by: Thomas Gleixner <tglx@linutronix.de> Link: http://lkml.kernel.org/r/20120505150141.559556763@linutronix.de Cc: x86@kernel.org
This commit is contained in:
parent
7b8fe0570a
commit
38e7c572ce
|
@ -19,7 +19,7 @@
|
||||||
#ifdef CONFIG_X86_64
|
#ifdef CONFIG_X86_64
|
||||||
#define MIN_KERNEL_ALIGN_LG2 PMD_SHIFT
|
#define MIN_KERNEL_ALIGN_LG2 PMD_SHIFT
|
||||||
#else
|
#else
|
||||||
#define MIN_KERNEL_ALIGN_LG2 (PAGE_SHIFT + THREAD_ORDER)
|
#define MIN_KERNEL_ALIGN_LG2 (PAGE_SHIFT + THREAD_SIZE_ORDER)
|
||||||
#endif
|
#endif
|
||||||
#define MIN_KERNEL_ALIGN (_AC(1, UL) << MIN_KERNEL_ALIGN_LG2)
|
#define MIN_KERNEL_ALIGN (_AC(1, UL) << MIN_KERNEL_ALIGN_LG2)
|
||||||
|
|
||||||
|
|
|
@ -15,8 +15,8 @@
|
||||||
*/
|
*/
|
||||||
#define __PAGE_OFFSET _AC(CONFIG_PAGE_OFFSET, UL)
|
#define __PAGE_OFFSET _AC(CONFIG_PAGE_OFFSET, UL)
|
||||||
|
|
||||||
#define THREAD_ORDER 1
|
#define THREAD_SIZE_ORDER 1
|
||||||
#define THREAD_SIZE (PAGE_SIZE << THREAD_ORDER)
|
#define THREAD_SIZE (PAGE_SIZE << THREAD_SIZE_ORDER)
|
||||||
|
|
||||||
#define STACKFAULT_STACK 0
|
#define STACKFAULT_STACK 0
|
||||||
#define DOUBLEFAULT_STACK 1
|
#define DOUBLEFAULT_STACK 1
|
||||||
|
|
|
@ -1,8 +1,8 @@
|
||||||
#ifndef _ASM_X86_PAGE_64_DEFS_H
|
#ifndef _ASM_X86_PAGE_64_DEFS_H
|
||||||
#define _ASM_X86_PAGE_64_DEFS_H
|
#define _ASM_X86_PAGE_64_DEFS_H
|
||||||
|
|
||||||
#define THREAD_ORDER 1
|
#define THREAD_SIZE_ORDER 1
|
||||||
#define THREAD_SIZE (PAGE_SIZE << THREAD_ORDER)
|
#define THREAD_SIZE (PAGE_SIZE << THREAD_SIZE_ORDER)
|
||||||
#define CURRENT_MASK (~(THREAD_SIZE - 1))
|
#define CURRENT_MASK (~(THREAD_SIZE - 1))
|
||||||
|
|
||||||
#define EXCEPTION_STACK_ORDER 0
|
#define EXCEPTION_STACK_ORDER 0
|
||||||
|
|
|
@ -155,24 +155,6 @@ struct thread_info {
|
||||||
|
|
||||||
#define PREEMPT_ACTIVE 0x10000000
|
#define PREEMPT_ACTIVE 0x10000000
|
||||||
|
|
||||||
/* thread information allocation */
|
|
||||||
#ifdef CONFIG_DEBUG_STACK_USAGE
|
|
||||||
#define THREAD_FLAGS (GFP_KERNEL | __GFP_NOTRACK | __GFP_ZERO)
|
|
||||||
#else
|
|
||||||
#define THREAD_FLAGS (GFP_KERNEL | __GFP_NOTRACK)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#define __HAVE_ARCH_THREAD_INFO_ALLOCATOR
|
|
||||||
|
|
||||||
#define alloc_thread_info_node(tsk, node) \
|
|
||||||
({ \
|
|
||||||
struct page *page = alloc_pages_node(node, THREAD_FLAGS, \
|
|
||||||
THREAD_ORDER); \
|
|
||||||
struct thread_info *ret = page ? page_address(page) : NULL; \
|
|
||||||
\
|
|
||||||
ret; \
|
|
||||||
})
|
|
||||||
|
|
||||||
#ifdef CONFIG_X86_32
|
#ifdef CONFIG_X86_32
|
||||||
|
|
||||||
#define STACK_WARN (THREAD_SIZE/8)
|
#define STACK_WARN (THREAD_SIZE/8)
|
||||||
|
@ -282,7 +264,7 @@ static inline bool is_ia32_task(void)
|
||||||
|
|
||||||
#ifndef __ASSEMBLY__
|
#ifndef __ASSEMBLY__
|
||||||
extern void arch_task_cache_init(void);
|
extern void arch_task_cache_init(void);
|
||||||
extern void free_thread_info(struct thread_info *ti);
|
|
||||||
extern int arch_dup_task_struct(struct task_struct *dst, struct task_struct *src);
|
extern int arch_dup_task_struct(struct task_struct *dst, struct task_struct *src);
|
||||||
|
extern void arch_release_task_struct(struct task_struct *tsk);
|
||||||
#endif
|
#endif
|
||||||
#endif /* _ASM_X86_THREAD_INFO_H */
|
#endif /* _ASM_X86_THREAD_INFO_H */
|
||||||
|
|
|
@ -127,8 +127,8 @@ void __cpuinit irq_ctx_init(int cpu)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
irqctx = page_address(alloc_pages_node(cpu_to_node(cpu),
|
irqctx = page_address(alloc_pages_node(cpu_to_node(cpu),
|
||||||
THREAD_FLAGS,
|
THREADINFO_GFP,
|
||||||
THREAD_ORDER));
|
THREAD_SIZE_ORDER));
|
||||||
memset(&irqctx->tinfo, 0, sizeof(struct thread_info));
|
memset(&irqctx->tinfo, 0, sizeof(struct thread_info));
|
||||||
irqctx->tinfo.cpu = cpu;
|
irqctx->tinfo.cpu = cpu;
|
||||||
irqctx->tinfo.preempt_count = HARDIRQ_OFFSET;
|
irqctx->tinfo.preempt_count = HARDIRQ_OFFSET;
|
||||||
|
@ -137,8 +137,8 @@ void __cpuinit irq_ctx_init(int cpu)
|
||||||
per_cpu(hardirq_ctx, cpu) = irqctx;
|
per_cpu(hardirq_ctx, cpu) = irqctx;
|
||||||
|
|
||||||
irqctx = page_address(alloc_pages_node(cpu_to_node(cpu),
|
irqctx = page_address(alloc_pages_node(cpu_to_node(cpu),
|
||||||
THREAD_FLAGS,
|
THREADINFO_GFP,
|
||||||
THREAD_ORDER));
|
THREAD_SIZE_ORDER));
|
||||||
memset(&irqctx->tinfo, 0, sizeof(struct thread_info));
|
memset(&irqctx->tinfo, 0, sizeof(struct thread_info));
|
||||||
irqctx->tinfo.cpu = cpu;
|
irqctx->tinfo.cpu = cpu;
|
||||||
irqctx->tinfo.addr_limit = MAKE_MM_SEG(0);
|
irqctx->tinfo.addr_limit = MAKE_MM_SEG(0);
|
||||||
|
|
|
@ -76,10 +76,9 @@ void free_thread_xstate(struct task_struct *tsk)
|
||||||
fpu_free(&tsk->thread.fpu);
|
fpu_free(&tsk->thread.fpu);
|
||||||
}
|
}
|
||||||
|
|
||||||
void free_thread_info(struct thread_info *ti)
|
void arch_release_task_struct(struct task_struct *tsk)
|
||||||
{
|
{
|
||||||
free_thread_xstate(ti->task);
|
free_thread_xstate(tsk);
|
||||||
free_pages((unsigned long)ti, THREAD_ORDER);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void arch_task_cache_init(void)
|
void arch_task_cache_init(void)
|
||||||
|
|
Loading…
Reference in New Issue