Currently, resources in VFIO (such as groups or devices) are tracked for
first/last usage due to things needing to happen on first/last reference.
Use EAL usage counters instead of manual arithmetic and checks.

Signed-off-by: Anatoly Burakov <[email protected]>
---
 lib/eal/linux/eal_vfio.c       |  7 ++-----
 lib/eal/linux/eal_vfio.h       |  5 +++--
 lib/eal/linux/eal_vfio_group.c | 11 ++++-------
 3 files changed, 9 insertions(+), 14 deletions(-)

diff --git a/lib/eal/linux/eal_vfio.c b/lib/eal/linux/eal_vfio.c
index fdf500cd5b..056795a6e4 100644
--- a/lib/eal/linux/eal_vfio.c
+++ b/lib/eal/linux/eal_vfio.c
@@ -1125,11 +1125,8 @@ dev_vfio_release_device(const char *sysfs_base 
__rte_unused, const char *dev_add
                /* close device handle */
                vfio_device_erase(cfg, dev);
 
-               /* remove device from group */
-               grp->n_devices--;
-
-               /* was this the last device? */
-               if (grp->n_devices == 0)
+               /* remove device from group, erase the group if it was the last 
device */
+               if (rte_usage_count_release(&grp->n_devices))
                        vfio_group_erase(cfg, grp);
 
                /* if no more groups left, remove callback */
diff --git a/lib/eal/linux/eal_vfio.h b/lib/eal/linux/eal_vfio.h
index 980bdae0ba..8aaff4f335 100644
--- a/lib/eal/linux/eal_vfio.h
+++ b/lib/eal/linux/eal_vfio.h
@@ -7,6 +7,7 @@
 
 #include <rte_common.h>
 #include <rte_spinlock.h>
+#include <rte_usage_count.h>
 
 #include <stdint.h>
 
@@ -42,7 +43,7 @@ struct vfio_group {
        bool active;
        int group_num;
        int fd;
-       int n_devices;
+       rte_usage_count_t n_devices;
 };
 
 /* device tracking (common for group and cdev modes) */
@@ -66,7 +67,7 @@ struct vfio_device {
 struct vfio_group_config {
        bool iommu_type_set;
        bool mem_event_clb_set;
-       size_t n_groups;
+       rte_usage_count_t n_groups;
        struct vfio_group groups[RTE_MAX_VFIO_GROUPS];
 };
 
diff --git a/lib/eal/linux/eal_vfio_group.c b/lib/eal/linux/eal_vfio_group.c
index 7c879830ac..55ada5046b 100644
--- a/lib/eal/linux/eal_vfio_group.c
+++ b/lib/eal/linux/eal_vfio_group.c
@@ -508,7 +508,7 @@ vfio_group_create(struct vfio_container *cfg, int 
iommu_group)
        VFIO_GROUP_FOREACH(cfg, grp) {
                if (grp->active)
                        continue;
-               cfg->group_cfg.n_groups++;
+               rte_usage_count_claim(&cfg->group_cfg.n_groups);
                grp->active = true;
                grp->group_num = iommu_group;
                grp->fd = -1;
@@ -527,10 +527,8 @@ vfio_group_erase(struct vfio_container *cfg, struct 
vfio_group *grp)
                EAL_LOG(ERR, "Error when closing group fd %d", grp->fd);
 
        *grp = (struct vfio_group){0};
-       group_cfg->n_groups--;
-
-       /* if this was the last group in config, erase IOMMU setup and 
unregister callback */
-       if (group_cfg->n_groups == 0) {
+       /* if this was the last group in config, erase IOMMU setup */
+       if (rte_usage_count_release(&group_cfg->n_groups)) {
                cfg->dma_setup_done = false;
                group_cfg->iommu_type_set = false;
        }
@@ -880,8 +878,7 @@ vfio_group_setup_device_fd(const char *dev_addr, struct 
vfio_group *grp, struct
        dev->fd = fd;
        /* store backreference to group */
        dev->group = grp->group_num;
-       /* increment number of devices in group */
-       grp->n_devices++;
+       rte_usage_count_claim(&grp->n_devices);
        return 0;
 }
 
-- 
2.52.0

Reply via email to