mem: allow memseg lists to be marked as external
[dpdk.git] / lib / librte_eal / linuxapp / eal / eal_vfio.c
index 10d6b29..fddbc3b 100644 (file)
@@ -1082,11 +1082,14 @@ rte_vfio_get_group_num(const char *sysfs_base,
 }
 
 static int
-type1_map(const struct rte_memseg_list *msl __rte_unused,
-               const struct rte_memseg *ms, void *arg)
+type1_map(const struct rte_memseg_list *msl, const struct rte_memseg *ms,
+               void *arg)
 {
        int *vfio_container_fd = arg;
 
+       if (msl->external)
+               return 0;
+
        return vfio_type1_dma_mem_map(*vfio_container_fd, ms->addr_64, ms->iova,
                        ms->len, 1);
 }
@@ -1196,11 +1199,14 @@ vfio_spapr_dma_do_map(int vfio_container_fd, uint64_t vaddr, uint64_t iova,
 }
 
 static int
-vfio_spapr_map_walk(const struct rte_memseg_list *msl __rte_unused,
+vfio_spapr_map_walk(const struct rte_memseg_list *msl,
                const struct rte_memseg *ms, void *arg)
 {
        int *vfio_container_fd = arg;
 
+       if (msl->external)
+               return 0;
+
        return vfio_spapr_dma_mem_map(*vfio_container_fd, ms->addr_64, ms->iova,
                        ms->len, 1);
 }
@@ -1210,12 +1216,15 @@ struct spapr_walk_param {
        uint64_t hugepage_sz;
 };
 static int
-vfio_spapr_window_size_walk(const struct rte_memseg_list *msl __rte_unused,
+vfio_spapr_window_size_walk(const struct rte_memseg_list *msl,
                const struct rte_memseg *ms, void *arg)
 {
        struct spapr_walk_param *param = arg;
        uint64_t max = ms->iova + ms->len;
 
+       if (msl->external)
+               return 0;
+
        if (max > param->window_size) {
                param->hugepage_sz = ms->hugepage_sz;
                param->window_size = max;
@@ -1562,7 +1571,7 @@ out:
        return ret;
 }
 
-int __rte_experimental
+int
 rte_vfio_dma_map(uint64_t vaddr, uint64_t iova, uint64_t len)
 {
        if (len == 0) {
@@ -1573,7 +1582,7 @@ rte_vfio_dma_map(uint64_t vaddr, uint64_t iova, uint64_t len)
        return container_dma_map(default_vfio_cfg, vaddr, iova, len);
 }
 
-int __rte_experimental
+int
 rte_vfio_dma_unmap(uint64_t vaddr, uint64_t iova, uint64_t len)
 {
        if (len == 0) {
@@ -1616,7 +1625,7 @@ rte_vfio_noiommu_is_enabled(void)
        return c == 'Y';
 }
 
-int __rte_experimental
+int
 rte_vfio_container_create(void)
 {
        int i;
@@ -1666,7 +1675,7 @@ rte_vfio_container_destroy(int container_fd)
        return 0;
 }
 
-int __rte_experimental
+int
 rte_vfio_container_group_bind(int container_fd, int iommu_group_num)
 {
        struct vfio_config *vfio_cfg;
@@ -1712,7 +1721,7 @@ rte_vfio_container_group_bind(int container_fd, int iommu_group_num)
        return vfio_group_fd;
 }
 
-int __rte_experimental
+int
 rte_vfio_container_group_unbind(int container_fd, int iommu_group_num)
 {
        struct vfio_config *vfio_cfg;
@@ -1751,7 +1760,7 @@ rte_vfio_container_group_unbind(int container_fd, int iommu_group_num)
        return 0;
 }
 
-int __rte_experimental
+int
 rte_vfio_container_dma_map(int container_fd, uint64_t vaddr, uint64_t iova,
                uint64_t len)
 {
@@ -1771,7 +1780,7 @@ rte_vfio_container_dma_map(int container_fd, uint64_t vaddr, uint64_t iova,
        return container_dma_map(vfio_cfg, vaddr, iova, len);
 }
 
-int __rte_experimental
+int
 rte_vfio_container_dma_unmap(int container_fd, uint64_t vaddr, uint64_t iova,
                uint64_t len)
 {
@@ -1793,14 +1802,14 @@ rte_vfio_container_dma_unmap(int container_fd, uint64_t vaddr, uint64_t iova,
 
 #else
 
-int __rte_experimental
+int
 rte_vfio_dma_map(uint64_t __rte_unused vaddr, __rte_unused uint64_t iova,
                  __rte_unused uint64_t len)
 {
        return -1;
 }
 
-int __rte_experimental
+int
 rte_vfio_dma_unmap(uint64_t __rte_unused vaddr, uint64_t __rte_unused iova,
                    __rte_unused uint64_t len)
 {
@@ -1847,7 +1856,7 @@ rte_vfio_clear_group(__rte_unused int vfio_group_fd)
        return -1;
 }
 
-int __rte_experimental
+int
 rte_vfio_get_group_num(__rte_unused const char *sysfs_base,
                __rte_unused const char *dev_addr,
                __rte_unused int *iommu_group_num)
@@ -1855,45 +1864,45 @@ rte_vfio_get_group_num(__rte_unused const char *sysfs_base,
        return -1;
 }
 
-int __rte_experimental
+int
 rte_vfio_get_container_fd(void)
 {
        return -1;
 }
 
-int __rte_experimental
+int
 rte_vfio_get_group_fd(__rte_unused int iommu_group_num)
 {
        return -1;
 }
 
-int __rte_experimental
+int
 rte_vfio_container_create(void)
 {
        return -1;
 }
 
-int __rte_experimental
+int
 rte_vfio_container_destroy(__rte_unused int container_fd)
 {
        return -1;
 }
 
-int __rte_experimental
+int
 rte_vfio_container_group_bind(__rte_unused int container_fd,
                __rte_unused int iommu_group_num)
 {
        return -1;
 }
 
-int __rte_experimental
+int
 rte_vfio_container_group_unbind(__rte_unused int container_fd,
                __rte_unused int iommu_group_num)
 {
        return -1;
 }
 
-int __rte_experimental
+int
 rte_vfio_container_dma_map(__rte_unused int container_fd,
                __rte_unused uint64_t vaddr,
                __rte_unused uint64_t iova,
@@ -1902,7 +1911,7 @@ rte_vfio_container_dma_map(__rte_unused int container_fd,
        return -1;
 }
 
-int __rte_experimental
+int
 rte_vfio_container_dma_unmap(__rte_unused int container_fd,
                __rte_unused uint64_t vaddr,
                __rte_unused uint64_t iova,