[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Xen-changelog] Eliminate tss - tss is meaningless in a paravirtualized kernel



# HG changeset patch
# User cl349@xxxxxxxxxxxxxxxxxxxx
# Node ID 82f6786a0aa866ae6eecd1d4184c0df30b2c0543
# Parent  f0a8a0a9a6f52dc78b5bd7a0a7e959ff15b78a8c
Eliminate tss - tss is meaningless in a paravirtualized kernel
and consumes 25% of the per-cpu area.
Add CONFIG_X86_NO_TSS to exclude all code which references tss.

Based on a patch by Jan Beulich <JBeulich@xxxxxxxxxx>
Signed-off-by: Christian Limpach <Christian.Limpach@xxxxxxxxxxxx>

diff -r f0a8a0a9a6f5 -r 82f6786a0aa8 linux-2.6-xen-sparse/arch/x86_64/Kconfig
--- a/linux-2.6-xen-sparse/arch/x86_64/Kconfig  Mon Feb 20 14:51:50 2006
+++ b/linux-2.6-xen-sparse/arch/x86_64/Kconfig  Mon Feb 20 15:15:10 2006
@@ -124,6 +124,11 @@
        select SWIOTLB
        help
          This option will compile a kernel compatible with Xen hypervisor
+
+config X86_NO_TSS
+       bool
+       depends on X86_64_XEN
+       default y
 
 #
 # Define implied options from the CPU selection here
diff -r f0a8a0a9a6f5 -r 82f6786a0aa8 
linux-2.6-xen-sparse/arch/x86_64/kernel/asm-offsets.c
--- a/linux-2.6-xen-sparse/arch/x86_64/kernel/asm-offsets.c     Mon Feb 20 
14:51:50 2006
+++ b/linux-2.6-xen-sparse/arch/x86_64/kernel/asm-offsets.c     Mon Feb 20 
15:15:10 2006
@@ -66,7 +66,9 @@
        DEFINE(pbe_address, offsetof(struct pbe, address));
        DEFINE(pbe_orig_address, offsetof(struct pbe, orig_address));
        DEFINE(pbe_next, offsetof(struct pbe, next));
+#ifndef CONFIG_X86_NO_TSS
        BLANK();
        DEFINE(TSS_ist, offsetof(struct tss_struct, ist));
+#endif
        return 0;
 }
diff -r f0a8a0a9a6f5 -r 82f6786a0aa8 
linux-2.6-xen-sparse/arch/x86_64/kernel/init_task.c
--- a/linux-2.6-xen-sparse/arch/x86_64/kernel/init_task.c       Mon Feb 20 
14:51:50 2006
+++ b/linux-2.6-xen-sparse/arch/x86_64/kernel/init_task.c       Mon Feb 20 
15:15:10 2006
@@ -37,6 +37,8 @@
 struct task_struct init_task = INIT_TASK(init_task);
 
 EXPORT_SYMBOL(init_task);
+
+#ifndef CONFIG_X86_NO_TSS
 /*
  * per-CPU TSS segments. Threads are completely 'soft' on Linux,
  * no more per-task TSS's. The TSS size is kept cacheline-aligned
@@ -45,5 +47,6 @@
  * on exact cacheline boundaries, to eliminate cacheline ping-pong.
  */ 
 DEFINE_PER_CPU(struct tss_struct, init_tss) 
____cacheline_internodealigned_in_smp = INIT_TSS;
+#endif
 
 #define ALIGN_TO_4K __attribute__((section(".data.init_task")))
diff -r f0a8a0a9a6f5 -r 82f6786a0aa8 
linux-2.6-xen-sparse/arch/x86_64/kernel/process-xen.c
--- a/linux-2.6-xen-sparse/arch/x86_64/kernel/process-xen.c     Mon Feb 20 
14:51:50 2006
+++ b/linux-2.6-xen-sparse/arch/x86_64/kernel/process-xen.c     Mon Feb 20 
15:15:10 2006
@@ -289,16 +289,28 @@
        kprobe_flush_task(me);
 
        if (me->thread.io_bitmap_ptr) { 
+#ifndef CONFIG_X86_NO_TSS
                struct tss_struct *tss = &per_cpu(init_tss, get_cpu());
+#endif
+#ifdef CONFIG_XEN
+               static physdev_op_t iobmp_op = {
+                       .cmd = PHYSDEVOP_SET_IOBITMAP
+               };
+#endif
 
                kfree(t->io_bitmap_ptr);
                t->io_bitmap_ptr = NULL;
                /*
                 * Careful, clear this in the TSS too:
                 */
+#ifndef CONFIG_X86_NO_TSS
                memset(tss->io_bitmap, 0xff, t->io_bitmap_max);
+               put_cpu();
+#endif
+#ifdef CONFIG_XEN
+               HYPERVISOR_physdev_op(&iobmp_op);
+#endif
                t->io_bitmap_max = 0;
-               put_cpu();
        }
 }
 
