From: Ofir Bitton <obit...@habana.ai>

[ Upstream commit 5555b7c56bdec7a29c789fec27f84d40f52fbdfa ]

Driver never puts its device and control_device objects, hence
a memory leak is introduced every driver removal.

Signed-off-by: Ofir Bitton <obit...@habana.ai>
Reviewed-by: Oded Gabbay <ogab...@kernel.org>
Signed-off-by: Oded Gabbay <ogab...@kernel.org>
Signed-off-by: Sasha Levin <sas...@kernel.org>
---
 drivers/misc/habanalabs/device.c | 16 ++++++++--------
 1 file changed, 8 insertions(+), 8 deletions(-)

diff --git a/drivers/misc/habanalabs/device.c b/drivers/misc/habanalabs/device.c
index a7a4fed4d8995..3eeb1920ddb43 100644
--- a/drivers/misc/habanalabs/device.c
+++ b/drivers/misc/habanalabs/device.c
@@ -229,16 +229,16 @@ delete_cdev_device:
 
 static void device_cdev_sysfs_del(struct hl_device *hdev)
 {
-       /* device_release() won't be called so must free devices explicitly */
-       if (!hdev->cdev_sysfs_created) {
-               kfree(hdev->dev_ctrl);
-               kfree(hdev->dev);
-               return;
-       }
+       if (!hdev->cdev_sysfs_created)
+               goto put_devices;
 
        hl_sysfs_fini(hdev);
        cdev_device_del(&hdev->cdev_ctrl, hdev->dev_ctrl);
        cdev_device_del(&hdev->cdev, hdev->dev);
+
+put_devices:
+       put_device(hdev->dev);
+       put_device(hdev->dev_ctrl);
 }
 
 /*
@@ -1285,9 +1285,9 @@ sw_fini:
 early_fini:
        device_early_fini(hdev);
 free_dev_ctrl:
-       kfree(hdev->dev_ctrl);
+       put_device(hdev->dev_ctrl);
 free_dev:
-       kfree(hdev->dev);
+       put_device(hdev->dev);
 out_disabled:
        hdev->disabled = true;
        if (add_cdev_sysfs_on_err)
-- 
2.27.0

Reply via email to