]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
vboxguest: Do not use devm for irq
authorPascal Terjan <pterjan@google.com>
Sun, 12 Jun 2022 13:37:44 +0000 (14:37 +0100)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Thu, 25 Aug 2022 09:15:43 +0000 (11:15 +0200)
[ Upstream commit 6169525b76764acb81918aa387ac168fb9a55575 ]

When relying on devm it doesn't get freed early enough which causes the
following warning when unloading the module:

[249348.837181] remove_proc_entry: removing non-empty directory 'irq/20', leaking at least 'vboxguest'
[249348.837219] WARNING: CPU: 0 PID: 6708 at fs/proc/generic.c:715 remove_proc_entry+0x119/0x140

[249348.837379] Call Trace:
[249348.837385]  unregister_irq_proc+0xbd/0xe0
[249348.837392]  free_desc+0x23/0x60
[249348.837396]  irq_free_descs+0x4a/0x70
[249348.837401]  irq_domain_free_irqs+0x160/0x1a0
[249348.837452]  mp_unmap_irq+0x5c/0x60
[249348.837458]  acpi_unregister_gsi_ioapic+0x29/0x40
[249348.837463]  acpi_unregister_gsi+0x17/0x30
[249348.837467]  acpi_pci_irq_disable+0xbf/0xe0
[249348.837473]  pcibios_disable_device+0x20/0x30
[249348.837478]  pci_disable_device+0xef/0x120
[249348.837482]  vbg_pci_remove+0x6c/0x70 [vboxguest]

Reviewed-by: Hans de Goede <hdegoede@redhat.com>
Signed-off-by: Pascal Terjan <pterjan@google.com>
Link: https://lore.kernel.org/r/20220612133744.4030602-1-pterjan@google.com
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Signed-off-by: Sasha Levin <sashal@kernel.org>
drivers/virt/vboxguest/vboxguest_linux.c

index 94e055ee7ad669b503a04e3fa5a90763944f449f..aa65b20883ef722a13c8d6ee20a3669c50d45ce9 100644 (file)
@@ -341,8 +341,8 @@ static int vbg_pci_probe(struct pci_dev *pci, const struct pci_device_id *id)
                goto err_vbg_core_exit;
        }
 
-       ret = devm_request_irq(dev, pci->irq, vbg_core_isr, IRQF_SHARED,
-                              DEVICE_NAME, gdev);
+       ret = request_irq(pci->irq, vbg_core_isr, IRQF_SHARED, DEVICE_NAME,
+                         gdev);
        if (ret) {
                vbg_err("vboxguest: Error requesting irq: %d\n", ret);
                goto err_vbg_core_exit;
@@ -352,7 +352,7 @@ static int vbg_pci_probe(struct pci_dev *pci, const struct pci_device_id *id)
        if (ret) {
                vbg_err("vboxguest: Error misc_register %s failed: %d\n",
                        DEVICE_NAME, ret);
-               goto err_vbg_core_exit;
+               goto err_free_irq;
        }
 
        ret = misc_register(&gdev->misc_device_user);
@@ -388,6 +388,8 @@ err_unregister_misc_device_user:
        misc_deregister(&gdev->misc_device_user);
 err_unregister_misc_device:
        misc_deregister(&gdev->misc_device);
+err_free_irq:
+       free_irq(pci->irq, gdev);
 err_vbg_core_exit:
        vbg_core_exit(gdev);
 err_disable_pcidev:
@@ -404,6 +406,7 @@ static void vbg_pci_remove(struct pci_dev *pci)
        vbg_gdev = NULL;
        mutex_unlock(&vbg_gdev_mutex);
 
+       free_irq(pci->irq, gdev);
        device_remove_file(gdev->dev, &dev_attr_host_features);
        device_remove_file(gdev->dev, &dev_attr_host_version);
        misc_deregister(&gdev->misc_device_user);