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
					
				
			
		
					 1 changed files with 6 additions and 0 deletions
				
			
		|  | @ -420,6 +420,12 @@ static void pci_device_shutdown(struct device *dev) | |||
| 	pci_msi_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 | ||||
| 	 * be supposed to wake up the system from its "power off" state (e.g. | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Khalid Aziz
				Khalid Aziz