xen-devel
[Xen-devel] [patch 32/44] xen: hack to prevent bad segment register relo
The hypervisor saves and restores the segment registers as part of the
state is saves while context switching. If, during a context switch,
the next process doesn't use the TLS segments, it invalidates the GDT
entry, causing the segment register reload to fault. This fault
effectively doubles the cost of a context switch.
This patch is a band-aid workaround which clears the usermode %gs
after it has been saved for the previous process, but before it gets
reloaded for the next, and it avoids having the hypervisor attempt to
erroneously reload it.
Signed-off-by: Jeremy Fitzhardinge <jeremy@xxxxxxxxxxxxx>
Signed-off-by: Chris Wright <chrisw@xxxxxxxxxxxx>
---
arch/i386/xen/enlighten.c | 12 ++++++++++++
1 file changed, 12 insertions(+)
===================================================================
--- a/arch/i386/xen/enlighten.c
+++ b/arch/i386/xen/enlighten.c
@@ -291,6 +291,18 @@ static void xen_load_tls(struct thread_s
load_TLS_descriptor(t, cpu, 2);
xen_mc_issue(PARAVIRT_LAZY_CPU);
+
+ /*
+ * XXX sleazy hack: If we're being called in a lazy-cpu zone,
+ * it means we're in a context switch, and %gs has just been
+ * saved. This means we can zero it out to prevent faults on
+ * exit from the hypervisor if the next process has no %gs.
+ * Either way, it has been saved, and the new value will get
+ * loaded properly. This will go away as soon as Xen has been
+ * modified to not save/restore %gs for normal hypercalls.
+ */
+ if (xen_get_lazy_mode() == PARAVIRT_LAZY_CPU)
+ loadsegment(gs, 0);
}
static void xen_write_ldt_entry(struct desc_struct *dt, int entrynum,
--
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-devel
|
<Prev in Thread] |
Current Thread |
[Next in Thread>
|
- [Xen-devel] [patch 41/44] xen: Attempt to patch inline versions of common operations, (continued)
[Xen-devel] [patch 18/44] xen: Add Xen interface header files, Jeremy Fitzhardinge
[Xen-devel] [patch 16/44] Add a sched_clock paravirt_op, Jeremy Fitzhardinge
[Xen-devel] [patch 32/44] xen: hack to prevent bad segment register reload,
Jeremy Fitzhardinge <=
[Xen-devel] [patch 09/44] paravirt: increase IRQ limit, Jeremy Fitzhardinge
[Xen-devel] [patch 15/44] paravirt: helper to disable all IO space, Jeremy Fitzhardinge
[Xen-devel] [patch 20/44] xen: virtual mmu, Jeremy Fitzhardinge
[Xen-devel] [patch 11/44] paravirt: unstatic smp_store_cpu_info, Jeremy Fitzhardinge
[Xen-devel] [patch 39/44] xen: handle external requests for shutdown, reboot and sysrq, Jeremy Fitzhardinge
[Xen-devel] [patch 19/44] xen: Core Xen implementation, Jeremy Fitzhardinge
[Xen-devel] [patch 28/44] xen: Implement sched_clock, Jeremy Fitzhardinge
[Xen-devel] [patch 27/44] xen: Account for stolen time, Jeremy Fitzhardinge
[Xen-devel] [patch 35/44] xen: add the Xenbus sysfs and virtual device hotplug driver, Jeremy Fitzhardinge
[Xen-devel] [patch 07/44] paravirt: add an "mm" argument to alloc_pt, Jeremy Fitzhardinge
|
|
|