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
|
@ -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