During the scan phase (more precisely, during device filtering), device pointers were leaked.
Add a simple helper so a device pointer is fully freed. As a consequence of the filtering during scan, all blocklisted devices are freed from the bus list during scan: there is no need for reevaluating if a device is blocklisted during cleanup. Signed-off-by: David Marchand <[email protected]> --- Changes since RFC v1: - fixed interrupt handle leak by adding fslmc_free_device helper sooner in the series, --- drivers/bus/fslmc/fslmc_bus.c | 23 ++++++++++++++++++----- drivers/bus/fslmc/fslmc_vfio.c | 33 +++++++++------------------------ drivers/bus/fslmc/private.h | 2 ++ 3 files changed, 29 insertions(+), 29 deletions(-) diff --git a/drivers/bus/fslmc/fslmc_bus.c b/drivers/bus/fslmc/fslmc_bus.c index 4b0896e42e..322b023652 100644 --- a/drivers/bus/fslmc/fslmc_bus.c +++ b/drivers/bus/fslmc/fslmc_bus.c @@ -85,6 +85,22 @@ insert_in_device_list(struct rte_dpaa2_device *newdev) rte_bus_add_device(&rte_fslmc_bus, &newdev->device); } +static void +fslmc_free_device(struct rte_device *rte_dev) +{ + struct rte_dpaa2_device *dev = RTE_BUS_DEVICE(rte_dev, *dev); + + rte_intr_instance_free(dev->intr_handle); + free(dev); +} + +void +fslmc_bus_remove_device(struct rte_dpaa2_device *dev) +{ + rte_bus_remove_device(&rte_fslmc_bus, &dev->device); + fslmc_free_device(&dev->device); +} + static void dump_device_list(void) { @@ -402,11 +418,8 @@ rte_fslmc_scan(void) closedir(dir); /* Remove all devices in the list */ - RTE_BUS_FOREACH_DEV(dev, &rte_fslmc_bus) { - rte_bus_remove_device(&rte_fslmc_bus, &dev->device); - rte_intr_instance_free(dev->intr_handle); - free(dev); - } + RTE_BUS_FOREACH_DEV(dev, &rte_fslmc_bus) + fslmc_bus_remove_device(dev); scan_fail: DPAA2_BUS_DEBUG("FSLMC Bus Not Available. Skipping (%d)", ret); /* Irrespective of failure, scan only return success */ diff --git a/drivers/bus/fslmc/fslmc_vfio.c b/drivers/bus/fslmc/fslmc_vfio.c index 165e9444f5..6e0b35f391 100644 --- a/drivers/bus/fslmc/fslmc_vfio.c +++ b/drivers/bus/fslmc/fslmc_vfio.c @@ -1557,13 +1557,6 @@ fslmc_vfio_close_group(void) } RTE_BUS_FOREACH_DEV(dev, &rte_fslmc_bus) { - if (dev->device.devargs && - dev->device.devargs->policy == RTE_DEV_BLOCKED) { - DPAA2_BUS_LOG(DEBUG, "%s Blacklisted, skipping", - dev->device.name); - rte_bus_remove_device(&rte_fslmc_bus, &dev->device); - continue; - } switch (dev->dev_type) { case DPAA2_ETH: case DPAA2_CRYPTO: @@ -1625,8 +1618,7 @@ fslmc_vfio_process_group(void) dev->device.devargs->policy == RTE_DEV_BLOCKED) { DPAA2_BUS_LOG(DEBUG, "%s Blocked, skipping", dev->device.name); - rte_bus_remove_device(&rte_fslmc_bus, - &dev->device); + fslmc_bus_remove_device(dev); continue; } @@ -1634,8 +1626,7 @@ fslmc_vfio_process_group(void) !is_dpmcp_in_blocklist) { if (dpmcp_count == 1 || current_device != dpmcp_count) { - rte_bus_remove_device(&rte_fslmc_bus, - &dev->device); + fslmc_bus_remove_device(dev); continue; } } @@ -1649,9 +1640,7 @@ fslmc_vfio_process_group(void) found_mportal = 1; } - rte_bus_remove_device(&rte_fslmc_bus, &dev->device); - free(dev); - dev = NULL; + fslmc_bus_remove_device(dev); /* Ideally there is only a single dpmcp, but in case * multiple exists, looping on remaining devices. */ @@ -1675,7 +1664,7 @@ fslmc_vfio_process_group(void) DPAA2_BUS_ERR("Unable to process dprc"); return ret; } - rte_bus_remove_device(&rte_fslmc_bus, &dev->device); + fslmc_bus_remove_device(dev); } } @@ -1687,7 +1676,7 @@ fslmc_vfio_process_group(void) dev->device.devargs->policy == RTE_DEV_BLOCKED) { DPAA2_BUS_LOG(DEBUG, "%s Blocked, skipping", dev->device.name); - rte_bus_remove_device(&rte_fslmc_bus, &dev->device); + fslmc_bus_remove_device(dev); continue; } if (rte_eal_process_type() == RTE_PROC_SECONDARY && @@ -1695,7 +1684,7 @@ fslmc_vfio_process_group(void) dev->dev_type != DPAA2_CRYPTO && dev->dev_type != DPAA2_QDMA && dev->dev_type != DPAA2_IO) { - rte_bus_remove_device(&rte_fslmc_bus, &dev->device); + fslmc_bus_remove_device(dev); continue; } switch (dev->dev_type) { @@ -1737,14 +1726,12 @@ fslmc_vfio_process_group(void) if (!is_dpio_in_blocklist && dpio_count > 1) { if (rte_eal_process_type() == RTE_PROC_SECONDARY && current_device != dpio_count) { - rte_bus_remove_device(&rte_fslmc_bus, - &dev->device); + fslmc_bus_remove_device(dev); break; } if (rte_eal_process_type() == RTE_PROC_PRIMARY && current_device == dpio_count) { - rte_bus_remove_device(&rte_fslmc_bus, - &dev->device); + fslmc_bus_remove_device(dev); break; } } @@ -1762,9 +1749,7 @@ fslmc_vfio_process_group(void) /* Unknown - ignore */ DPAA2_BUS_DEBUG("Found unknown device (%s)", dev->device.name); - rte_bus_remove_device(&rte_fslmc_bus, &dev->device); - free(dev); - dev = NULL; + fslmc_bus_remove_device(dev); } } diff --git a/drivers/bus/fslmc/private.h b/drivers/bus/fslmc/private.h index 20a454c3fc..825a364f1b 100644 --- a/drivers/bus/fslmc/private.h +++ b/drivers/bus/fslmc/private.h @@ -11,4 +11,6 @@ extern struct rte_bus rte_fslmc_bus; +void fslmc_bus_remove_device(struct rte_dpaa2_device *dev); + #endif /* BUS_FSLMC_PRIVATE_H */ -- 2.54.0

