[v2] bus: fix leak for devices without driver
Checks
Commit Message
During the bus scan, memory for device configuration is allocated.
Currently, if a driver wasn't attached to the device during initialization,
memory for that device will not be released at bus cleanup.
This patch address this issue and releases the memory for all allocated
devices.
Fixes: 1cab1a40ea9b ("bus: cleanup devices on shutdown")
Cc: stable@dpdk.org
Signed-off-by: Volodymyr Fialko <vfialko@marvell.com>
---
V2:
- Updated commit message.
drivers/bus/pci/pci_common.c | 3 ++-
drivers/bus/vdev/vdev.c | 5 +++--
2 files changed, 5 insertions(+), 3 deletions(-)
Comments
On 09/02/2023 13:22, Volodymyr Fialko wrote:
> During the bus scan, memory for device configuration is allocated.
> Currently, if a driver wasn't attached to the device during initialization,
> memory for that device will not be released at bus cleanup.
> This patch address this issue and releases the memory for all allocated
> devices.
>
> Fixes: 1cab1a40ea9b ("bus: cleanup devices on shutdown")
> Cc: stable@dpdk.org
>
> Signed-off-by: Volodymyr Fialko <vfialko@marvell.com>
> ---
> V2:
> - Updated commit message.
>
> drivers/bus/pci/pci_common.c | 3 ++-
> drivers/bus/vdev/vdev.c | 5 +++--
> 2 files changed, 5 insertions(+), 3 deletions(-)
>
Acked-by: Kevin Laatz <kevin.laatz@intel.com>
On Fri, Feb 10, 2023 at 10:29 AM Kevin Laatz <kevin.laatz@intel.com> wrote:
>
> On 09/02/2023 13:22, Volodymyr Fialko wrote:
> > During the bus scan, memory for device configuration is allocated.
> > Currently, if a driver wasn't attached to the device during initialization,
> > memory for that device will not be released at bus cleanup.
> > This patch address this issue and releases the memory for all allocated
> > devices.
> >
> > Fixes: 1cab1a40ea9b ("bus: cleanup devices on shutdown")
> > Cc: stable@dpdk.org
> >
> > Signed-off-by: Volodymyr Fialko <vfialko@marvell.com>
> Acked-by: Kevin Laatz <kevin.laatz@intel.com>
Applied, thanks.
@@ -450,7 +450,7 @@ pci_cleanup(void)
int ret = 0;
if (drv == NULL || drv->remove == NULL)
- continue;
+ goto free;
ret = drv->remove(dev);
if (ret < 0) {
@@ -460,6 +460,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);
}