mirror of
				https://github.com/torvalds/linux.git
				synced 2025-11-04 02:30:34 +02:00 
			
		
		
		
	PCI: Avoid reset when disabled via sysfs
Afterd88f521da3("PCI: Allow userspace to query and set device reset mechanism"), userspace can disable reset of specific PCI devices by writing an empty string to the sysfs reset_method file. However, pci_slot_resettable() does not check pci_reset_supported(), which means that pci_reset_function() will still reset the device even if userspace has disabled all the reset methods. I was able to reproduce this issue with a vfio device passed to a qemu guest, where I had disabled PCI reset via sysfs. Add an explicit check of pci_reset_supported() in both pci_slot_resettable() and pci_bus_resettable() to ensure both the reset status and reset execution are bypassed if an administrator disables it for a device. Link: https://lore.kernel.org/r/20250207205600.1846178-1-naravamudan@nvidia.com Fixes:d88f521da3("PCI: Allow userspace to query and set device reset mechanism") Signed-off-by: Nishanth Aravamudan <naravamudan@nvidia.com> [bhelgaas: commit log] Signed-off-by: Bjorn Helgaas <bhelgaas@google.com> Cc: Alex Williamson <alex.williamson@redhat.com> Cc: Raphael Norwitz <raphael.norwitz@nutanix.com> Cc: Amey Narkhede <ameynarkhede03@gmail.com> Cc: Jason Gunthorpe <jgg@nvidia.com> Cc: Yishai Hadas <yishaih@nvidia.com> Cc: Shameer Kolothum <shameerali.kolothum.thodi@huawei.com> Cc: Kevin Tian <kevin.tian@intel.com>
This commit is contained in:
		
							parent
							
								
									800ce277f4
								
							
						
					
					
						commit
						479380efe1
					
				
					 1 changed files with 4 additions and 0 deletions
				
			
		| 
						 | 
				
			
			@ -5410,6 +5410,8 @@ static bool pci_bus_resettable(struct pci_bus *bus)
 | 
			
		|||
		return false;
 | 
			
		||||
 | 
			
		||||
	list_for_each_entry(dev, &bus->devices, bus_list) {
 | 
			
		||||
		if (!pci_reset_supported(dev))
 | 
			
		||||
			return false;
 | 
			
		||||
		if (dev->dev_flags & PCI_DEV_FLAGS_NO_BUS_RESET ||
 | 
			
		||||
		    (dev->subordinate && !pci_bus_resettable(dev->subordinate)))
 | 
			
		||||
			return false;
 | 
			
		||||
| 
						 | 
				
			
			@ -5486,6 +5488,8 @@ static bool pci_slot_resettable(struct pci_slot *slot)
 | 
			
		|||
	list_for_each_entry(dev, &slot->bus->devices, bus_list) {
 | 
			
		||||
		if (!dev->slot || dev->slot != slot)
 | 
			
		||||
			continue;
 | 
			
		||||
		if (!pci_reset_supported(dev))
 | 
			
		||||
			return false;
 | 
			
		||||
		if (dev->dev_flags & PCI_DEV_FLAGS_NO_BUS_RESET ||
 | 
			
		||||
		    (dev->subordinate && !pci_bus_resettable(dev->subordinate)))
 | 
			
		||||
			return false;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in a new issue