]> git.proxmox.com Git - mirror_ubuntu-focal-kernel.git/commitdiff
habanalabs: put devices before driver removal
authorOfir Bitton <obitton@habana.ai>
Sun, 29 Nov 2020 07:34:12 +0000 (09:34 +0200)
committerKleber Sacilotto de Souza <kleber.souza@canonical.com>
Wed, 20 Jan 2021 13:25:26 +0000 (14:25 +0100)
BugLink: https://bugs.launchpad.net/bugs/1910822
[ 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 <obitton@habana.ai>
Reviewed-by: Oded Gabbay <ogabbay@kernel.org>
Signed-off-by: Oded Gabbay <ogabbay@kernel.org>
Signed-off-by: Sasha Levin <sashal@kernel.org>
Signed-off-by: Kamal Mostafa <kamal@canonical.com>
Signed-off-by: Kelsey Skunberg <kelsey.skunberg@canonical.com>
drivers/misc/habanalabs/device.c

index a7a4fed4d89957f60c042ebcbe10ca1ad50c8cf0..3eeb1920ddb43e53aaa205e3b5752fe24957ef93 100644 (file)
@@ -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)