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 <andrew.cooper3@citrix.com>
Signed-off-by: Keir Fraser <keir@xen.org>
Committed-by: Keir Fraser <keir@xen.org>
xen-unstable changeset:   24137:0844b17df7a9
xen-unstable date:        Fri Nov 11 18:14:35 2011 +0000
This commit is contained in:
Andrew Cooper committed 2011-11-12 16:14:02 +00:00
1 parent 2189b45b64
commit 5966ce084e
3 files changed
-24

No files matched your search

-3
View File
@@ -28,7 +28,6 @@
#include <asm/apic.h>
#include <asm/io_apic.h>
#include <xen/iommu.h>
#include <xen/pci.h>
#include <asm/hpet.h>
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();
-19
View File
@@ -499,25 +499,6 @@ int __init scan_pci_devices(void)
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);
}
#ifdef SUPPORT_MSI_REMAPPING
static void dump_pci_devices(unsigned char ch)
{
-2
View File
@@ -94,8 +94,6 @@ int pci_remove_device(u8 bus, u8 devfn);
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(
Reference in new issue
Block a user
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.