Swap TLS and TSS entries to improve spatial locality
PATCH 1/1 Swap TLS and TSS entries to improve spatial locality
GDT entries are usually accessed with this pattern:
* Interrupt: read TSS (for ss0:esp0) and kernel CS/DS
* Schedule: write TLS, LDT, load FS and GS (either TLS, user DS or LDT entry)
* Return: read user CS/DS
Swapping the TLS and TSS entries causes the GDT entries that are read during interrupt and schedule to be in the same cacheline.
arch/i386/kernel/head.S +2 -2
@@ -416,12 +416,12 @@ */ ENTRY(cpu_gdt_table) .quad 0x0000000000000000 /* NULL descriptor */ - .quad 0x0000000000000000 /* TLS descriptor */ + .quad 0x0000000000000000 /* TSS descriptor */ .quad 0x00cf9a000000ffff /* 0x10 kernel 4GB code at 0x00000000 */ .quad 0x00cf92000000ffff /* 0x18 kernel 4GB data at 0x00000000 */ .quad 0x00cffa000000ffff /* 0x23 user 4GB code at 0x00000000 */ .quad 0x00cff2000000ffff /* 0x2b user 4GB data at 0x00000000 */ - .quad 0x0000000000000000 /* TSS descriptor */ + .quad 0x0000000000000000 /* TLS descriptor */ .quad 0x0000000000000000 /* LDT descriptor */ /* * The APM segments have byte granularity and their bases
include/asm-i386/desc.h +4 -4
@@ -7,12 +7,12 @@* The layout of the per-CPU GDT under Linux: * * 0 - null -* 1 - Thread-Local Storage (TLS) segment +* 1 - TSS * 2 - kernel code segment * 3 - kernel data segment * 4 - user code segment <==== new cacheline * 5 - user data segment -* 6 - TSS +* 6 - Thread-Local Storage (TLS) segment * 7 - LDT * 8 - APM BIOS support <==== new cacheline * 9 - APM BIOS support
@@ -27,8 +27,8 @@* 18 - not used * 19 - not used */ -#define TLS_ENTRY 1 -#define TSS_ENTRY 6 +#define TSS_ENTRY 1 +#define TLS_ENTRY 6#define LDT_ENTRY 7/* * The interrupt descriptor table has room for 256 idt's,
Quoted 8 lines · Luca Barbieri
GDT entries are usually accessed with this pattern:
* Interrupt: read TSS (for ss0:esp0) and kernel CS/DS
* Schedule: write TLS, LDT, load FS and GS (either TLS, user DS or LDT entry)
* Return: read user CS/DSSwapping the TLS and TSS entries causes the GDT entries that are read during interrupt and schedule to be in the same cacheline.
yes, this makes perfect sense.
Ingo