@@ -463,7 +475,9 @@
        struct thread_struct *prev = &prev_p->thread,
                                 *next = &next_p->thread;
        int cpu = smp_processor_id();  
+#ifndef CONFIG_X86_NO_TSS
        struct tss_struct *tss = &per_cpu(init_tss, cpu);
+#endif
        physdev_op_t iopl_op, iobmp_op;
        multicall_entry_t _mcl[8], *mcl = _mcl;
 
@@ -482,10 +496,9 @@
        /*
         * Reload esp0, LDT and the page table pointer:
         */
-       tss->rsp0 = next->rsp0;
        mcl->op      = __HYPERVISOR_stack_switch;
        mcl->args[0] = __KERNEL_DS;
-       mcl->args[1] = tss->rsp0;
+       mcl->args[1] = next->rsp0;
        mcl++;
 
        /*
diff -r f0a8a0a9a6f5 -r 82f6786a0aa8 
linux-2.6-xen-sparse/arch/x86_64/kernel/setup64-xen.c
--- a/linux-2.6-xen-sparse/arch/x86_64/kernel/setup64-xen.c     Mon Feb 20 
14:51:50 2006
+++ b/linux-2.6-xen-sparse/arch/x86_64/kernel/setup64-xen.c     Mon Feb 20 
15:15:10 2006
@@ -203,8 +203,10 @@
        pda->irqstackptr += IRQSTACKSIZE-64;
 } 
 
+#ifndef CONFIG_X86_NO_TSS
 char boot_exception_stacks[(N_EXCEPTION_STACKS - 1) * EXCEPTION_STKSZ + 
DEBUG_STKSZ]
 __attribute__((section(".bss.page_aligned")));
+#endif
 
 /* May not be marked __init: used by software suspend */
 void syscall_init(void)
@@ -246,18 +248,23 @@
 void __cpuinit cpu_init (void)
 {
        int cpu = stack_smp_processor_id();
+#ifndef CONFIG_X86_NO_TSS
        struct tss_struct *t = &per_cpu(init_tss, cpu);
        unsigned long v; 
        char *estacks = NULL; 
+       unsigned i;
+#endif
        struct task_struct *me;
-       int i;
 
        /* CPU 0 is initialised in head64.c */
        if (cpu != 0) {
                pda_init(cpu);
                zap_low_mappings(cpu);
-       } else 
+       }
+#ifndef CONFIG_X86_NO_TSS
+       else
                estacks = boot_exception_stacks; 
+#endif
 
        me = current;
 
@@ -294,6 +301,7 @@
 
        check_efer();
 
+#ifndef CONFIG_X86_NO_TSS
        /*
         * set up and load the per-CPU TSS
         */
@@ -330,6 +338,7 @@
         */
        for (i = 0; i <= IO_BITMAP_LONGS; i++)
                t->io_bitmap[i] = ~0UL;
+#endif
 
        atomic_inc(&init_mm.mm_count);
        me->active_mm = &init_mm;
@@ -337,8 +346,10 @@
                BUG();
        enter_lazy_tlb(&init_mm, me);
 
+#ifndef CONFIG_X86_NO_TSS
+       set_tss_desc(cpu, t);
+#endif
 #ifndef CONFIG_XEN
-       set_tss_desc(cpu, t);
        load_TR_desc();
 #endif
        load_LDT(&init_mm.context);
diff -r f0a8a0a9a6f5 -r 82f6786a0aa8 
linux-2.6-xen-sparse/arch/x86_64/kernel/traps-xen.c
--- a/linux-2.6-xen-sparse/arch/x86_64/kernel/traps-xen.c       Mon Feb 20 
14:51:50 2006
+++ b/linux-2.6-xen-sparse/arch/x86_64/kernel/traps-xen.c       Mon Feb 20 
15:15:10 2006
@@ -134,6 +134,7 @@
 static unsigned long *in_exception_stack(unsigned cpu, unsigned long stack,
                                        unsigned *usedp, const char **idp)
 {
+#ifndef CONFIG_X86_NO_TSS
        static char ids[][8] = {
                [DEBUG_STACK - 1] = "#DB",
                [NMI_STACK - 1] = "NMI",
@@ -185,6 +186,7 @@
                }
 #endif
        }
