driver core: free devres in device_release
authorMing Lei <tom.leiming@gmail.com>
Tue, 24 Jul 2012 17:42:29 +0000 (01:42 +0800)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Thu, 16 Aug 2012 17:32:07 +0000 (10:32 -0700)
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>
drivers/base/core.c

index f338037a4f3d9109e4d69da7a22a4e41070615b4..c8fe4a5638661e1e61d89ea183c320cd21a4c57f 100644 (file)
@@ -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...
         */