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 *dev = kobj_to_dev(kobj);
|
||||||
struct device_private *p = dev->p;
|
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)
|
if (dev->release)
|
||||||
dev->release(dev);
|
dev->release(dev);
|
||||||
else if (dev->type && dev->type->release)
|
else if (dev->type && dev->type->release)
|
||||||
|
@ -1196,13 +1207,6 @@ void device_del(struct device *dev)
|
||||||
bus_remove_device(dev);
|
bus_remove_device(dev);
|
||||||
driver_deferred_probe_del(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
|
/* Notify the platform of the removal, in case they
|
||||||
* need to do anything...
|
* need to do anything...
|
||||||
*/
|
*/
|
||||||
|
|
Loading…
Reference in New Issue