Patch "drivers: base: Free devm resources when unregistering a device" has been added to the 6.1-stable tree

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



This is a note to let you know that I've just added the patch titled

    drivers: base: Free devm resources when unregistering a device

to the 6.1-stable tree which can be found at:
    http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary

The filename of the patch is:
     drivers-base-free-devm-resources-when-unregistering-.patch
and it can be found in the queue-6.1 subdirectory.

If you, or anyone else, feels it should not be added to the stable tree,
please let <stable@xxxxxxxxxxxxxxx> know about it.



commit a23e370b7109a6d47d01e78213bf4579d1ac45bf
Author: David Gow <davidgow@xxxxxxxxxx>
Date:   Thu Jul 20 14:45:09 2023 +0200

    drivers: base: Free devm resources when unregistering a device
    
    [ Upstream commit 699fb50d99039a50e7494de644f96c889279aca3 ]
    
    In the current code, devres_release_all() only gets called if the device
    has a bus and has been probed.
    
    This leads to issues when using bus-less or driver-less devices where
    the device might never get freed if a managed resource holds a reference
    to the device. This is happening in the DRM framework for example.
    
    We should thus call devres_release_all() in the device_del() function to
    make sure that the device-managed actions are properly executed when the
    device is unregistered, even if it has neither a bus nor a driver.
    
    This is effectively the same change than commit 2f8d16a996da ("devres:
    release resources on device_del()") that got reverted by commit
    a525a3ddeaca ("driver core: free devres in device_release") over
    memory leaks concerns.
    
    This patch effectively combines the two commits mentioned above to
    release the resources both on device_del() and device_release() and get
    the best of both worlds.
    
    Fixes: a525a3ddeaca ("driver core: free devres in device_release")
    Signed-off-by: David Gow <davidgow@xxxxxxxxxx>
    Signed-off-by: Maxime Ripard <mripard@xxxxxxxxxx>
    Link: https://lore.kernel.org/r/20230720-kunit-devm-inconsistencies-test-v3-3-6aa7e074f373@xxxxxxxxxx
    Signed-off-by: Greg Kroah-Hartman <gregkh@xxxxxxxxxxxxxxxxxxx>
    Signed-off-by: Sasha Levin <sashal@xxxxxxxxxx>

diff --git a/drivers/base/core.c b/drivers/base/core.c
index e30223c2672fc..af90bfb0cc3d8 100644
--- a/drivers/base/core.c
+++ b/drivers/base/core.c
@@ -3855,6 +3855,17 @@ void device_del(struct device *dev)
 	device_platform_notify_remove(dev);
 	device_links_purge(dev);
 
+	/*
+	 * If a device does not have a driver attached, we need to clean
+	 * up any managed resources. We do this in device_release(), but
+	 * it's never called (and we leak the device) if a managed
+	 * resource holds a reference to the device. So release all
+	 * managed resources here, like we do in driver_detach(). We
+	 * still need to do so again in device_release() in case someone
+	 * adds a new resource after this point, though.
+	 */
+	devres_release_all(dev);
+
 	if (dev->bus)
 		blocking_notifier_call_chain(&dev->bus->p->bus_notifier,
 					     BUS_NOTIFY_REMOVED_DEVICE, dev);



[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Index of Archives]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux