diff options
author | Jeremy Fitzhardinge <jeremy@goop.org> | 2007-05-02 13:27:16 -0400 |
---|---|---|
committer | Andi Kleen <andi@basil.nowhere.org> | 2007-05-02 13:27:16 -0400 |
commit | 7c3576d261ce046789a7db14f43303f8120910c7 (patch) | |
tree | ad27a8459bbcdb183fe2411aec3b840942992ad5 /arch/i386/kernel/vmi.c | |
parent | 7a61d35d4b4056e7711031202da7605e052f4137 (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.c | 6 |
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 |
507 | extern void setup_pda(void); | ||
508 | |||
509 | static void __devinit | 507 | static void __devinit |
510 | vmi_startup_ipi_hook(int phys_apicid, unsigned long start_eip, | 508 | vmi_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) { |