+#endif
        return NULL;
 }
 
diff -r f0a8a0a9a6f5 -r 82f6786a0aa8 
linux-2.6-xen-sparse/drivers/xen/core/smpboot.c
--- a/linux-2.6-xen-sparse/drivers/xen/core/smpboot.c   Mon Feb 20 14:51:50 2006
+++ b/linux-2.6-xen-sparse/drivers/xen/core/smpboot.c   Mon Feb 20 15:15:10 2006
@@ -237,7 +237,6 @@
 #ifdef __x86_64__
                cpu_pda(cpu)->pcurrent = idle;
                cpu_pda(cpu)->cpunumber = cpu;
-               per_cpu(init_tss,cpu).rsp0 = idle->thread.rsp;
                clear_ti_thread_flag(idle->thread_info, TIF_FORK);
 #endif
 
diff -r f0a8a0a9a6f5 -r 82f6786a0aa8 
linux-2.6-xen-sparse/include/asm-x86_64/mach-xen/asm/desc.h
--- a/linux-2.6-xen-sparse/include/asm-x86_64/mach-xen/asm/desc.h       Mon Feb 
20 14:51:50 2006
+++ b/linux-2.6-xen-sparse/include/asm-x86_64/mach-xen/asm/desc.h       Mon Feb 
20 15:15:10 2006
@@ -152,6 +152,7 @@
        memcpy(ptr, &d, 16); 
 }
 
+#ifndef CONFIG_X86_NO_TSS
 static inline void set_tss_desc(unsigned cpu, void *addr)
 { 
        /*
@@ -165,6 +166,7 @@
                (unsigned long)addr, DESC_TSS,
                IO_BITMAP_OFFSET + IO_BITMAP_BYTES + sizeof(unsigned long) - 1);
 } 
+#endif
 
 static inline void set_ldt_desc(unsigned cpu, void *addr, int size)
 { 
diff -r f0a8a0a9a6f5 -r 82f6786a0aa8 
linux-2.6-xen-sparse/include/asm-x86_64/mach-xen/asm/processor.h
--- a/linux-2.6-xen-sparse/include/asm-x86_64/mach-xen/asm/processor.h  Mon Feb 
20 14:51:50 2006
+++ b/linux-2.6-xen-sparse/include/asm-x86_64/mach-xen/asm/processor.h  Mon Feb 
20 15:15:10 2006
@@ -196,7 +196,9 @@
 #define IO_BITMAP_BITS  65536
 #define IO_BITMAP_BYTES (IO_BITMAP_BITS/8)
 #define IO_BITMAP_LONGS (IO_BITMAP_BYTES/sizeof(long))
+#ifndef CONFIG_X86_NO_TSS
 #define IO_BITMAP_OFFSET offsetof(struct tss_struct,io_bitmap)
+#endif
 #define INVALID_IO_BITMAP_OFFSET 0x8000
 
 struct i387_fxsave_struct {
@@ -217,6 +219,7 @@
        struct i387_fxsave_struct       fxsave;
 };
 
+#ifndef CONFIG_X86_NO_TSS
 struct tss_struct {
        u32 reserved1;
        u64 rsp0;       
@@ -240,8 +243,10 @@
        unsigned long io_bitmap[IO_BITMAP_LONGS + 1];
 } __attribute__((packed)) ____cacheline_aligned;
 
+DECLARE_PER_CPU(struct tss_struct,init_tss);
+#endif
+
 extern struct cpuinfo_x86 boot_cpu_data;
-DECLARE_PER_CPU(struct tss_struct,init_tss);
 
 #ifdef CONFIG_X86_VSMP
 #define ARCH_MIN_TASKALIGN     (1 << INTERNODE_CACHE_SHIFT)
@@ -283,9 +288,11 @@
        .rsp0 = (unsigned long)&init_stack + sizeof(init_stack) \
 }
 
+#ifndef CONFIG_X86_NO_TSS
 #define INIT_TSS  { \
        .rsp0 = (unsigned long)&init_stack + sizeof(init_stack) \
 }
+#endif
 
 #define INIT_MMAP \
 { &init_mm, 0, 0, NULL, PAGE_SHARED, VM_READ | VM_WRITE | VM_EXEC, 1, NULL, 
NULL }

_______________________________________________
Xen-changelog mailing list
Xen-changelog@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-changelog


 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.