vfio: support iommu group zero

The current implementation of VFIO will not with the new no-IOMMU mode
in 4.4 kernel. The original code assumed that IOMMU group zero would
never be used. Group numbers are assigned starting at zero, and up
until now the group numbers came from the hardware which is likely
to use group 0 for system devices that are not used with DPDK.

The fix is to allow 0 as a valid group and rearrange code
to split the return value from the group value.

Signed-off-by: Stephen Hemminger <stephen@networkplumber.org>
Acked-by: Anatoly Burakov <anatoly.burakov@intel.com>
This commit is contained in:
Stephen Hemminger 2015-12-09 09:55:56 -08:00 committed by Thomas Monjalon
parent 1befe9ca24
commit 22215f141b

View File

@ -499,14 +499,15 @@ pci_vfio_get_group_fd(int iommu_group_no)
}
/* parse IOMMU group number for a PCI device
* returns -1 for errors, 0 for non-existent group */
* returns 1 on success, -1 for errors, 0 for non-existent group
*/
static int
pci_vfio_get_group_no(const char *pci_addr)
pci_vfio_get_group_no(const char *pci_addr, int *iommu_group_no)
{
char linkname[PATH_MAX];
char filename[PATH_MAX];
char *tok[16], *group_tok, *end;
int ret, iommu_group_no;
int ret;
memset(linkname, 0, sizeof(linkname));
memset(filename, 0, sizeof(filename));
@ -533,13 +534,13 @@ pci_vfio_get_group_no(const char *pci_addr)
errno = 0;
group_tok = tok[ret - 1];
end = group_tok;
iommu_group_no = strtol(group_tok, &end, 10);
*iommu_group_no = strtol(group_tok, &end, 10);
if ((end != group_tok && *end != '\0') || errno != 0) {
RTE_LOG(ERR, EAL, " %s error parsing IOMMU number!\n", pci_addr);
return -1;
}
return iommu_group_no;
return 1;
}
static void
@ -581,16 +582,15 @@ pci_vfio_map_resource(struct rte_pci_device *dev)
loc->domain, loc->bus, loc->devid, loc->function);
/* get group number */
iommu_group_no = pci_vfio_get_group_no(pci_addr);
/* if 0, group doesn't exist */
if (iommu_group_no == 0) {
ret = pci_vfio_get_group_no(pci_addr, &iommu_group_no);
if (ret == 0) {
RTE_LOG(WARNING, EAL, " %s not managed by VFIO driver, skipping\n",
pci_addr);
pci_addr);
return 1;
}
/* if negative, something failed */
else if (iommu_group_no < 0)
if (ret < 0)
return -1;
/* get the actual group fd */