From: Andrew Cooper Date: Fri, 11 Nov 2011 18:14:35 +0000 (+0000) Subject: Revert c/s 23666:b96f8bdcaa15 KEXEC: disconnect all PCI devices from the PCI bus... X-Git-Url: https://dgit.raspbian.org/?a=commitdiff_plain;h=bfbaed092edf2c8389c8c8504cd23954b7734945;p=xen.git Revert c/s 23666:b96f8bdcaa15 KEXEC: disconnect all PCI devices from the PCI bus on crash It turns out that this causes all mannor of problems on certain motherboards (so far with no pattern I can discern) Problems include: * Hanging forever checking hlt instruction. * Panics when trying to change switch root device * Drivers hanging when trying to check for interrupts. From: Andrew Cooper Signed-off-by: Keir Fraser Committed-by: Keir Fraser --- diff --git a/xen/arch/x86/crash.c b/xen/arch/x86/crash.c index 2636950dbc..68174b51fa 100644 --- a/xen/arch/x86/crash.c +++ b/xen/arch/x86/crash.c @@ -28,7 +28,6 @@ #include #include #include -#include #include static atomic_t waiting_for_crash_ipi; @@ -83,8 +82,6 @@ static void nmi_shootdown_cpus(void) msecs--; } - disconnect_pci_devices(); - /* Crash shutdown any IOMMU functionality as the crashdump kernel is not * happy when booting if interrupt/dma remapping is still enabled */ iommu_crash_shutdown(); diff --git a/xen/drivers/passthrough/pci.c b/xen/drivers/passthrough/pci.c index 8edb707ae9..b7f87d003a 100644 --- a/xen/drivers/passthrough/pci.c +++ b/xen/drivers/passthrough/pci.c @@ -683,30 +683,6 @@ void __init setup_dom0_pci_devices( spin_unlock(&pcidevs_lock); } -/* 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." - */ -static int _disconnect_pci_devices(struct pci_seg *pseg, void *arg) -{ - struct pci_dev *pdev; - - list_for_each_entry ( pdev, &pseg->alldevs_list, alldevs_list ) - pci_conf_write16(pseg->nr, pdev->bus, PCI_SLOT(pdev->devfn), - PCI_FUNC(pdev->devfn), PCI_COMMAND, 0); - - return 0; -} - -void disconnect_pci_devices(void) -{ - spin_lock(&pcidevs_lock); - pci_segments_iterate(_disconnect_pci_devices, NULL); - spin_unlock(&pcidevs_lock); -} - #ifdef SUPPORT_MSI_REMAPPING static int _dump_pci_devices(struct pci_seg *pseg, void *arg) { diff --git a/xen/include/xen/pci.h b/xen/include/xen/pci.h index edc9201991..13c22f5564 100644 --- a/xen/include/xen/pci.h +++ b/xen/include/xen/pci.h @@ -100,8 +100,6 @@ struct pci_dev *pci_get_pdev(int seg, int bus, int devfn); struct pci_dev *pci_get_pdev_by_domain( struct domain *, int seg, int bus, int devfn); -void disconnect_pci_devices(void); - uint8_t pci_conf_read8( unsigned int seg, unsigned int bus, unsigned int dev, unsigned int func, unsigned int reg);