forked from mirrors/linux
		
	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_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