On Wed, 3 Jul 2024 19:59:43 +0800 "BillXiang" <xiangwench...@dayudpu.com> wrote:
> From: BillXiang <xiangwench...@dayudpu.com> > > For multi-devices in one group we can only create and bind to one > container. With this new function, device driver does not need to > save the binding info additionally between different devices. > > Signed-off-by: BillXiang <xiangwench...@dayudpu.com> Ok, but where is the device driver using it? DPDK upstream doesn't want to keep API's for drivers that are not upstream. > --- > lib/eal/include/rte_vfio.h | 17 +++++++++++++++++ > lib/eal/linux/eal_vfio.c | 24 ++++++++++++++++++++++++ > lib/eal/version.map | 3 +++ > 3 files changed, 44 insertions(+) > > diff --git a/lib/eal/include/rte_vfio.h b/lib/eal/include/rte_vfio.h > index b774625d9f..f6743b3620 100644 > --- a/lib/eal/include/rte_vfio.h > +++ b/lib/eal/include/rte_vfio.h > @@ -407,6 +407,23 @@ int > rte_vfio_container_dma_unmap(int container_fd, uint64_t vaddr, > uint64_t iova, uint64_t len); > > +/** > + * Get vfio group fd bound with container fd for certain iommu group. > + * > + * @param iommu_group_num > + * iommu group num > + * @param vfio_group_fd > + * vfio group fd of the iommu group. > + * @param vfio_container_fd > + * vfio container fd of the iommu group. > + * @return > + * 0 if successful > + * <0 if failed > + */ > +__rte_experimental > +int > +rte_vfio_get_fd(int iommu_group_num, int *vfio_group_fd, int > *vfio_container_fd); > + > #ifdef __cplusplus > } > #endif > diff --git a/lib/eal/linux/eal_vfio.c b/lib/eal/linux/eal_vfio.c > index 4e69e72e3b..08510df7e2 100644 > --- a/lib/eal/linux/eal_vfio.c > +++ b/lib/eal/linux/eal_vfio.c > @@ -2196,3 +2196,27 @@ rte_vfio_container_dma_unmap(int container_fd, > uint64_t vaddr, uint64_t iova, > > return container_dma_unmap(vfio_cfg, vaddr, iova, len); > } > + > +int > +rte_vfio_get_fd(int iommu_group_num, int *vfio_group_fd, int > *vfio_container_fd) > +{ > + struct vfio_config *vfio_cfg; > + vfio_cfg = get_vfio_cfg_by_group_num(iommu_group_num); > + /* do not create new container if the group has bound with one */ prefer blank line after declaration > + if (vfio_cfg) { > + *vfio_container_fd = vfio_cfg->vfio_container_fd; > + } else { > + *vfio_container_fd = rte_vfio_container_create(); > + if (*vfio_container_fd < 0) > + goto err; If no unwind necessary, then skip the goto and just return -1; > + > + vfio_cfg = get_vfio_cfg_by_container_fd(*vfio_container_fd); > + } > + *vfio_group_fd = vfio_get_group_fd(vfio_cfg, iommu_group_num); > + if (*vfio_group_fd < 0) > + goto err; ditto > + > + return 0; > +err: > + return -1; > +} > diff --git a/lib/eal/version.map b/lib/eal/version.map > index 3df50c3fbb..f26b65a504 100644 > --- a/lib/eal/version.map > +++ b/lib/eal/version.map > @@ -396,6 +396,9 @@ EXPERIMENTAL { > > # added in 24.03 > rte_vfio_get_device_info; # WINDOWS_NO_EXPORT > + > + # added in 24.07 > + rte_vfio_get_fd; # WINDOWS_NO_EXPORT > }; > > INTERNAL {