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

Reply via email to