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]> --- drivers/bus/fslmc/fslmc_bus.c | 15 ++++++++++----- drivers/bus/fslmc/fslmc_vfio.c | 33 +++++++++------------------------ drivers/bus/fslmc/private.h | 2 ++ 3 files changed, 21 insertions(+), 29 deletions(-) diff --git a/drivers/bus/fslmc/fslmc_bus.c b/drivers/bus/fslmc/fslmc_bus.c index 4518f038c6..94685a0f5a 100644 --- a/drivers/bus/fslmc/fslmc_bus.c +++ b/drivers/bus/fslmc/fslmc_bus.c @@ -85,6 +85,14 @@ insert_in_device_list(struct rte_dpaa2_device *newdev) rte_bus_add_device(&rte_fslmc_bus, &newdev->device); } +void +fslmc_bus_remove_device(struct rte_dpaa2_device *dev) +{ + rte_bus_remove_device(&rte_fslmc_bus, &dev->device); + rte_intr_instance_free(dev->intr_handle); + free(dev); +} + static void dump_device_list(void) { @@ -403,11 +411,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 412b70e5ae..3e45a8ed5c 100644 --- a/drivers/bus/fslmc/fslmc_vfio.c +++ b/drivers/bus/fslmc/fslmc_vfio.c @@ -1555,13 +1555,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: @@ -1623,8 +1616,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; } @@ -1632,8 +1624,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; } } @@ -1647,9 +1638,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. */ @@ -1673,7 +1662,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); } } @@ -1685,7 +1674,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 && @@ -1693,7 +1682,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) { @@ -1735,14 +1724,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; } } @@ -1760,9 +1747,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

