mirror of
				https://github.com/torvalds/linux.git
				synced 2025-11-04 10:40:15 +02:00 
			
		
		
		
	driver core: free devres in device_release
device_del can happen anytime, so once it happens, the devres of the device will be freed inside device_del, but drivers can't know it has been deleted and may still add resources into the device, so memory leak is caused. This patch moves the devres_release_all to fix the problem. Signed-off-by: Ming Lei <tom.leiming@gmail.com> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
		
							parent
							
								
									2221f6ef71
								
							
						
					
					
						commit
						a525a3ddea
					
				
					 1 changed files with 11 additions and 7 deletions
				
			
		| 
						 | 
				
			
			@ -184,6 +184,17 @@ static void device_release(struct kobject *kobj)
 | 
			
		|||
	struct device *dev = kobj_to_dev(kobj);
 | 
			
		||||
	struct device_private *p = dev->p;
 | 
			
		||||
 | 
			
		||||
	/*
 | 
			
		||||
	 * Some platform devices are driven without driver attached
 | 
			
		||||
	 * and managed resources may have been acquired.  Make sure
 | 
			
		||||
	 * all resources are released.
 | 
			
		||||
	 *
 | 
			
		||||
	 * Drivers still can add resources into device after device
 | 
			
		||||
	 * is deleted but alive, so release devres here to avoid
 | 
			
		||||
	 * possible memory leak.
 | 
			
		||||
	 */
 | 
			
		||||
	devres_release_all(dev);
 | 
			
		||||
 | 
			
		||||
	if (dev->release)
 | 
			
		||||
		dev->release(dev);
 | 
			
		||||
	else if (dev->type && dev->type->release)
 | 
			
		||||
| 
						 | 
				
			
			@ -1196,13 +1207,6 @@ void device_del(struct device *dev)
 | 
			
		|||
	bus_remove_device(dev);
 | 
			
		||||
	driver_deferred_probe_del(dev);
 | 
			
		||||
 | 
			
		||||
	/*
 | 
			
		||||
	 * Some platform devices are driven without driver attached
 | 
			
		||||
	 * and managed resources may have been acquired.  Make sure
 | 
			
		||||
	 * all resources are released.
 | 
			
		||||
	 */
 | 
			
		||||
	devres_release_all(dev);
 | 
			
		||||
 | 
			
		||||
	/* Notify the platform of the removal, in case they
 | 
			
		||||
	 * need to do anything...
 | 
			
		||||
	 */
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in a new issue