WARNING - OLD ARCHIVES

This is an archived copy of the Xen.org mailing list, which we have preserved to ensure that existing links to archives are not broken. The live archive, which contains the latest emails, can be found at http://lists.xen.org/
   
 
 
Xen 
 
Home Products Support Community News
 
   
 

xen-changelog

[Xen-changelog] [xen-unstable] x86/IO-APIC: clear remoteIRR in clear_IO_

To: xen-changelog@xxxxxxxxxxxxxxxxxxx
Subject: [Xen-changelog] [xen-unstable] x86/IO-APIC: clear remoteIRR in clear_IO_APIC_pin()
From: Xen patchbot-unstable <patchbot@xxxxxxx>
Date: Mon, 22 Aug 2011 15:33:14 +0100
Delivery-date: Mon, 22 Aug 2011 07:33:34 -0700
Envelope-to: www-data@xxxxxxxxxxxxxxxxxxx
List-help: <mailto:xen-changelog-request@lists.xensource.com?subject=help>
List-id: BK change log <xen-changelog.lists.xensource.com>
List-post: <mailto:xen-changelog@lists.xensource.com>
List-subscribe: <http://lists.xensource.com/mailman/listinfo/xen-changelog>, <mailto:xen-changelog-request@lists.xensource.com?subject=subscribe>
List-unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-changelog>, <mailto:xen-changelog-request@lists.xensource.com?subject=unsubscribe>
Reply-to: xen-devel@xxxxxxxxxxxxxxxxxxx
Sender: xen-changelog-bounces@xxxxxxxxxxxxxxxxxxx
# HG changeset patch
# User Jan Beulich <jbeulich@xxxxxxxxxx>
# 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@xxxxxxxxxx

Signed-off-by: Jan Beulich <jbeulich@xxxxxxxxxx>
---


diff -r 0849b0e59e24 -r 25dfe53bb189 xen/arch/x86/io_apic.c
--- a/xen/arch/x86/io_apic.c    Mon Aug 22 10:10:39 2011 +0100
+++ b/xen/arch/x86/io_apic.c    Mon Aug 22 10:11:10 2011 +0100
@@ -382,11 +382,46 @@
         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)

_______________________________________________
Xen-changelog mailing list
Xen-changelog@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-changelog

<Prev in Thread] Current Thread [Next in Thread>
  • [Xen-changelog] [xen-unstable] x86/IO-APIC: clear remoteIRR in clear_IO_APIC_pin(), Xen patchbot-unstable <=