On Thu, 10 Sept 2026 at 14:54, Anatoly Burakov <[email protected]> wrote: > > Currently, VFIO cleanup only unregisters multiprocess callback, but does > not destroy containers, groups, and user mem maps. Do all of that on VFIO > cleanup. In order to distinguish between config that is not initialized vs. > config that has been initialized but happens to have fd == 0, move the > global VFIO enabled flag out of the config, and add a separate per-config > "enabled" flag that can be checked to avoid attempting to clean up configs > that were never initialized in the first place. > > While we're at it, also harden the API against repeated initialization and > attempts at using the API without having VFIO initialized.
- At this point of the series, I don't see the need for this change. The default config vfio_enabled should be set to 0 and could serve the same purpose? - Should we reset vfio_enabled in rte_vfio_cleanup()? > > Signed-off-by: Anatoly Burakov <[email protected]> > --- > lib/eal/freebsd/eal.c | 3 +- > lib/eal/linux/eal_vfio.c | 151 +++++++++++++++++++++++++++++++++++++-- > 2 files changed, 147 insertions(+), 7 deletions(-) > > diff --git a/lib/eal/freebsd/eal.c b/lib/eal/freebsd/eal.c > index 991ca45064..aa6d4c2e16 100644 > --- a/lib/eal/freebsd/eal.c > +++ b/lib/eal/freebsd/eal.c > @@ -846,8 +846,7 @@ int rte_vfio_enable(__rte_unused const char *modname) > } > > RTE_EXPORT_INTERNAL_SYMBOL(rte_vfio_cleanup) > -void > -rte_vfio_cleanup(void) > +void rte_vfio_cleanup(void) > { > } > Nit: unrelated. > diff --git a/lib/eal/linux/eal_vfio.c b/lib/eal/linux/eal_vfio.c > index 6c77076bc3..d4173f7a01 100644 > --- a/lib/eal/linux/eal_vfio.c > +++ b/lib/eal/linux/eal_vfio.c [snip] > @@ -2218,9 +2296,72 @@ rte_vfio_container_dma_unmap(int container_fd, > uint64_t vaddr, uint64_t iova, > return container_dma_unmap(vfio_cfg, vaddr, iova, len); > } > > +static void > +vfio_cleanup_config(struct vfio_config *vfio_cfg) > +{ > + unsigned int i; > + > + for (i = 0; i < RTE_DIM(vfio_cfg->vfio_groups); i++) { > + struct vfio_group *group = &vfio_cfg->vfio_groups[i]; > + > + if (group->group_num == -1) > + continue; > + if (group->devices != 0) { > + EAL_LOG(ERR, "Cannot cleanup VFIO group %d with %d > devices", > + group->group_num, group->devices); > + return; Why stop? Should we continue for other groups? > + } > + if (group->fd >= 0 && close(group->fd) < 0) { > + EAL_LOG(ERR, "Cannot close VFIO group %d: %s", > + group->group_num, strerror(errno)); > + return; > + } > + > + group->group_num = -1; > + group->fd = -1; > + group->devices = 0; > + vfio_cfg->vfio_active_groups--; > + } > + > + /* if there are still active groups, we cannot cleanup the container > */ > + if (vfio_cfg->vfio_active_groups != 0) { > + EAL_LOG(ERR, "Cannot cleanup VFIO container with %d active > groups", > + vfio_cfg->vfio_active_groups); > + return; > + } > + > + if (vfio_cfg->vfio_container_fd >= 0 && > + close(vfio_cfg->vfio_container_fd) < 0) { > + EAL_LOG(ERR, "Cannot close VFIO container: %s", > strerror(errno)); > + return; > + } > + > + vfio_cfg->vfio_container_fd = -1; > + vfio_cfg->enabled = false; > + vfio_cfg->vfio_iommu_type = NULL; > + > + vfio_cfg->mem_maps.n_maps = 0; > + memset(vfio_cfg->mem_maps.maps, 0, sizeof(vfio_cfg->mem_maps.maps)); > +} -- David Marchand

