bus: fix leak for devices without driver
Checks
Commit Message
For devices not assigned to any driver, we leak a pci device object since
it is never freed from the PCI bus device list, reported by ASAN.
Fixes: 1cab1a40ea9b ("bus: cleanup devices on shutdown")
Signed-off-by: Volodymyr Fialko <vfialko@marvell.com>
---
drivers/bus/pci/pci_common.c | 3 ++-
drivers/bus/vdev/vdev.c | 5 +++--
2 files changed, 5 insertions(+), 3 deletions(-)
Comments
On Sat, Jan 7, 2023 at 4:12 PM Volodymyr Fialko <vfialko@marvell.com> wrote:
>
> For devices not assigned to any driver, we leak a pci device object since
> it is never freed from the PCI bus device list, reported by ASAN.
>
> Fixes: 1cab1a40ea9b ("bus: cleanup devices on shutdown")
Worth copying stable.
>
> Signed-off-by: Volodymyr Fialko <vfialko@marvell.com>
At a quick glance, the fix lgtm.
Kevin, can you double check this fix thoroughly?
Thanks.
Hi Volodymyr,
On 07/01/2023 15:12, Volodymyr Fialko wrote:
> For devices not assigned to any driver, we leak a pci device object since
> it is never freed from the PCI bus device list, reported by ASAN.
>
> Fixes: 1cab1a40ea9b ("bus: cleanup devices on shutdown")
>
> Signed-off-by: Volodymyr Fialko <vfialko@marvell.com>
> ---
> drivers/bus/pci/pci_common.c | 3 ++-
> drivers/bus/vdev/vdev.c | 5 +++--
> 2 files changed, 5 insertions(+), 3 deletions(-)
>
This fix LGTM, but its tricky to reproduce so I have not been able to
test this.
Could you add some more text to the commit message describing the issue
and fix, please?
/Kevin
@@ -448,7 +448,7 @@ pci_cleanup(void)
int ret = 0;
if (drv == NULL || drv->remove == NULL)
- continue;
+ goto free;
ret = drv->remove(dev);
if (ret < 0) {
@@ -458,6 +458,7 @@ pci_cleanup(void)
dev->driver = NULL;
dev->device.driver = NULL;
+free:
/* free interrupt handles */
rte_intr_instance_free(dev->intr_handle);
dev->intr_handle = NULL;
@@ -578,18 +578,19 @@ vdev_cleanup(void)
int ret = 0;
if (dev->device.driver == NULL)
- continue;
+ goto free;
drv = container_of(dev->device.driver, const struct rte_vdev_driver, driver);
if (drv->remove == NULL)
- continue;
+ goto free;
ret = drv->remove(dev);
if (ret < 0)
error = -1;
dev->device.driver = NULL;
+free:
free(dev);
}