From: Jeremy Fitzhardinge <jeremy@goop.org>
To: linux-kernel@vger.kernel.org
Cc: Chuck Ebbert <76306.1226@compuserve.com>,
Zachary Amsden <zach@vmware.com>,
Jan Beulich <jbeulich@novell.com>, Andi Kleen <ak@suse.de>,
Andrew Morton <akpm@osdl.org>
Subject: [PATCH RFC 6/6] Implement "current" with the PDA.
Date: Sun, 27 Aug 2006 01:44:23 -0700 [thread overview]
Message-ID: <20060827084453.452516832@goop.org> (raw)
In-Reply-To: <20060827084417.918992193@goop.org>
[-- Attachment #1: i386-pda-current.patch --]
[-- Type: text/plain, Size: 3774 bytes --]
Use the pcurrent field in the PDA to implement the "current" macro.
This ends up compiling down to a single instruction to get the current
task.
The slightly tricky part about this patch is that cpu_init() uses
current very early, before the PDA has been set up. In this instance,
it uses current_thread_info()->task to get the current task.
Also, the very early PDA set up for the boot cpu contains the initial
task pointer so current works from a very early stage.
Signed-off-by: Jeremy Fitzhardinge <jeremy@xensource.com>
Cc: Chuck Ebbert <76306.1226@compuserve.com>
Cc: Zachary Amsden <zach@vmware.com>
Cc: Jan Beulich <jbeulich@novell.com>
Cc: Andi Kleen <ak@suse.de>
--
arch/i386/kernel/cpu/common.c | 27 ++++++++++++++++-----------
include/asm-i386/current.h | 11 ++---------
2 files changed, 18 insertions(+), 20 deletions(-)
===================================================================
--- a/include/asm-i386/current.h
+++ b/include/asm-i386/current.h
@@ -1,15 +1,8 @@
#ifndef _I386_CURRENT_H
#define _I386_CURRENT_H
-#include <linux/thread_info.h>
+#include <asm/pda.h>
-struct task_struct;
-
-static __always_inline struct task_struct * get_current(void)
-{
- return current_thread_info()->task;
-}
-
-#define current get_current()
+#define current (read_pda(pcurrent))
#endif /* !(_I386_CURRENT_H) */
===================================================================
--- a/arch/i386/kernel/cpu/common.c
+++ b/arch/i386/kernel/cpu/common.c
@@ -587,16 +587,16 @@ void __init early_cpu_init(void)
#endif
}
-static __cpuinit void pda_init(int cpu)
+static __cpuinit void pda_init(int cpu, struct task_struct *curr)
{
struct i386_pda *pda = cpu_pda(cpu);
memset(pda, 0, sizeof(*pda));
pda->cpu_number = cpu;
- pda->pcurrent = current;
-
- printk("cpu %d current %p\n", cpu, current);
+ pda->pcurrent = curr;
+
+ printk("cpu %d current %p\n", cpu, curr);
}
struct pt_regs * __devinit idle_regs(struct pt_regs *regs)
@@ -609,7 +609,7 @@ struct pt_regs * __devinit idle_regs(str
/* Set up a very early PDA for the boot CPU so that smp_processor_id will work */
void __init smp_setup_processor_id(void)
{
- static const __initdata struct i386_pda boot_pda;
+ static __initdata struct i386_pda boot_pda;
pack_descriptor((u32 *)&cpu_gdt_table[GDT_ENTRY_PDA].a,
(u32 *)&cpu_gdt_table[GDT_ENTRY_PDA].b,
@@ -618,6 +618,8 @@ void __init smp_setup_processor_id(void)
/* Set %gs for this CPU's PDA */
asm volatile ("mov %0, %%gs" : : "r" (__KERNEL_PDA));
+
+ boot_pda.pcurrent = current_thread_info()->task;
}
/*
@@ -628,9 +630,12 @@ void __init smp_setup_processor_id(void)
*/
void __cpuinit cpu_init(void)
{
- int cpu = current_thread_info()->cpu; /* need to use this until the PDA is set up */
+ /* Need to use thread_info for cpu and current until the PDA is set up */
+ int cpu = current_thread_info()->cpu;
+ struct task_struct *curr = current_thread_info()->task;
+
struct tss_struct * t = &per_cpu(init_tss, cpu);
- struct thread_struct *thread = ¤t->thread;
+ struct thread_struct *thread = &curr->thread;
struct desc_struct *gdt;
struct i386_pda *pda;
__u32 stk16_off = (__u32)&per_cpu(cpu_16bit_stack, cpu);
@@ -702,7 +707,7 @@ old_gdt:
/* Set up the PDA in this CPU's GDT */
cpu_pda(cpu) = pda;
- pda_init(cpu);
+ pda_init(cpu, curr);
pack_descriptor((u32 *)&gdt[GDT_ENTRY_PDA].a,
(u32 *)&gdt[GDT_ENTRY_PDA].b,
@@ -716,10 +721,10 @@ old_gdt:
* Set up and load the per-CPU TSS and LDT
*/
atomic_inc(&init_mm.mm_count);
- current->active_mm = &init_mm;
- if (current->mm)
+ curr->active_mm = &init_mm;
+ if (curr->mm)
BUG();
- enter_lazy_tlb(&init_mm, current);
+ enter_lazy_tlb(&init_mm, curr);
load_esp0(t, thread);
set_tss_desc(cpu,t);
--
next prev parent reply other threads:[~2006-08-27 9:25 UTC|newest]
Thread overview: 35+ messages / expand[flat|nested] mbox.gz Atom feed top
2006-08-27 8:44 [PATCH RFC 0/6] Implement per-processor data areas for i386 Jeremy Fitzhardinge
2006-08-27 8:44 ` [PATCH RFC 1/6] Basic definitions for i386-pda Jeremy Fitzhardinge
2006-08-27 8:44 ` [PATCH RFC 2/6] Initialize the per-CPU data area Jeremy Fitzhardinge
2006-08-27 8:44 ` [PATCH RFC 3/6] Use %gs as the PDA base-segment in the kernel Jeremy Fitzhardinge
2006-08-27 9:49 ` Keith Owens
2006-08-27 10:01 ` Jeremy Fitzhardinge
2006-08-27 15:57 ` Andi Kleen
2006-08-27 16:36 ` Jeremy Fitzhardinge
2006-08-27 17:20 ` Jeremy Fitzhardinge
2006-08-27 18:19 ` Andi Kleen
2006-08-27 20:03 ` Jan Engelhardt
2006-08-27 23:38 ` Jeremy Fitzhardinge
2006-08-28 9:51 ` Jan Beulich
2006-08-28 14:54 ` H. J. Lu
2006-08-28 17:24 ` H. Peter Anvin
2006-08-27 8:44 ` [PATCH RFC 4/6] Fix places where using %gs changes the usermode ABI Jeremy Fitzhardinge
2006-08-27 15:59 ` Andi Kleen
2006-08-27 16:37 ` Jeremy Fitzhardinge
2006-08-27 8:44 ` [PATCH RFC 5/6] Implement smp_processor_id() with the PDA Jeremy Fitzhardinge
2006-08-27 8:44 ` Jeremy Fitzhardinge [this message]
2006-08-27 16:01 ` [PATCH RFC 6/6] Implement "current" " Andi Kleen
2006-08-27 16:38 ` Jeremy Fitzhardinge
2006-08-27 9:47 ` [PATCH RFC 0/6] Implement per-processor data areas for i386 Arjan van de Ven
2006-08-27 16:46 ` Jeremy Fitzhardinge
2006-08-27 17:44 ` Arjan van de Ven
2006-08-27 18:07 ` Andi Kleen
2006-08-27 18:27 ` Jeremy Fitzhardinge
2006-08-27 16:01 ` Andi Kleen
2006-08-27 16:41 ` Jeremy Fitzhardinge
2006-08-27 17:21 ` Andreas Mohr
2006-08-27 17:34 ` Jeremy Fitzhardinge
2006-08-27 18:23 ` Andreas Mohr
2006-08-27 18:04 ` Andi Kleen
2006-08-27 18:27 ` Andreas Mohr
2006-08-27 18:35 ` Andi Kleen
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20060827084453.452516832@goop.org \
--to=jeremy@goop.org \
--cc=76306.1226@compuserve.com \
--cc=ak@suse.de \
--cc=akpm@osdl.org \
--cc=jbeulich@novell.com \
--cc=linux-kernel@vger.kernel.org \
--cc=zach@vmware.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
Powered by JetHome