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

