vfio/type1: use memseg walk instead of iteration
authorAnatoly Burakov <anatoly.burakov@intel.com>
Wed, 11 Apr 2018 12:30:07 +0000 (13:30 +0100)
committerThomas Monjalon <thomas@monjalon.net>
Wed, 11 Apr 2018 17:53:08 +0000 (19:53 +0200)
Reduce dependency on internal details of EAL memory subsystem, and
simplify code.

Signed-off-by: Anatoly Burakov <anatoly.burakov@intel.com>
Tested-by: Santosh Shukla <santosh.shukla@caviumnetworks.com>
Tested-by: Hemant Agrawal <hemant.agrawal@nxp.com>
Tested-by: Gowrishankar Muthukrishnan <gowrishankar.m@linux.vnet.ibm.com>
lib/librte_eal/linuxapp/eal/eal_vfio.c

index 2421d51..2a34ae9 100644 (file)
@@ -665,38 +665,35 @@ vfio_get_group_no(const char *sysfs_base,
 }
 
 static int
-vfio_type1_dma_map(int vfio_container_fd)
+type1_map(const struct rte_memseg *ms, void *arg)
 {
-       const struct rte_memseg *ms = rte_eal_get_physmem_layout();
-       int i, ret;
+       int *vfio_container_fd = arg;
+       struct vfio_iommu_type1_dma_map dma_map;
+       int ret;
 
-       /* map all DPDK segments for DMA. use 1:1 PA to IOVA mapping */
-       for (i = 0; i < RTE_MAX_MEMSEG; i++) {
-               struct vfio_iommu_type1_dma_map dma_map;
+       memset(&dma_map, 0, sizeof(dma_map));
+       dma_map.argsz = sizeof(struct vfio_iommu_type1_dma_map);
+       dma_map.vaddr = ms->addr_64;
+       dma_map.size = ms->len;
+       dma_map.iova = ms->iova;
+       dma_map.flags = VFIO_DMA_MAP_FLAG_READ | VFIO_DMA_MAP_FLAG_WRITE;
 
-               if (ms[i].addr == NULL)
-                       break;
-
-               memset(&dma_map, 0, sizeof(dma_map));
-               dma_map.argsz = sizeof(struct vfio_iommu_type1_dma_map);
-               dma_map.vaddr = ms[i].addr_64;
-               dma_map.size = ms[i].len;
-               dma_map.iova = ms[i].iova;
-               dma_map.flags = VFIO_DMA_MAP_FLAG_READ | VFIO_DMA_MAP_FLAG_WRITE;
+       ret = ioctl(*vfio_container_fd, VFIO_IOMMU_MAP_DMA, &dma_map);
 
-               ret = ioctl(vfio_container_fd, VFIO_IOMMU_MAP_DMA, &dma_map);
-
-               if (ret) {
-                       RTE_LOG(ERR, EAL, "  cannot set up DMA remapping, "
-                                         "error %i (%s)\n", errno,
-                                         strerror(errno));
-                       return -1;
-               }
+       if (ret) {
+               RTE_LOG(ERR, EAL, "  cannot set up DMA remapping, error %i (%s)\n",
+                               errno, strerror(errno));
+               return -1;
        }
-
        return 0;
 }
 
+static int
+vfio_type1_dma_map(int vfio_container_fd)
+{
+       return rte_memseg_walk(type1_map, &vfio_container_fd);
+}
+
 static int
 vfio_spapr_dma_map(int vfio_container_fd)
 {