PCI: disable Bus Master on PCI device shutdown
Disable Bus Master bit on the device in pci_device_shutdown() to ensure PCI devices do not continue to DMA data after shutdown. This can cause memory corruption in case of a kexec where the current kernel shuts down and transfers control to a new kernel while a PCI device continues to DMA to memory that does not belong to it any more in the new kernel. I have tested this code on two laptops, two workstations and a 16-socket server. kexec worked correctly on all of them. Signed-off-by: Khalid Aziz <khalid.aziz@hp.com> Signed-off-by: Bjorn Helgaas <bhelgaas@google.com>
This commit is contained in:
parent
df558de16c
commit
b566a22c23
|
@ -420,6 +420,12 @@ static void pci_device_shutdown(struct device *dev)
|
||||||
pci_msi_shutdown(pci_dev);
|
pci_msi_shutdown(pci_dev);
|
||||||
pci_msix_shutdown(pci_dev);
|
pci_msix_shutdown(pci_dev);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Turn off Bus Master bit on the device to tell it to not
|
||||||
|
* continue to do DMA
|
||||||
|
*/
|
||||||
|
pci_disable_device(pci_dev);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Devices may be enabled to wake up by runtime PM, but they need not
|
* Devices may be enabled to wake up by runtime PM, but they need not
|
||||||
* be supposed to wake up the system from its "power off" state (e.g.
|
* be supposed to wake up the system from its "power off" state (e.g.
|
||||||
|
|
Loading…
Reference in a new issue