2011-08-26 18:49:33 +02:00
|
|
|
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>
|
|
|
|
|
2011-10-18 16:16:28 +02:00
|
|
|
--- a/xen/arch/x86/io_apic.c
|
|
|
|
+++ b/xen/arch/x86/io_apic.c
|
|
|
|
@@ -481,11 +481,35 @@ static void clear_IO_APIC_pin(unsigned i
|
2011-08-26 18:49:33 +02:00
|
|
|
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);
|
|
|
|
+ }
|
2011-10-18 16:16:28 +02:00
|
|
|
+ __io_apic_eoi(apic, entry.vector, pin);
|
2011-08-26 18:49:33 +02:00
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ /*
|
|
|
|
* 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)
|