There is no need for the Compat GDT if there are no 32bit PV guests. This
saves 4k per online CPU
Bloat-o-meter reports the following savings in Xen itself:
add/remove: 0/3 grow/shrink: 1/4 up/down: 7/-4612 (-4605)
Function old new delta
cpu_smpboot_free 1249 1256 +7
per_cpu__compat_gdt_l1e 8 - -8
per_cpu__compat_gdt 8 - -8
init_idt_traps 442 420 -22
load_system_tables 414 364 -50
trap_init 444 280 -164
cpu_smpboot_callback 1255 991 -264
boot_compat_gdt 4096 - -4096
Total: Before=
3062726, After=
3058121, chg -0.15%
Signed-off-by: Andrew Cooper <andrew.cooper3@citrix.com>
Reviewed-by: Wei Liu <wl@xen.org>
Acked-by: Jan Beulich <jbeulich@suse.com>
_set_tssldt_desc(gdt + TSS_ENTRY, (unsigned long)tss,
sizeof(*tss) - 1, SYS_DESC_tss_avail);
- _set_tssldt_desc(compat_gdt + TSS_ENTRY, (unsigned long)tss,
- sizeof(*tss) - 1, SYS_DESC_tss_busy);
+ if ( IS_ENABLED(CONFIG_PV32) )
+ _set_tssldt_desc(compat_gdt + TSS_ENTRY, (unsigned long)tss,
+ sizeof(*tss) - 1, SYS_DESC_tss_busy);
per_cpu(full_gdt_loaded, cpu) = false;
lgdt(&gdtr);
[SEL2GDT(PER_CPU_SELECTOR)] = { 0x0000910000000000 },
};
+#ifdef CONFIG_PV32
__section(".data.page_aligned") __aligned(PAGE_SIZE)
seg_desc_t boot_compat_gdt[PAGE_SIZE / sizeof(seg_desc_t)] =
{
/* 0xe060 - per-CPU entry (limit == cpu) */
[SEL2GDT(PER_CPU_SELECTOR)] = { 0x0000910000000000 },
};
+#endif
/*
* Used by each CPU as it starts up, to enter C with a suitable %cs.
free_domheap_page(mfn_to_page(mfn));
}
- FREE_XENHEAP_PAGE(per_cpu(compat_gdt, cpu));
+ if ( IS_ENABLED(CONFIG_PV32) )
+ FREE_XENHEAP_PAGE(per_cpu(compat_gdt, cpu));
if ( remove )
{
BUILD_BUG_ON(NR_CPUS > 0x10000);
gdt[PER_CPU_GDT_ENTRY - FIRST_RESERVED_GDT_ENTRY].a = cpu;
+#ifdef CONFIG_PV32
per_cpu(compat_gdt, cpu) = gdt = alloc_xenheap_pages(0, memflags);
if ( gdt == NULL )
goto out;
l1e_from_pfn(virt_to_mfn(gdt), __PAGE_HYPERVISOR_RW);
memcpy(gdt, boot_compat_gdt, NR_RESERVED_GDT_PAGES * PAGE_SIZE);
gdt[PER_CPU_GDT_ENTRY - FIRST_RESERVED_GDT_ENTRY].a = cpu;
+#endif
if ( idt_tables[cpu] == NULL )
idt_tables[cpu] = alloc_xenheap_pages(0, memflags);
DEFINE_PER_CPU_READ_MOSTLY(seg_desc_t *, gdt);
DEFINE_PER_CPU_READ_MOSTLY(l1_pgentry_t, gdt_l1e);
+#ifdef CONFIG_PV32
DEFINE_PER_CPU_READ_MOSTLY(seg_desc_t *, compat_gdt);
DEFINE_PER_CPU_READ_MOSTLY(l1_pgentry_t, compat_gdt_l1e);
+#endif
/* Master table, used by CPU0. */
idt_entry_t __section(".bss.page_aligned") __aligned(PAGE_SIZE)
idt_tables[0] = idt_table;
this_cpu(gdt) = boot_gdt;
- this_cpu(compat_gdt) = boot_compat_gdt;
+ if ( IS_ENABLED(CONFIG_PV32) )
+ this_cpu(compat_gdt) = boot_compat_gdt;
}
extern void (*const autogen_entrypoints[X86_NR_VECTORS])(void);
/* Cache {,compat_}gdt_l1e now that physically relocation is done. */
this_cpu(gdt_l1e) =
l1e_from_pfn(virt_to_mfn(boot_gdt), __PAGE_HYPERVISOR_RW);
- this_cpu(compat_gdt_l1e) =
- l1e_from_pfn(virt_to_mfn(boot_compat_gdt), __PAGE_HYPERVISOR_RW);
+ if ( IS_ENABLED(CONFIG_PV32) )
+ this_cpu(compat_gdt_l1e) =
+ l1e_from_pfn(virt_to_mfn(boot_compat_gdt), __PAGE_HYPERVISOR_RW);
percpu_traps_init();