Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit a525a3dd authored by Ming Lei's avatar Ming Lei Committed by Greg Kroah-Hartman
Browse files

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: default avatarMing Lei <tom.leiming@gmail.com>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent 2221f6ef
Loading
Loading
Loading
Loading
+11 −7
Original line number Original line Diff line number Diff line
@@ -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...
	 */
	 */