800917b5a2
- Update to Xen 4.1.2_rc2 c/s 23152 - bnc#716695 - domUs using tap devices will not start updated multi-xvdp.patch - Upstream patches from Jan 23803-intel-pmu-models.patch 23800-x86_64-guest-addr-range.patch 23795-intel-ich10-quirk.patch 23804-x86-IPI-counts.patch - bnc#706106 - Inconsistent reporting of VM names during migration xend-migration-domname-fix.patch - bnc#712823 - L3:Xen guest does not start reliable when rebooted xend-vcpu-affinity-fix.patch OBS-URL: https://build.opensuse.org/package/show/Virtualization/xen?expand=0&rev=143
74 lines
2.5 KiB
Diff
74 lines
2.5 KiB
Diff
References: bnc#701686
|
|
|
|
# HG changeset patch
|
|
# User Jan Beulich <jbeulich@novell.com>
|
|
# Date 1314004270 -3600
|
|
# Node ID 25dfe53bb1898b3967ceb71a7eb60a8b760c25fb
|
|
# Parent 0849b0e59e2418e8215616df147f955b01b07577
|
|
x86/IO-APIC: clear remoteIRR in clear_IO_APIC_pin()
|
|
|
|
It was found that in a crash scenario, the remoteIRR bit in an IO-APIC
|
|
RTE could be left set, causing problems when bringing up a kdump
|
|
kernel. While this generally is most important to be taken care of in
|
|
the new kernel (which usually would be a native one), it still seems
|
|
desirable to also address this problem in Xen so that (a) the problem
|
|
doesn't bite Xen when used as a secondary emergency kernel and (b) an
|
|
attempt is being made to save un-fixed secondary kernels from running
|
|
into said problem.
|
|
|
|
Based on a Linux patch from suresh.b.siddha@intel.com.
|
|
|
|
Signed-off-by: Jan Beulich <jbeulich@novell.com>
|
|
|
|
Index: xen-4.1.2-testing/xen/arch/x86/io_apic.c
|
|
===================================================================
|
|
--- xen-4.1.2-testing.orig/xen/arch/x86/io_apic.c
|
|
+++ xen-4.1.2-testing/xen/arch/x86/io_apic.c
|
|
@@ -375,11 +375,46 @@ static void clear_IO_APIC_pin(unsigned i
|
|
return;
|
|
|
|
/*
|
|
+ * Make sure the entry is masked and re-read the contents to check
|
|
+ * if it is a level triggered pin and if the remoteIRR is set.
|
|
+ */
|
|
+ if (!entry.mask) {
|
|
+ entry.mask = 1;
|
|
+ __ioapic_write_entry(apic, pin, FALSE, entry);
|
|
+ }
|
|
+ entry = __ioapic_read_entry(apic, pin, TRUE);
|
|
+
|
|
+ if (entry.irr) {
|
|
+ /* Make sure the trigger mode is set to level. */
|
|
+ if (!entry.trigger) {
|
|
+ entry.trigger = 1;
|
|
+ __ioapic_write_entry(apic, pin, TRUE, entry);
|
|
+ }
|
|
+ if (mp_ioapics[apic].mpc_apicver >= 0x20)
|
|
+ io_apic_eoi(apic, entry.vector);
|
|
+ else {
|
|
+ /*
|
|
+ * Mechanism by which we clear remoteIRR in this case is by
|
|
+ * changing the trigger mode to edge and back to level.
|
|
+ */
|
|
+ entry.trigger = 0;
|
|
+ __ioapic_write_entry(apic, pin, TRUE, entry);
|
|
+ entry.trigger = 1;
|
|
+ __ioapic_write_entry(apic, pin, TRUE, entry);
|
|
+ }
|
|
+ }
|
|
+
|
|
+ /*
|
|
* Disable it in the IO-APIC irq-routing table:
|
|
*/
|
|
memset(&entry, 0, sizeof(entry));
|
|
entry.mask = 1;
|
|
__ioapic_write_entry(apic, pin, TRUE, entry);
|
|
+
|
|
+ entry = __ioapic_read_entry(apic, pin, TRUE);
|
|
+ if (entry.irr)
|
|
+ printk(KERN_ERR "IO-APIC%02x-%u: Unable to reset IRR\n",
|
|
+ IO_APIC_ID(apic), pin);
|
|
}
|
|
|
|
static void clear_IO_APIC (void)
|