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/
Home Products Support Community News


[Xen-changelog] [xen-unstable] KEXEC: disconnect all PCI devices from th

To: xen-changelog@xxxxxxxxxxxxxxxxxxx
Subject: [Xen-changelog] [xen-unstable] KEXEC: disconnect all PCI devices from the PCI bus on crash
From: Xen patchbot-unstable <patchbot@xxxxxxx>
Date: Sun, 10 Jul 2011 08:44:13 +0100
Delivery-date: Sun, 10 Jul 2011 00:45:30 -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 Andrew Cooper <andrew.cooper3@xxxxxxxxxx>
# Date 1310110715 -3600
# Node ID b96f8bdcaa15541a37ab7e9e10274ad6a34f414f
# Parent  1ed49fb67feaf9b5e91b33ced312022262c59fba
KEXEC: disconnect all PCI devices from the PCI bus on crash

In the case of a crash, IOMMU DMA remapping gets turned off so that
the kdump kernel may boot.  However, this is warned as being dangerous
in the VTD specification if a DMA transaction is in progress.

Also, in the case of a crash, DMA transactions and interrupts from
peripheral devices such as network cards are likely to keep coming in.
Without DMA remapping enabled, the transactions will be writing over
low memory, corrupting the crash state, and perhaps even the kdump
reserved memory.

Therefore, on the crash path, we can disconnect all PCI devices from
their respective buses so that they are no longer able to be DMA
busmasters.  This reduces the risk of DMA transactions corrupting
state (and will also reduce spurious interrupts arriving to the kdump
kernel) until the kdump kernel and properly reset the PCI devices.

Signed-off-by: Andrew Cooper <andrew.cooper3@xxxxxxxxxx>

diff -r 1ed49fb67fea -r b96f8bdcaa15 xen/arch/x86/crash.c
--- a/xen/arch/x86/crash.c      Fri Jul 08 08:35:00 2011 +0100
+++ b/xen/arch/x86/crash.c      Fri Jul 08 08:38:35 2011 +0100
@@ -28,6 +28,7 @@
 #include <asm/apic.h>
 #include <asm/io_apic.h>
 #include <xen/iommu.h>
+#include <xen/pci.h>
 static atomic_t waiting_for_crash_ipi;
 static unsigned int crashing_cpu;
@@ -78,6 +79,8 @@
+    disconnect_pci_devices();
     /* Crash shutdown any IOMMU functionality as the crashdump kernel is not
      * happy when booting if interrupt/dma remapping is still enabled */
diff -r 1ed49fb67fea -r b96f8bdcaa15 xen/drivers/passthrough/pci.c
--- a/xen/drivers/passthrough/pci.c     Fri Jul 08 08:35:00 2011 +0100
+++ b/xen/drivers/passthrough/pci.c     Fri Jul 08 08:38:35 2011 +0100
@@ -462,6 +462,25 @@
     return 0;
+/* Disconnect all PCI devices from the PCI buses. From the PCI spec:
+ *   "When a 0 is written to [the COMMAND] register, the device is
+ *    logically disconnected from the PCI bus for all accesses except
+ *    configuration accesses. All devices are required to support
+ *    this base level of functionality."
+ */
+void disconnect_pci_devices(void)
+    struct pci_dev *pdev;
+    spin_lock(&pcidevs_lock);
+    list_for_each_entry ( pdev, &alldevs_list, alldevs_list )
+        pci_conf_write16(pdev->bus, PCI_SLOT(pdev->devfn),
+                         PCI_FUNC(pdev->devfn), PCI_COMMAND, 0);
+    spin_unlock(&pcidevs_lock);
 static void dump_pci_devices(unsigned char ch)
diff -r 1ed49fb67fea -r b96f8bdcaa15 xen/include/xen/pci.h
--- a/xen/include/xen/pci.h     Fri Jul 08 08:35:00 2011 +0100
+++ b/xen/include/xen/pci.h     Fri Jul 08 08:38:35 2011 +0100
@@ -92,6 +92,8 @@
 struct pci_dev *pci_get_pdev(int bus, int devfn);
 struct pci_dev *pci_get_pdev_by_domain(struct domain *d, int bus, int devfn);
+void disconnect_pci_devices(void);
 uint8_t pci_conf_read8(
     unsigned int bus, unsigned int dev, unsigned int func, unsigned int reg);
 uint16_t pci_conf_read16(

Xen-changelog mailing list

<Prev in Thread] Current Thread [Next in Thread>
  • [Xen-changelog] [xen-unstable] KEXEC: disconnect all PCI devices from the PCI bus on crash, Xen patchbot-unstable <=