diff --git a/lib/env_dpdk/memory.c b/lib/env_dpdk/memory.c index 8670c30ec..84dd81f2e 100644 --- a/lib/env_dpdk/memory.c +++ b/lib/env_dpdk/memory.c @@ -60,7 +60,6 @@ struct spdk_vfio_dma_map { struct vfio_iommu_type1_dma_map map; - struct vfio_iommu_type1_dma_unmap unmap; TAILQ_ENTRY(spdk_vfio_dma_map) tailq; }; @@ -820,11 +819,6 @@ vtophys_iommu_map_dma(uint64_t vaddr, uint64_t iova, uint64_t size) dma_map->map.iova = iova; dma_map->map.size = size; - dma_map->unmap.argsz = sizeof(dma_map->unmap); - dma_map->unmap.flags = 0; - dma_map->unmap.iova = iova; - dma_map->unmap.size = size; - pthread_mutex_lock(&g_vfio.mutex); if (g_vfio.device_ref == 0) { /* VFIO requires at least one device (IOMMU group) to be added to @@ -865,6 +859,7 @@ vtophys_iommu_unmap_dma(uint64_t iova, uint64_t size) struct spdk_vfio_dma_map *dma_map; uint64_t refcount; int ret; + struct vfio_iommu_type1_dma_unmap unmap = {}; pthread_mutex_lock(&g_vfio.mutex); TAILQ_FOREACH(dma_map, &g_vfio.maps, tailq) { @@ -899,8 +894,11 @@ vtophys_iommu_unmap_dma(uint64_t iova, uint64_t size) goto out_remove; } - - ret = ioctl(g_vfio.fd, VFIO_IOMMU_UNMAP_DMA, &dma_map->unmap); + unmap.argsz = sizeof(unmap); + unmap.flags = 0; + unmap.iova = dma_map->map.iova; + unmap.size = dma_map->map.size; + ret = ioctl(g_vfio.fd, VFIO_IOMMU_UNMAP_DMA, &unmap); if (ret) { DEBUG_PRINT("Cannot clear DMA mapping, error %d\n", errno); pthread_mutex_unlock(&g_vfio.mutex); @@ -1383,7 +1381,12 @@ vtophys_pci_device_removed(struct rte_pci_device *pci_device) * of other, external factors. */ TAILQ_FOREACH(dma_map, &g_vfio.maps, tailq) { - ret = ioctl(g_vfio.fd, VFIO_IOMMU_UNMAP_DMA, &dma_map->unmap); + struct vfio_iommu_type1_dma_unmap unmap = {}; + unmap.argsz = sizeof(unmap); + unmap.flags = 0; + unmap.iova = dma_map->map.iova; + unmap.size = dma_map->map.size; + ret = ioctl(g_vfio.fd, VFIO_IOMMU_UNMAP_DMA, &unmap); if (ret) { DEBUG_PRINT("Cannot unmap DMA memory, error %d\n", errno); break;