- /* DPDK currently doesn't provide API to map DMA memory for empty mempool
- so we are using this hack, will be nice to have at least API to get
- VFIO container FD */
- if (dbm->vfio_container_fd == -1)
- foreach_directory_file ("/proc/self/fd", scan_vfio_fd, 0, 0);
-
- if (dbm->vfio_container_fd != -1)
- {
- struct vfio_iommu_type1_dma_map dm = { 0 };
- int i, rv = 0;
- dm.argsz = sizeof (struct vfio_iommu_type1_dma_map);
- dm.flags = VFIO_DMA_MAP_FLAG_READ | VFIO_DMA_MAP_FLAG_WRITE;
-
- /* *INDENT-OFF* */
- vec_foreach_index (i, pr->page_table)
- {
- dm.vaddr = pointer_to_uword (pr->mem) + ((u64)i << pr->log2_page_size);
- dm.size = 1ull << pr->log2_page_size;
- dm.iova = pr->page_table[i];
- if ((rv = ioctl (dbm->vfio_container_fd, VFIO_IOMMU_MAP_DMA, &dm)))
- break;
- }
- /* *INDENT-ON* */
- if (rv != 0 && errno != EINVAL)
- clib_unix_warning ("ioctl(VFIO_IOMMU_MAP_DMA) pool '%s'", pool_name);
- }
-