RTE_MAP_FORCE_ADDRESS);
}
+ /*
+ * Regarding "memreg[0].size == 0":
+ * If this BAR has MSI-X table, memreg[0].size (the
+ * first part or the part before the table) can
+ * legitimately be 0 for hardware using vector table
+ * offset 0 (i.e. first part does not exist).
+ *
+ * When memreg[0].size is 0, "mapping the first part"
+ * never happens, and map_addr is NULL at this
+ * point. So check that mapping has been actually
+ * attempted.
+ */
/* if there's a second part, try to map it */
- if (map_addr != MAP_FAILED
+ if ((map_addr != NULL || memreg[0].size == 0)
&& memreg[1].offset && memreg[1].size) {
void *second_addr = RTE_PTR_ADD(bar_addr,
(uintptr_t)(memreg[1].offset -
RTE_MAP_FORCE_ADDRESS);
}
- if (map_addr == NULL || map_addr == MAP_FAILED) {
+ if (map_addr == NULL) {
munmap(bar_addr, bar->size);
bar_addr = MAP_FAILED;
RTE_LOG(ERR, EAL, "Failed to map pci BAR%d\n",
}
}
- for (i = 0; i < (int) vfio_res->nb_maps; i++) {
+ for (i = 0; i < vfio_res->nb_maps; i++) {
struct vfio_region_info *reg = NULL;
void *bar_addr;
err_vfio_res:
rte_free(vfio_res);
err_vfio_dev_fd:
- close(vfio_dev_fd);
+ rte_vfio_release_device(rte_pci_get_sysfs_path(),
+ pci_addr, vfio_dev_fd);
return -1;
}
/* map BARs */
maps = vfio_res->maps;
- for (i = 0; i < (int) vfio_res->nb_maps; i++) {
+ for (i = 0; i < vfio_res->nb_maps; i++) {
ret = pci_vfio_mmap_bar(vfio_dev_fd, vfio_res, i, MAP_FIXED);
if (ret < 0) {
RTE_LOG(ERR, EAL, " %s mapping BAR%i failed: %s\n",
return 0;
err_vfio_dev_fd:
- close(vfio_dev_fd);
+ rte_vfio_release_device(rte_pci_get_sysfs_path(),
+ pci_addr, vfio_dev_fd);
return -1;
}
pci_addr);
maps = vfio_res->maps;
- for (i = 0; i < (int) vfio_res->nb_maps; i++) {
+ for (i = 0; i < vfio_res->nb_maps; i++) {
/*
* We do not need to be aware of MSI-X table BAR mappings as
}
TAILQ_REMOVE(vfio_res_list, vfio_res, next);
-
+ rte_free(vfio_res);
return 0;
}