aboutsummaryrefslogtreecommitdiffstats
path: root/arch/i386/kernel/vmi.c
diff options
context:
space:
mode:
authorJeremy Fitzhardinge <jeremy@goop.org>2007-05-02 13:27:16 -0400
committerAndi Kleen <andi@basil.nowhere.org>2007-05-02 13:27:16 -0400
commit7c3576d261ce046789a7db14f43303f8120910c7 (patch)
treead27a8459bbcdb183fe2411aec3b840942992ad5 /arch/i386/kernel/vmi.c
parent7a61d35d4b4056e7711031202da7605e052f4137 (diff)
[PATCH] i386: Convert PDA into the percpu section
Currently x86 (similar to x84-64) has a special per-cpu structure called "i386_pda" which can be easily and efficiently referenced via the %fs register. An ELF section is more flexible than a structure, allowing any piece of code to use this area. Indeed, such a section already exists: the per-cpu area. So this patch: (1) Removes the PDA and uses per-cpu variables for each current member. (2) Replaces the __KERNEL_PDA segment with __KERNEL_PERCPU. (3) Creates a per-cpu mirror of __per_cpu_offset called this_cpu_off, which can be used to calculate addresses for this CPU's variables. (4) Simplifies startup, because %fs doesn't need to be loaded with a special segment at early boot; it can be deferred until the first percpu area is allocated (or never for UP). The result is less code and one less x86-specific concept. Signed-off-by: Rusty Russell <rusty@rustcorp.com.au> Signed-off-by: Jeremy Fitzhardinge <jeremy@xensource.com> Signed-off-by: Andi Kleen <ak@suse.de> Cc: Andi Kleen <ak@suse.de>
Diffstat (limited to 'arch/i386/kernel/vmi.c')
-rw-r--r--arch/i386/kernel/vmi.c6
1 files changed, 1 insertions, 5 deletions
diff --git a/arch/i386/kernel/vmi.c b/arch/i386/kernel/vmi.c
index ccad7ee960aa..12312988c626 100644
--- a/arch/i386/kernel/vmi.c
+++ b/arch/i386/kernel/vmi.c
@@ -504,8 +504,6 @@ static void vmi_pmd_clear(pmd_t *pmd)
504#endif 504#endif
505 505
506#ifdef CONFIG_SMP 506#ifdef CONFIG_SMP
507extern void setup_pda(void);
508
509static void __devinit 507static void __devinit
510vmi_startup_ipi_hook(int phys_apicid, unsigned long start_eip, 508vmi_startup_ipi_hook(int phys_apicid, unsigned long start_eip,
511 unsigned long start_esp) 509 unsigned long start_esp)
@@ -530,13 +528,11 @@ vmi_startup_ipi_hook(int phys_apicid, unsigned long start_eip,
530 528
531 ap.ds = __USER_DS; 529 ap.ds = __USER_DS;
532 ap.es = __USER_DS; 530 ap.es = __USER_DS;
533 ap.fs = __KERNEL_PDA; 531 ap.fs = __KERNEL_PERCPU;
534 ap.gs = 0; 532 ap.gs = 0;
535 533
536 ap.eflags = 0; 534 ap.eflags = 0;
537 535
538 setup_pda();
539
540#ifdef CONFIG_X86_PAE 536#ifdef CONFIG_X86_PAE
541 /* efer should match BSP efer. */ 537 /* efer should match BSP efer. */
542 if (cpu_has_nx) { 538 if (cpu_has_nx) {