Commit c6f5e0ac authored by Brian Gerst's avatar Brian Gerst Committed by Tejun Heo
Browse files

x86-64: Move current task from PDA to per-cpu and consolidate with 32-bit.



Signed-off-by: default avatarBrian Gerst <brgerst@gmail.com>
Signed-off-by: default avatarTejun Heo <tj@kernel.org>
parent ea927906
Loading
Loading
Loading
Loading
+3 −21
Original line number Diff line number Diff line
#ifndef _ASM_X86_CURRENT_H
#define _ASM_X86_CURRENT_H

#ifdef CONFIG_X86_32
#include <linux/compiler.h>
#include <asm/percpu.h>

#ifndef __ASSEMBLY__
struct task_struct;

DECLARE_PER_CPU(struct task_struct *, current_task);
static __always_inline struct task_struct *get_current(void)
{
	return percpu_read(current_task);
}

#else /* X86_32 */

#ifndef __ASSEMBLY__
#include <asm/pda.h>

struct task_struct;

static __always_inline struct task_struct *get_current(void)
{
	return read_pda(pcurrent);
	return percpu_read(current_task);
}

#else /* __ASSEMBLY__ */

#include <asm/asm-offsets.h>
#define GET_CURRENT(reg) movq %gs:(pda_pcurrent),reg
#define current get_current()

#endif /* __ASSEMBLY__ */

#endif /* X86_32 */

#define current get_current()

#endif /* _ASM_X86_CURRENT_H */
+2 −2
Original line number Diff line number Diff line
@@ -11,8 +11,8 @@

/* Per processor datastructure. %gs points to it while the kernel runs */
struct x8664_pda {
	struct task_struct *pcurrent;	/* 0  Current process */
	unsigned long dummy;
	unsigned long unused1;
	unsigned long unused2;
	unsigned long kernelstack;	/* 16 top of kernel stack for current */
	unsigned long oldrsp;		/* 24 user rsp for system call */
	int irqcount;			/* 32 Irq nesting counter. Starts -1 */
+2 −2
Original line number Diff line number Diff line
@@ -94,7 +94,7 @@ do { \
	     "call __switch_to\n\t"					  \
	     ".globl thread_return\n"					  \
	     "thread_return:\n\t"					  \
	     "movq %%gs:%P[pda_pcurrent],%%rsi\n\t"			  \
	     "movq "__percpu_seg_str"%P[current_task],%%rsi\n\t"	  \
	     "movq %P[thread_info](%%rsi),%%r8\n\t"			  \
	     LOCK_PREFIX "btr  %[tif_fork],%P[ti_flags](%%r8)\n\t"	  \
	     "movq %%rax,%%rdi\n\t" 					  \
@@ -106,7 +106,7 @@ do { \
	       [ti_flags] "i" (offsetof(struct thread_info, flags)),	  \
	       [tif_fork] "i" (TIF_FORK),			  	  \
	       [thread_info] "i" (offsetof(struct task_struct, stack)),   \
	       [pda_pcurrent] "i" (offsetof(struct x8664_pda, pcurrent))  \
	       [current_task] "m" (per_cpu_var(current_task))		  \
	     : "memory", "cc" __EXTRA_CLOBBER)
#endif

+0 −1
Original line number Diff line number Diff line
@@ -51,7 +51,6 @@ int main(void)
#define ENTRY(entry) DEFINE(pda_ ## entry, offsetof(struct x8664_pda, entry))
	ENTRY(kernelstack); 
	ENTRY(oldrsp); 
	ENTRY(pcurrent); 
	ENTRY(irqcount);
	DEFINE(pda_size, sizeof(struct x8664_pda));
	BLANK();
+1 −4
Original line number Diff line number Diff line
@@ -903,10 +903,7 @@ void __cpuinit pda_init(int cpu)
	pda->kernelstack = (unsigned long)stack_thread_info() -
				 PDA_STACKOFFSET + THREAD_SIZE;

	if (cpu == 0) {
		/* others are initialized in smpboot.c */
		pda->pcurrent = &init_task;
	} else {
	if (cpu != 0) {
		if (pda->nodenumber == 0 && cpu_to_node(cpu) != NUMA_NO_NODE)
			pda->nodenumber = cpu_to_node(cpu);
	}
Loading