[RFC 04/11] bus/fslmc: fix memory leaks in scan
David Marchand
david.marchand at redhat.com
Thu Jul 23 15:53:52 CEST 2026
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 <david.marchand at redhat.com>
---
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
More information about the dev
mailing list