DPDK-dev Archive on lore.kernel.org
 help / color / mirror / Atom feed
From: David Marchand <david.marchand@redhat.com>
To: dev@dpdk.org
Cc: Anatoly Burakov <anatoly.burakov@intel.com>
Subject: [RESEND][PATCH v19 20/26] vfio: separate group-based IOMMU types
Date: Wed,  7 Oct 2026 10:10:17 +0200	[thread overview]
Message-ID: <20261007081026.574382-21-david.marchand@redhat.com> (raw)
In-Reply-To: <20261007081026.574382-1-david.marchand@redhat.com>

From: Anatoly Burakov <anatoly.burakov@intel.com>

Move group-based IOMMU types to a new file.

Notes:
- vfio_has_supported_extensions won't close vfio_container_fd anymore,
  this is consolidated in its caller,
- as we switched to an imported uapi header for VFIO some time ago,
  there is no need to check VFIO_IOMMU_SPAPR_INFO_DDW anymore,

Signed-off-by: Anatoly Burakov <anatoly.burakov@intel.com>
Signed-off-by: David Marchand <david.marchand@redhat.com>
---
 lib/eal/linux/eal_vfio.c       | 524 +--------------------------------
 lib/eal/linux/eal_vfio.h       |   2 +
 lib/eal/linux/eal_vfio_group.c | 521 ++++++++++++++++++++++++++++++++
 lib/eal/linux/meson.build      |   1 +
 4 files changed, 525 insertions(+), 523 deletions(-)
 create mode 100644 lib/eal/linux/eal_vfio_group.c

diff --git a/lib/eal/linux/eal_vfio.c b/lib/eal/linux/eal_vfio.c
index 7ad8a22cbb..bd267d1796 100644
--- a/lib/eal/linux/eal_vfio.c
+++ b/lib/eal/linux/eal_vfio.c
@@ -81,46 +81,12 @@ vfio_check_module(enum dev_vfio_module module)
 	return 1;
 }
 
-static int vfio_type1_dma_map(struct vfio_container *);
-static int vfio_type1_dma_mem_map(struct vfio_container *, uint64_t, uint64_t, uint64_t, int);
-static int vfio_spapr_dma_map(struct vfio_container *);
-static int vfio_spapr_dma_mem_map(struct vfio_container *, uint64_t, uint64_t, uint64_t, int);
-static int vfio_noiommu_dma_map(struct vfio_container *);
-static int vfio_noiommu_dma_mem_map(struct vfio_container *, uint64_t, uint64_t, uint64_t, int);
 static int vfio_dma_mem_map(struct vfio_container *cfg, uint64_t vaddr, uint64_t iova,
 		uint64_t len, int do_map);
 
 static int vfio_container_group_bind(int container_fd, int iommu_group_num);
 static int vfio_container_group_unbind(int container_fd, int iommu_group_num);
 
-/* IOMMU types we support */
-static const struct vfio_iommu_ops iommu_types[] = {
-	/* x86 IOMMU, otherwise known as type 1 */
-	{
-		.type_id = VFIO_TYPE1_IOMMU,
-		.name = "Type 1",
-		.partial_unmap = false,
-		.dma_map_func = &vfio_type1_dma_map,
-		.dma_user_map_func = &vfio_type1_dma_mem_map
-	},
-	/* ppc64 IOMMU, otherwise known as spapr */
-	{
-		.type_id = VFIO_SPAPR_TCE_v2_IOMMU,
-		.name = "sPAPR",
-		.partial_unmap = true,
-		.dma_map_func = &vfio_spapr_dma_map,
-		.dma_user_map_func = &vfio_spapr_dma_mem_map
-	},
-	/* IOMMU-less mode */
-	{
-		.type_id = VFIO_NOIOMMU_IOMMU,
-		.name = "No-IOMMU",
-		.partial_unmap = true,
-		.dma_map_func = &vfio_noiommu_dma_map,
-		.dma_user_map_func = &vfio_noiommu_dma_mem_map
-	},
-};
-
 static int
 is_null_map(const struct vfio_user_mem_map *map)
 {
@@ -1205,29 +1171,6 @@ vfio_get_iommu_type(void)
 	return vfio_global_cfg.ops->type_id;
 }
 
-const struct vfio_iommu_ops *
-vfio_set_iommu_type(int vfio_container_fd)
-{
-	unsigned idx;
-	for (idx = 0; idx < RTE_DIM(iommu_types); idx++) {
-		const struct vfio_iommu_ops *t = &iommu_types[idx];
-
-		int ret = ioctl(vfio_container_fd, VFIO_SET_IOMMU,
-				t->type_id);
-		if (!ret) {
-			EAL_LOG(INFO, "Using IOMMU type %d (%s)",
-					t->type_id, t->name);
-			return t;
-		}
-		/* not an error, there may be more supported IOMMU types */
-		EAL_LOG(DEBUG, "Set IOMMU type %d (%s) failed, error "
-				"%i (%s)", t->type_id, t->name, errno,
-				strerror(errno));
-	}
-	/* if we didn't find a suitable IOMMU type, fail */
-	return NULL;
-}
-
 RTE_EXPORT_INTERNAL_SYMBOL(dev_vfio_get_device_info)
 int
 dev_vfio_get_device_info(int vfio_dev_fd, struct vfio_device_info *device_info)
@@ -1249,39 +1192,6 @@ dev_vfio_get_device_info(int vfio_dev_fd, struct vfio_device_info *device_info)
 	return 0;
 }
 
-int
-vfio_has_supported_extensions(int vfio_container_fd)
-{
-	int ret;
-	unsigned idx, n_extensions = 0;
-	for (idx = 0; idx < RTE_DIM(iommu_types); idx++) {
-		const struct vfio_iommu_ops *t = &iommu_types[idx];
-
-		ret = ioctl(vfio_container_fd, VFIO_CHECK_EXTENSION,
-				t->type_id);
-		if (ret < 0) {
-			EAL_LOG(ERR, "Could not get IOMMU type, error "
-					"%i (%s)", errno, strerror(errno));
-			close(vfio_container_fd);
-			return -1;
-		} else if (ret == 1) {
-			/* we found a supported extension */
-			n_extensions++;
-		}
-		EAL_LOG(DEBUG, "IOMMU type %d (%s) is %s",
-				t->type_id, t->name,
-				ret ? "supported" : "not supported");
-	}
-
-	/* if we didn't find any supported IOMMU types, fail */
-	if (!n_extensions) {
-		close(vfio_container_fd);
-		return -1;
-	}
-
-	return 0;
-}
-
 /*
  * Open a new VFIO container fd.
  *
@@ -1325,6 +1235,7 @@ vfio_open_container_fd(bool mp_request)
 		if (ret) {
 			EAL_LOG(ERR,
 				"No supported IOMMU extensions found!");
+			close(vfio_container_fd);
 			return -1;
 		}
 
@@ -1417,439 +1328,6 @@ dev_vfio_get_group_num(const char *sysfs_base,
 	return 1;
 }
 
-static int
-type1_map(const struct rte_memseg_list *msl, const struct rte_memseg *ms, void *arg)
-{
-	struct vfio_container *cfg = arg;
-
-	/* skip external memory that isn't a heap */
-	if (msl->external && !msl->heap)
-		return 0;
-
-	/* skip any segments with invalid IOVA addresses */
-	if (ms->iova == RTE_BAD_IOVA)
-		return 0;
-
-	return vfio_type1_dma_mem_map(cfg, ms->addr_64, ms->iova, ms->len, 1);
-}
-
-static int
-vfio_type1_dma_mem_map(struct vfio_container *cfg, uint64_t vaddr, uint64_t iova, uint64_t len,
-		int do_map)
-{
-	struct vfio_iommu_type1_dma_map dma_map;
-	struct vfio_iommu_type1_dma_unmap dma_unmap;
-	int ret;
-
-	if (do_map != 0) {
-		memset(&dma_map, 0, sizeof(dma_map));
-		dma_map.argsz = sizeof(struct vfio_iommu_type1_dma_map);
-		dma_map.vaddr = vaddr;
-		dma_map.size = len;
-		dma_map.iova = iova;
-		dma_map.flags = VFIO_DMA_MAP_FLAG_READ |
-				VFIO_DMA_MAP_FLAG_WRITE;
-
-		ret = ioctl(cfg->container_fd, VFIO_IOMMU_MAP_DMA, &dma_map);
-		if (ret) {
-			/**
-			 * In case the mapping was already done EEXIST will be
-			 * returned from kernel.
-			 */
-			if (errno == EEXIST) {
-				EAL_LOG(DEBUG,
-					"Memory segment is already mapped, skipping");
-			} else {
-				EAL_LOG(ERR,
-					"Cannot set up DMA remapping, error "
-					"%i (%s)", errno, strerror(errno));
-				return -1;
-			}
-		}
-	} else {
-		memset(&dma_unmap, 0, sizeof(dma_unmap));
-		dma_unmap.argsz = sizeof(struct vfio_iommu_type1_dma_unmap);
-		dma_unmap.size = len;
-		dma_unmap.iova = iova;
-
-		ret = ioctl(cfg->container_fd, VFIO_IOMMU_UNMAP_DMA, &dma_unmap);
-		if (ret) {
-			EAL_LOG(ERR, "Cannot clear DMA remapping, error "
-					"%i (%s)", errno, strerror(errno));
-			return -1;
-		} else if (dma_unmap.size != len) {
-			EAL_LOG(ERR, "Unexpected size %"PRIu64
-				" of DMA remapping cleared instead of %"PRIu64,
-				(uint64_t)dma_unmap.size, len);
-			rte_errno = EIO;
-			return -1;
-		}
-	}
-
-	return 0;
-}
-
-static int
-vfio_type1_dma_map(struct vfio_container *cfg)
-{
-	return rte_memseg_walk(type1_map, cfg);
-}
-
-/* Track the size of the statically allocated DMA window for SPAPR */
-uint64_t spapr_dma_win_len;
-uint64_t spapr_dma_win_page_sz;
-
-static int
-vfio_spapr_dma_do_map(struct vfio_container *cfg, uint64_t vaddr, uint64_t iova, uint64_t len,
-		int do_map)
-{
-	struct vfio_iommu_spapr_register_memory reg = {
-		.argsz = sizeof(reg),
-		.vaddr = (uintptr_t) vaddr,
-		.size = len,
-		.flags = 0
-	};
-	int ret;
-
-	if (do_map != 0) {
-		struct vfio_iommu_type1_dma_map dma_map;
-
-		if (iova + len > spapr_dma_win_len) {
-			EAL_LOG(ERR, "DMA map attempt outside DMA window");
-			return -1;
-		}
-
-		ret = ioctl(cfg->container_fd, VFIO_IOMMU_SPAPR_REGISTER_MEMORY, &reg);
-		if (ret) {
-			EAL_LOG(ERR,
-				"Cannot register vaddr for IOMMU, error "
-				"%i (%s)", errno, strerror(errno));
-			return -1;
-		}
-
-		memset(&dma_map, 0, sizeof(dma_map));
-		dma_map.argsz = sizeof(struct vfio_iommu_type1_dma_map);
-		dma_map.vaddr = vaddr;
-		dma_map.size = len;
-		dma_map.iova = iova;
-		dma_map.flags = VFIO_DMA_MAP_FLAG_READ |
-				VFIO_DMA_MAP_FLAG_WRITE;
-
-		ret = ioctl(cfg->container_fd, VFIO_IOMMU_MAP_DMA, &dma_map);
-		if (ret) {
-			EAL_LOG(ERR, "Cannot map vaddr for IOMMU, error "
-					"%i (%s)", errno, strerror(errno));
-			return -1;
-		}
-
-	} else {
-		struct vfio_iommu_type1_dma_map dma_unmap;
-
-		memset(&dma_unmap, 0, sizeof(dma_unmap));
-		dma_unmap.argsz = sizeof(struct vfio_iommu_type1_dma_unmap);
-		dma_unmap.size = len;
-		dma_unmap.iova = iova;
-
-		ret = ioctl(cfg->container_fd, VFIO_IOMMU_UNMAP_DMA, &dma_unmap);
-		if (ret) {
-			EAL_LOG(ERR, "Cannot unmap vaddr for IOMMU, error "
-					"%i (%s)", errno, strerror(errno));
-			return -1;
-		}
-
-		ret = ioctl(cfg->container_fd, VFIO_IOMMU_SPAPR_UNREGISTER_MEMORY, &reg);
-		if (ret) {
-			EAL_LOG(ERR,
-				"Cannot unregister vaddr for IOMMU, error "
-				"%i (%s)", errno, strerror(errno));
-			return -1;
-		}
-	}
-
-	return ret;
-}
-
-static int
-vfio_spapr_map_walk(const struct rte_memseg_list *msl, const struct rte_memseg *ms, void *arg)
-{
-	struct vfio_container *cfg = arg;
-
-	/* skip external memory that isn't a heap */
-	if (msl->external && !msl->heap)
-		return 0;
-
-	/* skip any segments with invalid IOVA addresses */
-	if (ms->iova == RTE_BAD_IOVA)
-		return 0;
-
-	return vfio_spapr_dma_do_map(cfg, ms->addr_64, ms->iova, ms->len, 1);
-}
-
-struct spapr_size_walk_param {
-	uint64_t max_va;
-	uint64_t page_sz;
-	bool is_user_managed;
-};
-
-/*
- * In order to set the DMA window size required for the SPAPR IOMMU
- * we need to walk the existing virtual memory allocations as well as
- * find the hugepage size used.
- */
-static int
-vfio_spapr_size_walk(const struct rte_memseg_list *msl, void *arg)
-{
-	struct spapr_size_walk_param *param = arg;
-	uint64_t max = (uint64_t) msl->base_va + (uint64_t) msl->len;
-
-	if (msl->external && !msl->heap) {
-		/* ignore user managed external memory */
-		param->is_user_managed = true;
-		return 0;
-	}
-
-	if (max > param->max_va) {
-		param->page_sz = msl->page_sz;
-		param->max_va = max;
-	}
-
-	return 0;
-}
-
-/*
- * Find the highest memory address used in physical or virtual address
- * space and use that as the top of the DMA window.
- */
-static int
-find_highest_mem_addr(struct spapr_size_walk_param *param)
-{
-	/* find the maximum IOVA address for setting the DMA window size */
-	if (rte_eal_iova_mode() == RTE_IOVA_PA) {
-		static const char proc_iomem[] = "/proc/iomem";
-		static const char str_sysram[] = "System RAM";
-		uint64_t start, end, max = 0;
-		char *line = NULL;
-		char *dash, *space;
-		size_t line_len;
-
-		/*
-		 * Example "System RAM" in /proc/iomem:
-		 * 00000000-1fffffffff : System RAM
-		 * 200000000000-201fffffffff : System RAM
-		 */
-		FILE *fd = fopen(proc_iomem, "r");
-		if (fd == NULL) {
-			EAL_LOG(ERR, "Cannot open %s", proc_iomem);
-			return -1;
-		}
-		/* Scan /proc/iomem for the highest PA in the system */
-		while (getline(&line, &line_len, fd) != -1) {
-			if (strstr(line, str_sysram) == NULL)
-				continue;
-
-			space = strstr(line, " ");
-			dash = strstr(line, "-");
-
-			/* Validate the format of the memory string */
-			if (space == NULL || dash == NULL || space < dash) {
-				EAL_LOG(ERR, "Can't parse line \"%s\" in file %s",
-					line, proc_iomem);
-				continue;
-			}
-
-			start = strtoull(line, NULL, 16);
-			end   = strtoull(dash + 1, NULL, 16);
-			EAL_LOG(DEBUG, "Found system RAM from 0x%" PRIx64
-				" to 0x%" PRIx64, start, end);
-			if (end > max)
-				max = end;
-		}
-		free(line);
-		fclose(fd);
-
-		if (max == 0) {
-			EAL_LOG(ERR, "Failed to find valid \"System RAM\" "
-				"entry in file %s", proc_iomem);
-			return -1;
-		}
-
-		spapr_dma_win_len = rte_align64pow2(max + 1);
-		return 0;
-	} else if (rte_eal_iova_mode() == RTE_IOVA_VA) {
-		EAL_LOG(DEBUG, "Highest VA address in memseg list is 0x%"
-			PRIx64, param->max_va);
-		spapr_dma_win_len = rte_align64pow2(param->max_va);
-		return 0;
-	}
-
-	spapr_dma_win_len = 0;
-	EAL_LOG(ERR, "Unsupported IOVA mode");
-	return -1;
-}
-
-
-/*
- * The SPAPRv2 IOMMU supports 2 DMA windows with starting
- * address at 0 or 1<<59.  By default, a DMA window is set
- * at address 0, 2GB long, with a 4KB page.  For DPDK we
- * must remove the default window and setup a new DMA window
- * based on the hugepage size and memory requirements of
- * the application before we can map memory for DMA.
- */
-static int
-spapr_dma_win_size(void)
-{
-	struct spapr_size_walk_param param;
-
-	/* only create DMA window once */
-	if (spapr_dma_win_len > 0)
-		return 0;
-
-	/* walk the memseg list to find the page size/max VA address */
-	memset(&param, 0, sizeof(param));
-	if (rte_memseg_list_walk(vfio_spapr_size_walk, &param) < 0) {
-		EAL_LOG(ERR, "Failed to walk memseg list for DMA window size");
-		return -1;
-	}
-
-	/* we can't be sure if DMA window covers external memory */
-	if (param.is_user_managed)
-		EAL_LOG(WARNING, "Detected user managed external memory which may not be managed by the IOMMU");
-
-	/* check physical/virtual memory size */
-	if (find_highest_mem_addr(&param) < 0)
-		return -1;
-	EAL_LOG(DEBUG, "Setting DMA window size to 0x%" PRIx64,
-		spapr_dma_win_len);
-	spapr_dma_win_page_sz = param.page_sz;
-	rte_mem_set_dma_mask(rte_ctz64(spapr_dma_win_len));
-	return 0;
-}
-
-static int
-vfio_spapr_create_dma_window(struct vfio_container *cfg)
-{
-	struct vfio_iommu_spapr_tce_create create = {
-		.argsz = sizeof(create), };
-	struct vfio_iommu_spapr_tce_remove remove = {
-		.argsz = sizeof(remove), };
-	struct vfio_iommu_spapr_tce_info info = {
-		.argsz = sizeof(info), };
-	int ret;
-
-	ret = spapr_dma_win_size();
-	if (ret < 0)
-		return ret;
-
-	ret = ioctl(cfg->container_fd, VFIO_IOMMU_SPAPR_TCE_GET_INFO, &info);
-	if (ret) {
-		EAL_LOG(ERR, "Cannot get IOMMU info, error %i (%s)",
-			errno, strerror(errno));
-		return -1;
-	}
-
-	/*
-	 * sPAPR v1/v2 IOMMU always has a default 1G DMA window set.  The window
-	 * can't be changed for v1 but it can be changed for v2. Since DPDK only
-	 * supports v2, remove the default DMA window so it can be resized.
-	 */
-	remove.start_addr = info.dma32_window_start;
-	ret = ioctl(cfg->container_fd, VFIO_IOMMU_SPAPR_TCE_REMOVE, &remove);
-	if (ret)
-		return -1;
-
-	/* create a new DMA window (start address is not selectable) */
-	create.window_size = spapr_dma_win_len;
-	create.page_shift  = rte_ctz64(spapr_dma_win_page_sz);
-	create.levels = 1;
-	ret = ioctl(cfg->container_fd, VFIO_IOMMU_SPAPR_TCE_CREATE, &create);
-#ifdef VFIO_IOMMU_SPAPR_INFO_DDW
-	/*
-	 * The vfio_iommu_spapr_tce_info structure was modified in
-	 * Linux kernel 4.2.0 to add support for the
-	 * vfio_iommu_spapr_tce_ddw_info structure needed to try
-	 * multiple table levels.  Skip the attempt if running with
-	 * an older kernel.
-	 */
-	if (ret) {
-		/* if at first we don't succeed, try more levels */
-		uint32_t levels;
-
-		for (levels = create.levels + 1;
-			ret && levels <= info.ddw.levels; levels++) {
-			create.levels = levels;
-			ret = ioctl(cfg->container_fd, VFIO_IOMMU_SPAPR_TCE_CREATE, &create);
-		}
-	}
-#endif /* VFIO_IOMMU_SPAPR_INFO_DDW */
-	if (ret) {
-		EAL_LOG(ERR, "Cannot create new DMA window, error "
-				"%i (%s)", errno, strerror(errno));
-		EAL_LOG(ERR,
-			"Consider using a larger hugepage size if supported by the system");
-		return -1;
-	}
-
-	/* verify the start address  */
-	if (create.start_addr != 0) {
-		EAL_LOG(ERR, "Received unsupported start address 0x%"
-			PRIx64, (uint64_t)create.start_addr);
-		return -1;
-	}
-	return ret;
-}
-
-static int
-vfio_spapr_dma_mem_map(struct vfio_container *cfg, uint64_t vaddr, uint64_t iova, uint64_t len,
-		int do_map)
-{
-	int ret = 0;
-
-	if (do_map) {
-		if (vfio_spapr_dma_do_map(cfg, vaddr, iova, len, 1)) {
-			EAL_LOG(ERR, "Failed to map DMA");
-			ret = -1;
-		}
-	} else {
-		if (vfio_spapr_dma_do_map(cfg, vaddr, iova, len, 0)) {
-			EAL_LOG(ERR, "Failed to unmap DMA");
-			ret = -1;
-		}
-	}
-
-	return ret;
-}
-
-static int
-vfio_spapr_dma_map(struct vfio_container *cfg)
-{
-	if (vfio_spapr_create_dma_window(cfg) < 0) {
-		EAL_LOG(ERR, "Could not create new DMA window!");
-		return -1;
-	}
-
-	/* map all existing DPDK segments for DMA */
-	if (rte_memseg_walk(vfio_spapr_map_walk, cfg) < 0)
-		return -1;
-
-	return 0;
-}
-
-static int
-vfio_noiommu_dma_map(struct vfio_container *cfg __rte_unused)
-{
-	/* No-IOMMU mode does not need DMA mapping */
-	return 0;
-}
-
-static int
-vfio_noiommu_dma_mem_map(struct vfio_container *cfg __rte_unused, uint64_t vaddr __rte_unused,
-		uint64_t iova __rte_unused, uint64_t len __rte_unused, int do_map __rte_unused)
-{
-	/* No-IOMMU mode does not need DMA mapping */
-	return 0;
-}
-
 static int
 vfio_dma_mem_map(struct vfio_container *cfg, uint64_t vaddr, uint64_t iova, uint64_t len,
 		int do_map)
diff --git a/lib/eal/linux/eal_vfio.h b/lib/eal/linux/eal_vfio.h
index 78b8ac4a36..5dae09b125 100644
--- a/lib/eal/linux/eal_vfio.h
+++ b/lib/eal/linux/eal_vfio.h
@@ -70,6 +70,8 @@ struct vfio_iommu_ops {
 	vfio_dma_func_t dma_map_func;
 };
 
+extern const struct vfio_iommu_ops iommu_types[3];
+
 /* get the vfio container that devices are bound to by default */
 int vfio_open_container_fd(bool mp_request);
 
diff --git a/lib/eal/linux/eal_vfio_group.c b/lib/eal/linux/eal_vfio_group.c
new file mode 100644
index 0000000000..e588cd3014
--- /dev/null
+++ b/lib/eal/linux/eal_vfio_group.c
@@ -0,0 +1,521 @@
+/* SPDX-License-Identifier: BSD-3-Clause
+ * Copyright(c) 2010-2018 Intel Corporation
+ */
+
+#include <uapi/linux/vfio.h>
+
+#include <errno.h>
+#include <inttypes.h>
+#include <stdbool.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <sys/ioctl.h>
+#include <unistd.h>
+
+#include <rte_common.h>
+#include <rte_errno.h>
+#include <rte_log.h>
+#include <rte_memory.h>
+
+#include "eal_vfio.h"
+#include "eal_private.h"
+
+static int vfio_type1_dma_map(struct vfio_container *);
+static int vfio_type1_dma_mem_map(struct vfio_container *, uint64_t, uint64_t, uint64_t, int);
+static int vfio_spapr_dma_map(struct vfio_container *);
+static int vfio_spapr_dma_mem_map(struct vfio_container *, uint64_t, uint64_t, uint64_t, int);
+static int vfio_noiommu_dma_map(struct vfio_container *);
+static int vfio_noiommu_dma_mem_map(struct vfio_container *, uint64_t, uint64_t, uint64_t, int);
+
+/* IOMMU types we support */
+const struct vfio_iommu_ops iommu_types[] = {
+	/* x86 IOMMU, otherwise known as type 1 */
+	{
+		.type_id = VFIO_TYPE1_IOMMU,
+		.name = "Type 1",
+		.partial_unmap = false,
+		.dma_map_func = &vfio_type1_dma_map,
+		.dma_user_map_func = &vfio_type1_dma_mem_map
+	},
+	/* ppc64 IOMMU, otherwise known as spapr */
+	{
+		.type_id = VFIO_SPAPR_TCE_v2_IOMMU,
+		.name = "sPAPR",
+		.partial_unmap = true,
+		.dma_map_func = &vfio_spapr_dma_map,
+		.dma_user_map_func = &vfio_spapr_dma_mem_map
+	},
+	/* IOMMU-less mode */
+	{
+		.type_id = VFIO_NOIOMMU_IOMMU,
+		.name = "No-IOMMU",
+		.partial_unmap = true,
+		.dma_map_func = &vfio_noiommu_dma_map,
+		.dma_user_map_func = &vfio_noiommu_dma_mem_map
+	},
+};
+
+const struct vfio_iommu_ops *
+vfio_set_iommu_type(int vfio_container_fd)
+{
+	for (unsigned int idx = 0; idx < RTE_DIM(iommu_types); idx++) {
+		const struct vfio_iommu_ops *t = &iommu_types[idx];
+
+		int ret = ioctl(vfio_container_fd, VFIO_SET_IOMMU, t->type_id);
+		if (ret == 0)
+			return t;
+		/* not an error, there may be more supported IOMMU types */
+		EAL_LOG(DEBUG, "Set IOMMU type %d (%s) failed, error %i (%s)", t->type_id, t->name,
+			errno, strerror(errno));
+	}
+	/* if we didn't find a suitable IOMMU type, fail */
+	return NULL;
+}
+
+static int
+type1_map(const struct rte_memseg_list *msl, const struct rte_memseg *ms, void *arg)
+{
+	struct vfio_container *cfg = arg;
+
+	/* skip external memory that isn't a heap */
+	if (msl->external && !msl->heap)
+		return 0;
+
+	/* skip any segments with invalid IOVA addresses */
+	if (ms->iova == RTE_BAD_IOVA)
+		return 0;
+
+	return vfio_type1_dma_mem_map(cfg, ms->addr_64, ms->iova, ms->len, 1);
+}
+
+static int
+vfio_type1_dma_mem_map(struct vfio_container *cfg, uint64_t vaddr, uint64_t iova, uint64_t len,
+		int do_map)
+{
+	struct vfio_iommu_type1_dma_map dma_map;
+	struct vfio_iommu_type1_dma_unmap dma_unmap;
+	int ret;
+
+	if (do_map != 0) {
+		memset(&dma_map, 0, sizeof(dma_map));
+		dma_map.argsz = sizeof(struct vfio_iommu_type1_dma_map);
+		dma_map.vaddr = vaddr;
+		dma_map.size = len;
+		dma_map.iova = iova;
+		dma_map.flags = VFIO_DMA_MAP_FLAG_READ | VFIO_DMA_MAP_FLAG_WRITE;
+
+		ret = ioctl(cfg->container_fd, VFIO_IOMMU_MAP_DMA, &dma_map);
+		if (ret) {
+			/**
+			 * In case the mapping was already done EEXIST will be
+			 * returned from kernel.
+			 */
+			if (errno == EEXIST) {
+				EAL_LOG(DEBUG, "Memory segment is already mapped, skipping");
+			} else {
+				EAL_LOG(ERR, "Cannot set up DMA remapping, error %i (%s)", errno,
+					strerror(errno));
+				return -1;
+			}
+		}
+	} else {
+		memset(&dma_unmap, 0, sizeof(dma_unmap));
+		dma_unmap.argsz = sizeof(struct vfio_iommu_type1_dma_unmap);
+		dma_unmap.size = len;
+		dma_unmap.iova = iova;
+
+		ret = ioctl(cfg->container_fd, VFIO_IOMMU_UNMAP_DMA, &dma_unmap);
+		if (ret) {
+			EAL_LOG(ERR, "Cannot clear DMA remapping, error %i (%s)", errno,
+				strerror(errno));
+			return -1;
+		} else if (dma_unmap.size != len) {
+			EAL_LOG(ERR, "Unexpected size %"PRIu64
+				" of DMA remapping cleared instead of %"PRIu64,
+				(uint64_t)dma_unmap.size, len);
+			rte_errno = EIO;
+			return -1;
+		}
+	}
+
+	return 0;
+}
+
+static int
+vfio_type1_dma_map(struct vfio_container *cfg)
+{
+	return rte_memseg_walk(type1_map, cfg);
+}
+
+/* Track the size of the statically allocated DMA window for SPAPR */
+static uint64_t spapr_dma_win_len;
+static uint64_t spapr_dma_win_page_sz;
+
+static int
+vfio_spapr_dma_do_map(struct vfio_container *cfg, uint64_t vaddr, uint64_t iova, uint64_t len,
+		int do_map)
+{
+	struct vfio_iommu_spapr_register_memory reg = {
+		.argsz = sizeof(reg),
+		.vaddr = (uintptr_t) vaddr,
+		.size = len,
+		.flags = 0
+	};
+	int ret;
+
+	if (do_map != 0) {
+		struct vfio_iommu_type1_dma_map dma_map;
+
+		if (iova + len > spapr_dma_win_len) {
+			EAL_LOG(ERR, "DMA map attempt outside DMA window");
+			return -1;
+		}
+
+		ret = ioctl(cfg->container_fd, VFIO_IOMMU_SPAPR_REGISTER_MEMORY, &reg);
+		if (ret) {
+			EAL_LOG(ERR, "Cannot register vaddr for IOMMU, error %i (%s)", errno,
+				strerror(errno));
+			return -1;
+		}
+
+		memset(&dma_map, 0, sizeof(dma_map));
+		dma_map.argsz = sizeof(struct vfio_iommu_type1_dma_map);
+		dma_map.vaddr = vaddr;
+		dma_map.size = len;
+		dma_map.iova = iova;
+		dma_map.flags = VFIO_DMA_MAP_FLAG_READ | VFIO_DMA_MAP_FLAG_WRITE;
+
+		ret = ioctl(cfg->container_fd, VFIO_IOMMU_MAP_DMA, &dma_map);
+		if (ret) {
+			EAL_LOG(ERR, "Cannot map vaddr for IOMMU, error %i (%s)", errno,
+				strerror(errno));
+			return -1;
+		}
+
+	} else {
+		struct vfio_iommu_type1_dma_unmap dma_unmap;
+
+		memset(&dma_unmap, 0, sizeof(dma_unmap));
+		dma_unmap.argsz = sizeof(struct vfio_iommu_type1_dma_unmap);
+		dma_unmap.size = len;
+		dma_unmap.iova = iova;
+
+		ret = ioctl(cfg->container_fd, VFIO_IOMMU_UNMAP_DMA, &dma_unmap);
+		if (ret) {
+			EAL_LOG(ERR, "Cannot unmap vaddr for IOMMU, error %i (%s)", errno,
+				strerror(errno));
+			return -1;
+		}
+
+		ret = ioctl(cfg->container_fd, VFIO_IOMMU_SPAPR_UNREGISTER_MEMORY, &reg);
+		if (ret) {
+			EAL_LOG(ERR, "Cannot unregister vaddr for IOMMU, error %i (%s)", errno,
+				strerror(errno));
+			return -1;
+		}
+	}
+
+	return ret;
+}
+
+static int
+vfio_spapr_map_walk(const struct rte_memseg_list *msl, const struct rte_memseg *ms, void *arg)
+{
+	struct vfio_container *cfg = arg;
+
+	/* skip external memory that isn't a heap */
+	if (msl->external && !msl->heap)
+		return 0;
+
+	/* skip any segments with invalid IOVA addresses */
+	if (ms->iova == RTE_BAD_IOVA)
+		return 0;
+
+	return vfio_spapr_dma_do_map(cfg, ms->addr_64, ms->iova, ms->len, 1);
+}
+
+struct spapr_size_walk_param {
+	uint64_t max_va;
+	uint64_t page_sz;
+	bool is_user_managed;
+};
+
+/*
+ * In order to set the DMA window size required for the SPAPR IOMMU
+ * we need to walk the existing virtual memory allocations as well as
+ * find the hugepage size used.
+ */
+static int
+vfio_spapr_size_walk(const struct rte_memseg_list *msl, void *arg)
+{
+	struct spapr_size_walk_param *param = arg;
+	uint64_t max = (uint64_t) msl->base_va + (uint64_t) msl->len;
+
+	if (msl->external && !msl->heap) {
+		/* ignore user managed external memory */
+		param->is_user_managed = true;
+		return 0;
+	}
+
+	if (max > param->max_va) {
+		param->page_sz = msl->page_sz;
+		param->max_va = max;
+	}
+
+	return 0;
+}
+
+/*
+ * Find the highest memory address used in physical or virtual address
+ * space and use that as the top of the DMA window.
+ */
+static int
+find_highest_mem_addr(struct spapr_size_walk_param *param)
+{
+	/* find the maximum IOVA address for setting the DMA window size */
+	if (rte_eal_iova_mode() == RTE_IOVA_PA) {
+		static const char proc_iomem[] = "/proc/iomem";
+		static const char str_sysram[] = "System RAM";
+		uint64_t start, end, max = 0;
+		char *line = NULL;
+		char *dash, *space;
+		size_t line_len;
+
+		/*
+		 * Example "System RAM" in /proc/iomem:
+		 * 00000000-1fffffffff : System RAM
+		 * 200000000000-201fffffffff : System RAM
+		 */
+		FILE *fd = fopen(proc_iomem, "r");
+		if (fd == NULL) {
+			EAL_LOG(ERR, "Cannot open %s", proc_iomem);
+			return -1;
+		}
+		/* Scan /proc/iomem for the highest PA in the system */
+		while (getline(&line, &line_len, fd) != -1) {
+			if (strstr(line, str_sysram) == NULL)
+				continue;
+
+			space = strstr(line, " ");
+			dash = strstr(line, "-");
+
+			/* Validate the format of the memory string */
+			if (space == NULL || dash == NULL || space < dash) {
+				EAL_LOG(ERR, "Can't parse line \"%s\" in file %s", line,
+					proc_iomem);
+				continue;
+			}
+
+			start = strtoull(line, NULL, 16);
+			end   = strtoull(dash + 1, NULL, 16);
+			EAL_LOG(DEBUG, "Found system RAM from 0x%" PRIx64 " to 0x%" PRIx64,
+				start, end);
+			if (end > max)
+				max = end;
+		}
+		free(line);
+		fclose(fd);
+
+		if (max == 0) {
+			EAL_LOG(ERR, "Failed to find valid \"System RAM\" entry in file %s",
+				proc_iomem);
+			return -1;
+		}
+
+		spapr_dma_win_len = rte_align64pow2(max + 1);
+		return 0;
+	} else if (rte_eal_iova_mode() == RTE_IOVA_VA) {
+		EAL_LOG(DEBUG, "Highest VA address in memseg list is 0x%" PRIx64, param->max_va);
+		spapr_dma_win_len = rte_align64pow2(param->max_va);
+		return 0;
+	}
+
+	spapr_dma_win_len = 0;
+	EAL_LOG(ERR, "Unsupported IOVA mode");
+	return -1;
+}
+
+
+/*
+ * The SPAPRv2 IOMMU supports 2 DMA windows with starting
+ * address at 0 or 1<<59.  By default, a DMA window is set
+ * at address 0, 2GB long, with a 4KB page.  For DPDK we
+ * must remove the default window and setup a new DMA window
+ * based on the hugepage size and memory requirements of
+ * the application before we can map memory for DMA.
+ */
+static int
+spapr_dma_win_size(void)
+{
+	struct spapr_size_walk_param param;
+
+	/* only create DMA window once */
+	if (spapr_dma_win_len > 0)
+		return 0;
+
+	/* walk the memseg list to find the page size/max VA address */
+	memset(&param, 0, sizeof(param));
+	if (rte_memseg_list_walk(vfio_spapr_size_walk, &param) < 0) {
+		EAL_LOG(ERR, "Failed to walk memseg list for DMA window size");
+		return -1;
+	}
+
+	/* we can't be sure if DMA window covers external memory */
+	if (param.is_user_managed)
+		EAL_LOG(WARNING, "Detected user managed external memory which may not be managed by the IOMMU");
+
+	/* check physical/virtual memory size */
+	if (find_highest_mem_addr(&param) < 0)
+		return -1;
+	EAL_LOG(DEBUG, "Setting DMA window size to 0x%" PRIx64, spapr_dma_win_len);
+	spapr_dma_win_page_sz = param.page_sz;
+	rte_mem_set_dma_mask(rte_ctz64(spapr_dma_win_len));
+	return 0;
+}
+
+static int
+vfio_spapr_create_dma_window(struct vfio_container *cfg)
+{
+	struct vfio_iommu_spapr_tce_create create = { .argsz = sizeof(create), };
+	struct vfio_iommu_spapr_tce_remove remove = { .argsz = sizeof(remove), };
+	struct vfio_iommu_spapr_tce_info info = { .argsz = sizeof(info), };
+	int ret;
+
+	ret = spapr_dma_win_size();
+	if (ret < 0)
+		return ret;
+
+	ret = ioctl(cfg->container_fd, VFIO_IOMMU_SPAPR_TCE_GET_INFO, &info);
+	if (ret) {
+		EAL_LOG(ERR, "Cannot get IOMMU info, error %i (%s)", errno, strerror(errno));
+		return -1;
+	}
+
+	/*
+	 * sPAPR v1/v2 IOMMU always has a default 1G DMA window set.  The window
+	 * can't be changed for v1 but it can be changed for v2. Since DPDK only
+	 * supports v2, remove the default DMA window so it can be resized.
+	 */
+	remove.start_addr = info.dma32_window_start;
+	ret = ioctl(cfg->container_fd, VFIO_IOMMU_SPAPR_TCE_REMOVE, &remove);
+	if (ret)
+		return -1;
+
+	/* create a new DMA window (start address is not selectable) */
+	create.window_size = spapr_dma_win_len;
+	create.page_shift  = rte_ctz64(spapr_dma_win_page_sz);
+	create.levels = 1;
+	ret = ioctl(cfg->container_fd, VFIO_IOMMU_SPAPR_TCE_CREATE, &create);
+	/*
+	 * The vfio_iommu_spapr_tce_info structure was modified in
+	 * Linux kernel 4.2.0 to add support for the
+	 * vfio_iommu_spapr_tce_ddw_info structure needed to try
+	 * multiple table levels.  Skip the attempt if running with
+	 * an older kernel.
+	 */
+	if (ret) {
+		/* if at first we don't succeed, try more levels */
+		uint32_t levels;
+
+		for (levels = create.levels + 1;
+			ret && levels <= info.ddw.levels; levels++) {
+			create.levels = levels;
+			ret = ioctl(cfg->container_fd, VFIO_IOMMU_SPAPR_TCE_CREATE, &create);
+		}
+	}
+	if (ret) {
+		EAL_LOG(ERR, "Cannot create new DMA window, error %i (%s)", errno,
+			strerror(errno));
+		EAL_LOG(ERR, "Consider using a larger hugepage size if supported by the system");
+		return -1;
+	}
+
+	/* verify the start address  */
+	if (create.start_addr != 0) {
+		EAL_LOG(ERR, "Received unsupported start address 0x%" PRIx64,
+			(uint64_t)create.start_addr);
+		return -1;
+	}
+	return ret;
+}
+
+static int
+vfio_spapr_dma_mem_map(struct vfio_container *cfg, uint64_t vaddr, uint64_t iova, uint64_t len,
+		int do_map)
+{
+	int ret = 0;
+
+	if (do_map) {
+		if (vfio_spapr_dma_do_map(cfg, vaddr, iova, len, 1)) {
+			EAL_LOG(ERR, "Failed to map DMA");
+			ret = -1;
+		}
+	} else {
+		if (vfio_spapr_dma_do_map(cfg, vaddr, iova, len, 0)) {
+			EAL_LOG(ERR, "Failed to unmap DMA");
+			ret = -1;
+		}
+	}
+
+	return ret;
+}
+
+static int
+vfio_spapr_dma_map(struct vfio_container *cfg)
+{
+	if (vfio_spapr_create_dma_window(cfg) < 0) {
+		EAL_LOG(ERR, "Could not create new DMA window!");
+		return -1;
+	}
+
+	/* map all existing DPDK segments for DMA */
+	if (rte_memseg_walk(vfio_spapr_map_walk, cfg) < 0)
+		return -1;
+
+	return 0;
+}
+
+static int
+vfio_noiommu_dma_map(struct vfio_container *cfg __rte_unused)
+{
+	/* No-IOMMU mode does not need DMA mapping */
+	return 0;
+}
+
+static int
+vfio_noiommu_dma_mem_map(struct vfio_container *cfg __rte_unused, uint64_t vaddr __rte_unused,
+		uint64_t iova __rte_unused, uint64_t len __rte_unused, int do_map __rte_unused)
+{
+	/* No-IOMMU mode does not need DMA mapping */
+	return 0;
+}
+
+int
+vfio_has_supported_extensions(int vfio_container_fd)
+{
+	unsigned int n_extensions = 0;
+	int ret;
+
+	for (unsigned int idx = 0; idx < RTE_DIM(iommu_types); idx++) {
+		const struct vfio_iommu_ops *t = &iommu_types[idx];
+
+		ret = ioctl(vfio_container_fd, VFIO_CHECK_EXTENSION, t->type_id);
+		if (ret < 0) {
+			EAL_LOG(ERR, "Could not get IOMMU type, error %i (%s)", errno,
+				strerror(errno));
+			return -1;
+		} else if (ret == 1) {
+			/* we found a supported extension */
+			n_extensions++;
+		}
+		EAL_LOG(DEBUG, "IOMMU type %d (%s) is %s", t->type_id, t->name,
+			ret ? "supported" : "not supported");
+	}
+
+	/* if we didn't find any supported IOMMU types, fail */
+	if (n_extensions == 0)
+		return -1;
+
+	return 0;
+}
diff --git a/lib/eal/linux/meson.build b/lib/eal/linux/meson.build
index 29ba313218..5ec8eddaa2 100644
--- a/lib/eal/linux/meson.build
+++ b/lib/eal/linux/meson.build
@@ -16,6 +16,7 @@ sources += files(
         'eal_thread.c',
         'eal_timer.c',
         'eal_vfio.c',
+        'eal_vfio_group.c',
         'eal_vfio_mp_sync.c',
 )
 
-- 
2.54.0


  parent reply	other threads:[~2026-10-07  8:12 UTC|newest]

Thread overview: 385+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
     [not found] <cover.1763141462.git.anatoly.burakov@intel.com>
2025-11-18 16:29 ` [PATCH v3 00/20] Support VFIO cdev API in DPDK Anatoly Burakov
2025-11-18 16:29   ` [PATCH v3 01/20] doc: add deprecation notice for VFIO API Anatoly Burakov
2025-11-18 16:29   ` [PATCH v3 02/20] doc: add deprecation notice for vDPA driver API Anatoly Burakov
2025-11-18 16:29   ` [PATCH v3 03/20] uapi: update to v6.17 and add iommufd.h Anatoly Burakov
2025-11-18 17:36     ` Stephen Hemminger
2025-11-18 16:29   ` [PATCH v3 04/20] vfio: make all functions internal Anatoly Burakov
2025-11-18 16:29   ` [PATCH v3 05/20] vfio: split get device info from setup Anatoly Burakov
2025-11-18 16:29   ` [PATCH v3 06/20] vfio: add container device assignment API Anatoly Burakov
2025-11-18 16:29   ` [PATCH v3 07/20] net/nbl: do not use VFIO group bind API Anatoly Burakov
2025-11-18 16:29   ` [PATCH v3 08/20] net/ntnic: use container device assignment API Anatoly Burakov
2025-11-18 16:29   ` [PATCH v3 09/20] vdpa/ifc: " Anatoly Burakov
2025-11-18 16:29   ` [PATCH v3 10/20] vdpa/nfp: " Anatoly Burakov
2025-11-18 16:29   ` [PATCH v3 11/20] vdpa/sfc: " Anatoly Burakov
2025-11-18 16:29   ` [PATCH v3 12/20] vhost: remove group-related API from drivers Anatoly Burakov
2025-11-18 16:29   ` [PATCH v3 13/20] vfio: remove group-based API Anatoly Burakov
2025-11-18 16:29   ` [PATCH v3 14/20] vfio: cleanup and refactor Anatoly Burakov
2025-11-18 16:29   ` [PATCH v3 15/20] bus/pci: use the new VFIO mode API Anatoly Burakov
2025-11-18 16:29   ` [PATCH v3 16/20] bus/fslmc: " Anatoly Burakov
2025-11-18 16:29   ` [PATCH v3 17/20] net/hinic3: " Anatoly Burakov
2025-11-18 16:29   ` [PATCH v3 18/20] net/ntnic: " Anatoly Burakov
2025-11-18 16:29   ` [PATCH v3 19/20] vfio: remove no-IOMMU check API Anatoly Burakov
2025-11-18 16:29   ` [PATCH v3 20/20] vfio: introduce cdev mode Anatoly Burakov
2026-02-26 14:17 ` [PATCH v7 00/18] Support VFIO cdev API in DPDK Anatoly Burakov
2026-02-26 14:17   ` [PATCH v7 01/18] uapi: update to v6.17 and add iommufd.h Anatoly Burakov
2026-02-26 14:17   ` [PATCH v7 02/18] vfio: make all functions internal Anatoly Burakov
2026-02-26 14:17   ` [PATCH v7 03/18] vfio: split get device info from setup Anatoly Burakov
2026-02-26 14:17   ` [PATCH v7 04/18] vfio: add container device assignment API Anatoly Burakov
2026-02-26 14:17   ` [PATCH v7 05/18] net/nbl: do not use VFIO group bind API Anatoly Burakov
2026-02-26 14:17   ` [PATCH v7 06/18] net/ntnic: use container device assignment API Anatoly Burakov
2026-02-26 14:17   ` [PATCH v7 07/18] vdpa/ifc: " Anatoly Burakov
2026-02-26 14:17   ` [PATCH v7 08/18] vdpa/nfp: " Anatoly Burakov
2026-02-26 14:17   ` [PATCH v7 09/18] vdpa/sfc: " Anatoly Burakov
2026-02-26 14:17   ` [PATCH v7 10/18] vhost: remove group-related API from drivers Anatoly Burakov
2026-02-26 14:17   ` [PATCH v7 11/18] vfio: remove group-based API Anatoly Burakov
2026-02-26 14:17   ` [PATCH v7 12/18] vfio: cleanup and refactor Anatoly Burakov
2026-02-26 14:17   ` [PATCH v7 13/18] bus/pci: use the new VFIO mode API Anatoly Burakov
2026-02-26 14:17   ` [PATCH v7 14/18] bus/fslmc: " Anatoly Burakov
2026-02-26 14:17   ` [PATCH v7 15/18] net/hinic3: " Anatoly Burakov
2026-02-26 14:17   ` [PATCH v7 16/18] net/ntnic: " Anatoly Burakov
2026-02-26 14:17   ` [PATCH v7 17/18] vfio: remove no-IOMMU check API Anatoly Burakov
2026-02-26 14:17   ` [PATCH v7 18/18] vfio: introduce cdev mode Anatoly Burakov
2026-05-01 22:45   ` [PATCH v7 00/18] Support VFIO cdev API in DPDK Stephen Hemminger
2026-06-11 15:08 ` [PATCH v8 " Anatoly Burakov
2026-06-11 15:08   ` [PATCH v8 01/18] uapi: update to v6.17 and add iommufd.h Anatoly Burakov
2026-06-11 15:08   ` [PATCH v8 02/18] vfio: make all functions internal Anatoly Burakov
2026-06-11 15:08   ` [PATCH v8 03/18] vfio: split get device info from setup Anatoly Burakov
2026-06-11 15:08   ` [PATCH v8 04/18] vfio: add container device assignment API Anatoly Burakov
2026-06-11 15:08   ` [PATCH v8 05/18] net/nbl: do not use VFIO group bind API Anatoly Burakov
2026-06-11 15:08   ` [PATCH v8 06/18] net/ntnic: use container device assignment API Anatoly Burakov
2026-06-11 15:08   ` [PATCH v8 07/18] vdpa/ifc: " Anatoly Burakov
2026-06-11 15:09   ` [PATCH v8 08/18] vdpa/nfp: " Anatoly Burakov
2026-06-11 15:09   ` [PATCH v8 09/18] vdpa/sfc: " Anatoly Burakov
2026-06-11 15:09   ` [PATCH v8 10/18] vhost: remove group-related API from drivers Anatoly Burakov
2026-06-11 15:09   ` [PATCH v8 11/18] vfio: remove group-based API Anatoly Burakov
2026-06-11 15:09   ` [PATCH v8 12/18] vfio: cleanup and refactor Anatoly Burakov
2026-06-11 15:09   ` [PATCH v8 13/18] bus/pci: use the new VFIO mode API Anatoly Burakov
2026-06-11 15:09   ` [PATCH v8 14/18] bus/fslmc: " Anatoly Burakov
2026-06-11 15:09   ` [PATCH v8 15/18] net/hinic3: " Anatoly Burakov
2026-06-11 15:09   ` [PATCH v8 16/18] net/ntnic: " Anatoly Burakov
2026-06-11 15:09   ` [PATCH v8 17/18] vfio: remove no-IOMMU check API Anatoly Burakov
2026-06-11 15:09   ` [PATCH v8 18/18] vfio: introduce cdev mode Anatoly Burakov
2026-06-11 17:49   ` [PATCH v8 00/18] Support VFIO cdev API in DPDK Stephen Hemminger
2026-08-05 13:45 ` [PATCH v9 00/19] " Anatoly Burakov
2026-08-05 13:45   ` [PATCH v9 01/19] uapi: update to v6.17 and add iommufd.h Anatoly Burakov
2026-08-05 13:45   ` [PATCH v9 02/19] vfio: make all functions internal Anatoly Burakov
2026-08-05 13:45   ` [PATCH v9 03/19] vfio: split get device info from setup Anatoly Burakov
2026-08-05 13:45   ` [PATCH v9 04/19] vfio: add container device assignment API Anatoly Burakov
2026-08-05 13:45   ` [PATCH v9 05/19] net/nbl: do not use VFIO group bind API Anatoly Burakov
2026-08-05 13:45   ` [PATCH v9 06/19] net/ntnic: use container device assignment API Anatoly Burakov
2026-08-05 13:45   ` [PATCH v9 07/19] vdpa/ifc: " Anatoly Burakov
2026-08-05 13:45   ` [PATCH v9 08/19] vdpa/nfp: " Anatoly Burakov
2026-08-05 13:45   ` [PATCH v9 09/19] vdpa/sfc: " Anatoly Burakov
2026-08-05 13:45   ` [PATCH v9 10/19] vdpa/mlx5: remove group-related API Anatoly Burakov
2026-08-05 13:45   ` [PATCH v9 11/19] vhost: remove group-related API from driver Anatoly Burakov
2026-08-05 13:45   ` [PATCH v9 12/19] vfio: remove group-based API Anatoly Burakov
2026-08-05 13:45   ` [PATCH v9 13/19] vfio: cleanup and refactor Anatoly Burakov
2026-08-05 13:45   ` [PATCH v9 14/19] bus/pci: use the new VFIO mode API Anatoly Burakov
2026-08-05 13:45   ` [PATCH v9 15/19] bus/fslmc: " Anatoly Burakov
2026-08-05 13:45   ` [PATCH v9 16/19] net/hinic3: " Anatoly Burakov
2026-08-05 13:45   ` [PATCH v9 17/19] net/ntnic: " Anatoly Burakov
2026-08-05 13:45   ` [PATCH v9 18/19] vfio: remove no-IOMMU check API Anatoly Burakov
2026-08-05 13:45   ` [PATCH v9 19/19] vfio: introduce cdev mode Anatoly Burakov
2026-08-06  3:52   ` [PATCH v9 00/19] Support VFIO cdev API in DPDK Stephen Hemminger
2026-08-06 14:11 ` [PATCH v10 00/20] " Anatoly Burakov
2026-08-06 14:11   ` [PATCH v10 01/20] uapi: update to v6.17 and add iommufd.h Anatoly Burakov
2026-08-06 14:11   ` [PATCH v10 02/20] vfio: make all functions internal Anatoly Burakov
2026-08-06 14:11   ` [PATCH v10 03/20] bus/pci: rename mismatching error labels Anatoly Burakov
2026-08-06 14:11   ` [PATCH v10 04/20] vfio: split get device info from setup Anatoly Burakov
2026-08-06 14:11   ` [PATCH v10 05/20] vfio: add container device assignment API Anatoly Burakov
2026-08-06 14:11   ` [PATCH v10 06/20] net/nbl: do not use VFIO group bind API Anatoly Burakov
2026-08-06 14:11   ` [PATCH v10 07/20] net/ntnic: use container device assignment API Anatoly Burakov
2026-08-06 14:11   ` [PATCH v10 08/20] vdpa/ifc: " Anatoly Burakov
2026-08-06 14:11   ` [PATCH v10 09/20] vdpa/nfp: " Anatoly Burakov
2026-08-06 14:11   ` [PATCH v10 10/20] vdpa/sfc: " Anatoly Burakov
2026-08-06 14:11   ` [PATCH v10 11/20] vdpa/mlx5: remove group-related API Anatoly Burakov
2026-08-06 14:11   ` [PATCH v10 12/20] vhost: remove group-related API from driver Anatoly Burakov
2026-08-06 14:11   ` [PATCH v10 13/20] vfio: remove group-based API Anatoly Burakov
2026-08-06 14:11   ` [PATCH v10 14/20] vfio: cleanup and refactor Anatoly Burakov
2026-08-06 14:11   ` [PATCH v10 15/20] bus/pci: use the new VFIO mode API Anatoly Burakov
2026-08-06 14:11   ` [PATCH v10 16/20] bus/fslmc: " Anatoly Burakov
2026-08-06 14:11   ` [PATCH v10 17/20] net/hinic3: " Anatoly Burakov
2026-08-06 14:11   ` [PATCH v10 18/20] net/ntnic: " Anatoly Burakov
2026-08-06 14:11   ` [PATCH v10 19/20] vfio: remove no-IOMMU check API Anatoly Burakov
2026-08-06 14:11   ` [PATCH v10 20/20] vfio: introduce cdev mode Anatoly Burakov
2026-08-06 17:13   ` [PATCH v10 00/20] Support VFIO cdev API in DPDK Stephen Hemminger
2026-08-07 14:46 ` [PATCH v11 " Anatoly Burakov
2026-08-07 14:46   ` [PATCH v11 01/20] uapi: update to v6.17 and add iommufd.h Anatoly Burakov
2026-08-07 14:46   ` [PATCH v11 02/20] vfio: make all functions internal Anatoly Burakov
2026-08-07 14:46   ` [PATCH v11 03/20] bus/pci: rename mismatching error labels Anatoly Burakov
2026-08-07 14:46   ` [PATCH v11 04/20] vfio: split get device info from setup Anatoly Burakov
2026-08-07 14:46   ` [PATCH v11 05/20] vfio: add container device assignment API Anatoly Burakov
2026-08-07 14:46   ` [PATCH v11 06/20] net/nbl: do not use VFIO group bind API Anatoly Burakov
2026-08-07 14:46   ` [PATCH v11 07/20] net/ntnic: use container device assignment API Anatoly Burakov
2026-08-07 14:46   ` [PATCH v11 08/20] vdpa/ifc: " Anatoly Burakov
2026-08-07 14:46   ` [PATCH v11 09/20] vdpa/nfp: " Anatoly Burakov
2026-08-07 14:46   ` [PATCH v11 10/20] vdpa/sfc: " Anatoly Burakov
2026-08-07 14:46   ` [PATCH v11 11/20] vdpa/mlx5: remove group-related API Anatoly Burakov
2026-08-07 14:46   ` [PATCH v11 12/20] vhost: remove group-related API from driver Anatoly Burakov
2026-08-07 14:46   ` [PATCH v11 13/20] vfio: remove group-based API Anatoly Burakov
2026-08-07 14:46   ` [PATCH v11 14/20] vfio: cleanup and refactor Anatoly Burakov
2026-08-07 14:46   ` [PATCH v11 15/20] bus/pci: use the new VFIO mode API Anatoly Burakov
2026-08-07 14:46   ` [PATCH v11 16/20] bus/fslmc: " Anatoly Burakov
2026-08-07 14:46   ` [PATCH v11 17/20] net/hinic3: " Anatoly Burakov
2026-08-07 14:46   ` [PATCH v11 18/20] net/ntnic: " Anatoly Burakov
2026-08-07 14:46   ` [PATCH v11 19/20] vfio: remove no-IOMMU check API Anatoly Burakov
2026-08-07 14:46   ` [PATCH v11 20/20] vfio: introduce cdev mode Anatoly Burakov
2026-08-11  0:30   ` [PATCH v11 00/20] Support VFIO cdev API in DPDK Stephen Hemminger
2026-08-25 13:20 ` [PATCH v12 " Anatoly Burakov
2026-08-25 13:20   ` [PATCH v12 01/20] uapi: update to v6.17 and add iommufd.h Anatoly Burakov
2026-08-25 14:08     ` Stephen Hemminger
2026-08-25 13:20   ` [PATCH v12 02/20] vfio: make all functions internal Anatoly Burakov
2026-08-25 13:21   ` [PATCH v12 03/20] bus/pci: rename mismatching error labels Anatoly Burakov
2026-08-25 13:21   ` [PATCH v12 04/20] vfio: split get device info from setup Anatoly Burakov
2026-08-25 13:21   ` [PATCH v12 05/20] vfio: add container device assignment API Anatoly Burakov
2026-08-25 13:21   ` [PATCH v12 06/20] net/nbl: do not use VFIO group bind API Anatoly Burakov
2026-08-25 13:21   ` [PATCH v12 07/20] net/ntnic: use container device assignment API Anatoly Burakov
2026-08-25 13:21   ` [PATCH v12 08/20] vdpa/ifc: " Anatoly Burakov
2026-08-25 13:21   ` [PATCH v12 09/20] vdpa/nfp: " Anatoly Burakov
2026-08-25 13:21   ` [PATCH v12 10/20] vdpa/sfc: " Anatoly Burakov
2026-08-25 13:21   ` [PATCH v12 11/20] vdpa/mlx5: remove group-related API Anatoly Burakov
2026-08-25 13:21   ` [PATCH v12 12/20] vhost: remove group-related API from driver Anatoly Burakov
2026-08-25 13:21   ` [PATCH v12 13/20] vfio: remove group-based API Anatoly Burakov
2026-08-25 13:21   ` [PATCH v12 14/20] vfio: cleanup and refactor Anatoly Burakov
2026-08-25 13:21   ` [PATCH v12 15/20] bus/pci: use the new VFIO mode API Anatoly Burakov
2026-08-25 13:21   ` [PATCH v12 16/20] bus/fslmc: " Anatoly Burakov
2026-08-25 13:21   ` [PATCH v12 17/20] net/hinic3: " Anatoly Burakov
2026-08-25 13:21   ` [PATCH v12 18/20] net/ntnic: " Anatoly Burakov
2026-08-25 13:21   ` [PATCH v12 19/20] vfio: remove no-IOMMU check API Anatoly Burakov
2026-08-25 13:21   ` [PATCH v12 20/20] vfio: introduce cdev mode Anatoly Burakov
2026-08-25 14:17   ` [PATCH v12 00/20] Support VFIO cdev API in DPDK Stephen Hemminger
2026-08-26 10:09     ` Burakov, Anatoly
2026-08-27 15:14 ` [PATCH v13 00/24] " Anatoly Burakov
2026-08-27 15:14   ` [PATCH v13 01/24] uapi: update to v6.17 and add iommufd.h Anatoly Burakov
2026-08-27 15:14   ` [PATCH v13 02/24] vfio: make all functions internal Anatoly Burakov
2026-08-27 15:14   ` [PATCH v13 03/24] bus/fslmc: decouple from EAL VFIO Anatoly Burakov
2026-08-27 15:14   ` [PATCH v13 04/24] vfio: decouple EAL from VFIO internals Anatoly Burakov
2026-08-27 15:14   ` [PATCH v13 05/24] vfio: do proper teardown on VFIO cleanup Anatoly Burakov
2026-08-27 15:14   ` [PATCH v13 06/24] vfio: rename API to reflect internal status Anatoly Burakov
2026-08-27 15:14   ` [PATCH v13 07/24] bus/pci: rename mismatching error labels Anatoly Burakov
2026-08-27 15:14   ` [PATCH v13 08/24] vfio: split get device info from setup Anatoly Burakov
2026-08-27 15:14   ` [PATCH v13 09/24] vfio: add container device assignment API Anatoly Burakov
2026-08-27 15:14   ` [PATCH v13 10/24] net/nbl: do not use VFIO group bind API Anatoly Burakov
2026-08-27 15:14   ` [PATCH v13 11/24] net/ntnic: use container device assignment API Anatoly Burakov
2026-08-27 15:14   ` [PATCH v13 12/24] vdpa/ifc: " Anatoly Burakov
2026-08-27 15:14   ` [PATCH v13 13/24] vdpa/nfp: " Anatoly Burakov
2026-08-27 15:14   ` [PATCH v13 14/24] vdpa/sfc: " Anatoly Burakov
2026-08-27 15:14   ` [PATCH v13 15/24] vdpa/mlx5: remove group-related API Anatoly Burakov
2026-08-27 15:14   ` [PATCH v13 16/24] vhost: remove group-related API from driver Anatoly Burakov
2026-08-27 15:14   ` [PATCH v13 17/24] vfio: remove group-based API Anatoly Burakov
2026-08-27 15:14   ` [PATCH v13 18/24] vfio: cleanup and refactor Anatoly Burakov
2026-08-27 15:14   ` [PATCH v13 19/24] bus/pci: use the new VFIO mode API Anatoly Burakov
2026-08-27 15:14   ` [PATCH v13 20/24] bus/fslmc: " Anatoly Burakov
2026-08-27 15:14   ` [PATCH v13 21/24] net/hinic3: " Anatoly Burakov
2026-08-27 15:14   ` [PATCH v13 22/24] net/ntnic: " Anatoly Burakov
2026-08-27 15:14   ` [PATCH v13 23/24] vfio: remove no-IOMMU check API Anatoly Burakov
2026-08-27 15:14   ` [PATCH v13 24/24] vfio: introduce cdev mode Anatoly Burakov
2026-08-28 13:06 ` [PATCH v14 00/25] Support VFIO cdev API in DPDK Anatoly Burakov
2026-08-28 13:06   ` [PATCH v14 01/25] uapi: update to v6.17 and add iommufd.h Anatoly Burakov
2026-08-28 13:06   ` [PATCH v14 02/25] vfio: make all functions internal Anatoly Burakov
2026-08-28 13:06   ` [PATCH v14 03/25] bus/fslmc: decouple from EAL VFIO Anatoly Burakov
2026-08-28 13:06   ` [PATCH v14 04/25] vfio: decouple EAL from VFIO internals Anatoly Burakov
2026-08-28 13:06   ` [PATCH v14 05/25] vfio: do proper teardown on VFIO cleanup Anatoly Burakov
2026-08-28 13:06   ` [PATCH v14 06/25] vfio: remove modname parameter from init Anatoly Burakov
2026-08-28 13:06   ` [PATCH v14 07/25] vfio: rename API to reflect internal status Anatoly Burakov
2026-08-28 13:06   ` [PATCH v14 08/25] bus/pci: rename mismatching error labels Anatoly Burakov
2026-08-28 13:06   ` [PATCH v14 09/25] vfio: split get device info from setup Anatoly Burakov
2026-08-28 13:06   ` [PATCH v14 10/25] vfio: add container device assignment API Anatoly Burakov
2026-08-28 13:06   ` [PATCH v14 11/25] net/nbl: do not use VFIO group bind API Anatoly Burakov
2026-08-28 13:06   ` [PATCH v14 12/25] net/ntnic: use container device assignment API Anatoly Burakov
2026-08-28 13:06   ` [PATCH v14 13/25] vdpa/ifc: " Anatoly Burakov
2026-08-28 13:06   ` [PATCH v14 14/25] vdpa/nfp: " Anatoly Burakov
2026-08-28 13:06   ` [PATCH v14 15/25] vdpa/sfc: " Anatoly Burakov
2026-08-28 13:06   ` [PATCH v14 16/25] vdpa/mlx5: remove group-related API Anatoly Burakov
2026-08-28 13:06   ` [PATCH v14 17/25] vhost: remove group-related API from driver Anatoly Burakov
2026-08-28 13:06   ` [PATCH v14 18/25] vfio: remove group-based API Anatoly Burakov
2026-08-28 13:06   ` [PATCH v14 19/25] vfio: cleanup and refactor Anatoly Burakov
2026-08-28 13:06   ` [PATCH v14 20/25] bus/pci: use the new VFIO mode API Anatoly Burakov
2026-08-28 13:06   ` [PATCH v14 21/25] bus/fslmc: " Anatoly Burakov
2026-08-28 13:06   ` [PATCH v14 22/25] net/hinic3: " Anatoly Burakov
2026-08-28 13:06   ` [PATCH v14 23/25] net/ntnic: " Anatoly Burakov
2026-08-28 13:06   ` [PATCH v14 24/25] vfio: remove no-IOMMU check API Anatoly Burakov
2026-08-28 13:06   ` [PATCH v14 25/25] vfio: introduce cdev mode Anatoly Burakov
2026-08-28 13:32   ` [PATCH v14 00/25] Support VFIO cdev API in DPDK Burakov, Anatoly
2026-09-01 16:15 ` [PATCH v15 " Anatoly Burakov
2026-09-01 16:15   ` [PATCH v15 01/25] uapi: update to v6.17 and add iommufd.h Anatoly Burakov
2026-09-01 16:15   ` [PATCH v15 02/25] vfio: make all functions internal Anatoly Burakov
2026-09-01 16:15   ` [PATCH v15 03/25] bus/fslmc: decouple from EAL VFIO Anatoly Burakov
2026-09-01 16:15   ` [PATCH v15 04/25] vfio: decouple EAL from VFIO internals Anatoly Burakov
2026-09-01 16:15   ` [PATCH v15 05/25] vfio: do proper teardown on VFIO cleanup Anatoly Burakov
2026-09-01 16:15   ` [PATCH v15 06/25] vfio: remove modname parameter from init Anatoly Burakov
2026-09-01 16:15   ` [PATCH v15 07/25] vfio: rename API to reflect internal status Anatoly Burakov
2026-09-01 16:15   ` [PATCH v15 08/25] bus/pci: rename mismatching error labels Anatoly Burakov
2026-09-01 16:15   ` [PATCH v15 09/25] vfio: split get device info from setup Anatoly Burakov
2026-09-01 16:15   ` [PATCH v15 10/25] vfio: add container device assignment API Anatoly Burakov
2026-09-01 16:15   ` [PATCH v15 11/25] net/nbl: do not use VFIO group bind API Anatoly Burakov
2026-09-01 16:15   ` [PATCH v15 12/25] net/ntnic: use container device assignment API Anatoly Burakov
2026-09-01 16:15   ` [PATCH v15 13/25] vdpa/ifc: " Anatoly Burakov
2026-09-01 16:15   ` [PATCH v15 14/25] vdpa/nfp: " Anatoly Burakov
2026-09-01 16:15   ` [PATCH v15 15/25] vdpa/sfc: " Anatoly Burakov
2026-09-01 16:15   ` [PATCH v15 16/25] vdpa/mlx5: remove group-related API Anatoly Burakov
2026-09-01 16:15   ` [PATCH v15 17/25] vhost: remove group-related API from driver Anatoly Burakov
2026-09-01 16:15   ` [PATCH v15 18/25] vfio: remove group-based API Anatoly Burakov
2026-09-01 16:15   ` [PATCH v15 19/25] vfio: cleanup and refactor Anatoly Burakov
2026-09-01 16:15   ` [PATCH v15 20/25] bus/pci: use the new VFIO IOMMU mode API Anatoly Burakov
2026-09-01 16:15   ` [PATCH v15 21/25] bus/fslmc: " Anatoly Burakov
2026-09-01 16:15   ` [PATCH v15 22/25] net/hinic3: " Anatoly Burakov
2026-09-01 16:15   ` [PATCH v15 23/25] net/ntnic: " Anatoly Burakov
2026-09-01 16:15   ` [PATCH v15 24/25] vfio: remove no-IOMMU check API Anatoly Burakov
2026-09-01 16:15   ` [PATCH v15 25/25] vfio: introduce cdev mode Anatoly Burakov
2026-09-09 10:01 ` [PATCH v16 00/26] Support VFIO cdev API in DPDK Anatoly Burakov
2026-09-09 10:01   ` [PATCH v16 01/26] net/nbl: fix use-after-free Anatoly Burakov
2026-09-09 11:51     ` Burakov, Anatoly
2026-09-09 10:01   ` [PATCH v16 02/26] uapi: update to v6.17 and add iommufd.h Anatoly Burakov
2026-09-09 10:01   ` [PATCH v16 03/26] vfio: make all functions internal Anatoly Burakov
2026-09-09 10:01   ` [PATCH v16 04/26] bus/fslmc: decouple from EAL VFIO Anatoly Burakov
2026-09-09 10:01   ` [PATCH v16 05/26] vfio: decouple EAL from VFIO internals Anatoly Burakov
2026-09-09 10:01   ` [PATCH v16 06/26] vfio: do proper teardown on VFIO cleanup Anatoly Burakov
2026-09-09 10:02   ` [PATCH v16 07/26] vfio: remove modname parameter from init Anatoly Burakov
2026-09-09 10:02   ` [PATCH v16 08/26] vfio: rename API to reflect internal status Anatoly Burakov
2026-09-09 10:02   ` [PATCH v16 09/26] bus/pci: rename mismatching error labels Anatoly Burakov
2026-09-09 10:02   ` [PATCH v16 10/26] vfio: split get device info from setup Anatoly Burakov
2026-09-09 10:02   ` [PATCH v16 11/26] vfio: add container device assignment API Anatoly Burakov
2026-09-09 10:02   ` [PATCH v16 12/26] net/nbl: do not use VFIO group bind API Anatoly Burakov
2026-09-09 11:22     ` Burakov, Anatoly
2026-09-09 10:02   ` [PATCH v16 13/26] net/ntnic: use container device assignment API Anatoly Burakov
2026-09-09 10:02   ` [PATCH v16 14/26] vdpa/ifc: " Anatoly Burakov
2026-09-09 10:02   ` [PATCH v16 15/26] vdpa/nfp: " Anatoly Burakov
2026-09-09 10:02   ` [PATCH v16 16/26] vdpa/sfc: " Anatoly Burakov
2026-09-09 10:02   ` [PATCH v16 17/26] vdpa/mlx5: remove group-related API Anatoly Burakov
2026-09-09 10:02   ` [PATCH v16 18/26] vhost: remove group-related API from driver Anatoly Burakov
2026-09-09 10:02   ` [PATCH v16 19/26] vfio: remove group-based API Anatoly Burakov
2026-09-09 10:02   ` [PATCH v16 20/26] vfio: cleanup and refactor Anatoly Burakov
2026-09-09 10:02   ` [PATCH v16 21/26] bus/pci: use the new VFIO IOMMU mode API Anatoly Burakov
2026-09-09 10:02   ` [PATCH v16 22/26] bus/fslmc: " Anatoly Burakov
2026-09-09 10:02   ` [PATCH v16 23/26] net/hinic3: " Anatoly Burakov
2026-09-09 10:02   ` [PATCH v16 24/26] net/ntnic: " Anatoly Burakov
2026-09-09 10:02   ` [PATCH v16 25/26] vfio: remove no-IOMMU check API Anatoly Burakov
2026-09-09 10:02   ` [PATCH v16 26/26] vfio: introduce cdev mode Anatoly Burakov
2026-09-10 12:52 ` [PATCH v17 00/26] Support VFIO cdev API in DPDK Anatoly Burakov
2026-09-10 12:52   ` [PATCH v17 01/26] net/nbl: fix use-after-free Anatoly Burakov
2026-09-10 12:52   ` [PATCH v17 02/26] uapi: update to v6.17 and add iommufd.h Anatoly Burakov
2026-09-10 12:52   ` [PATCH v17 03/26] vfio: make all functions internal Anatoly Burakov
2026-09-10 12:52   ` [PATCH v17 04/26] bus/fslmc: decouple from EAL VFIO Anatoly Burakov
2026-09-10 12:52   ` [PATCH v17 05/26] vfio: decouple EAL from VFIO internals Anatoly Burakov
2026-09-10 12:52   ` [PATCH v17 06/26] vfio: do proper teardown on VFIO cleanup Anatoly Burakov
2026-09-15 15:25     ` David Marchand
2026-09-16 11:10       ` Burakov, Anatoly
2026-09-10 12:52   ` [PATCH v17 07/26] vfio: remove modname parameter from init Anatoly Burakov
2026-09-10 12:52   ` [PATCH v17 08/26] vfio: rename API to reflect internal status Anatoly Burakov
2026-09-10 12:52   ` [PATCH v17 09/26] bus/pci: rename mismatching error labels Anatoly Burakov
2026-09-10 12:52   ` [PATCH v17 10/26] vfio: split get device info from setup Anatoly Burakov
2026-09-15 15:24     ` David Marchand
2026-09-16 11:14       ` Burakov, Anatoly
2026-09-10 12:52   ` [PATCH v17 11/26] vfio: add container device assignment API Anatoly Burakov
2026-09-10 12:52   ` [PATCH v17 12/26] net/nbl: do not use VFIO group bind API Anatoly Burakov
2026-09-10 12:52   ` [PATCH v17 13/26] net/ntnic: use container device assignment API Anatoly Burakov
2026-09-10 12:52   ` [PATCH v17 14/26] vdpa/ifc: " Anatoly Burakov
2026-09-10 12:52   ` [PATCH v17 15/26] vdpa/nfp: " Anatoly Burakov
2026-09-10 12:53   ` [PATCH v17 16/26] vdpa/sfc: " Anatoly Burakov
2026-09-10 12:53   ` [PATCH v17 17/26] vdpa/mlx5: remove group-related API Anatoly Burakov
2026-09-10 12:53   ` [PATCH v17 18/26] vhost: remove group-related API from driver Anatoly Burakov
2026-09-10 12:53   ` [PATCH v17 19/26] vfio: remove group-based API Anatoly Burakov
2026-09-10 12:53   ` [PATCH v17 20/26] vfio: cleanup and refactor Anatoly Burakov
2026-09-16  9:42     ` David Marchand
2026-09-16 11:19       ` Burakov, Anatoly
2026-09-22  8:02         ` David Marchand
2026-09-23  9:22           ` Burakov, Anatoly
2026-09-10 12:53   ` [PATCH v17 21/26] bus/pci: use the new VFIO IOMMU mode API Anatoly Burakov
2026-09-10 12:53   ` [PATCH v17 22/26] bus/fslmc: " Anatoly Burakov
2026-09-16  7:44     ` David Marchand
2026-09-16 11:20       ` Burakov, Anatoly
2026-09-10 12:53   ` [PATCH v17 23/26] net/hinic3: " Anatoly Burakov
2026-09-10 12:53   ` [PATCH v17 24/26] net/ntnic: " Anatoly Burakov
2026-09-10 12:53   ` [PATCH v17 25/26] vfio: remove no-IOMMU check API Anatoly Burakov
2026-09-10 12:53   ` [PATCH v17 26/26] vfio: introduce cdev mode Anatoly Burakov
2026-09-15 14:32   ` [PATCH v17 00/26] Support VFIO cdev API in DPDK David Marchand
2026-09-16 11:06     ` Burakov, Anatoly
2026-09-24 16:13 ` [PATCH v18 00/29] " Anatoly Burakov
2026-09-24 16:13   ` [PATCH v18 01/29] uapi: update to v6.17 and add iommufd.h Anatoly Burakov
2026-09-24 16:13   ` [PATCH v18 02/29] vfio: make all functions internal Anatoly Burakov
2026-09-24 16:13   ` [PATCH v18 03/29] bus/fslmc: decouple from EAL VFIO Anatoly Burakov
2026-09-24 16:13   ` [PATCH v18 04/29] vfio: decouple EAL from VFIO internals Anatoly Burakov
2026-09-24 16:13   ` [PATCH v18 05/29] vhost: check DMA capability only once Anatoly Burakov
2026-09-24 16:13   ` [PATCH v18 06/29] vfio: do proper teardown on VFIO cleanup Anatoly Burakov
2026-09-24 16:13   ` [PATCH v18 07/29] eal: move kernel module check function into VFIO Anatoly Burakov
2026-09-24 16:13   ` [PATCH v18 08/29] vfio: remove modname parameter from init Anatoly Burakov
2026-09-24 16:13   ` [PATCH v18 09/29] vfio: add module check API Anatoly Burakov
2026-09-24 16:13   ` [PATCH v18 10/29] bus/pci: decouple PCI bus driver from VFIO Anatoly Burakov
2026-09-24 16:13   ` [PATCH v18 11/29] vfio: rename API to reflect internal status Anatoly Burakov
2026-09-24 16:13   ` [PATCH v18 12/29] bus/pci: rename mismatching error labels Anatoly Burakov
2026-09-24 16:13   ` [PATCH v18 13/29] vfio: split get device info from setup Anatoly Burakov
2026-09-24 16:13   ` [PATCH v18 14/29] vfio: add container device assignment API Anatoly Burakov
2026-09-24 16:13   ` [PATCH v18 15/29] net/nbl: do not use VFIO group bind API Anatoly Burakov
2026-09-24 16:13   ` [PATCH v18 16/29] net/ntnic: use container device assignment API Anatoly Burakov
2026-09-24 16:13   ` [PATCH v18 17/29] vdpa/ifc: " Anatoly Burakov
2026-09-24 16:13   ` [PATCH v18 18/29] vdpa/nfp: " Anatoly Burakov
2026-09-24 16:13   ` [PATCH v18 19/29] vdpa/sfc: " Anatoly Burakov
2026-09-24 16:13   ` [PATCH v18 20/29] vdpa/mlx5: remove group-related API Anatoly Burakov
2026-09-24 16:13   ` [PATCH v18 21/29] vhost: remove group-related API from driver Anatoly Burakov
2026-09-24 16:13   ` [PATCH v18 22/29] vfio: remove group-based API Anatoly Burakov
2026-09-24 16:13   ` [PATCH v18 23/29] vfio: cleanup and refactor Anatoly Burakov
2026-09-24 16:13   ` [PATCH v18 24/29] bus/pci: use the new VFIO IOVA mode API Anatoly Burakov
2026-09-24 16:13   ` [PATCH v18 25/29] bus/fslmc: " Anatoly Burakov
2026-09-24 16:13   ` [PATCH v18 26/29] net/hinic3: " Anatoly Burakov
2026-09-24 16:13   ` [PATCH v18 27/29] net/ntnic: " Anatoly Burakov
2026-09-24 16:13   ` [PATCH v18 28/29] vfio: remove no-IOMMU check API Anatoly Burakov
2026-09-24 16:13   ` [PATCH v18 29/29] vfio: introduce cdev mode Anatoly Burakov
2026-10-07  7:31 ` [PATCH v19 00/26] Support VFIO cdev API in DPDK David Marchand
2026-10-07  7:31   ` [PATCH v19 01/26] vhost: check DMA capability only once David Marchand
2026-10-07  7:31   ` [PATCH v19 02/26] bus/fslmc: decouple from EAL VFIO David Marchand
2026-10-07  7:31   ` [PATCH v19 03/26] bus/pci: rename mismatching error labels David Marchand
2026-10-07  7:31   ` [PATCH v19 04/26] bus/pci: move VFIO concerns in Linux implementation David Marchand
2026-10-07 10:54     ` Burakov, Anatoly
2026-10-07  7:31   ` [PATCH v19 05/26] eal: provide VFIO only for Linux David Marchand
2026-10-07 10:55     ` Burakov, Anatoly
2026-10-07  7:31   ` [PATCH v19 06/26] vfio: make all functions internal David Marchand
2026-10-07  7:31   ` [PATCH v19 07/26] vfio: add module check API David Marchand
2026-10-07  7:31   ` [PATCH v19 08/26] vfio: teardown internals on VFIO cleanup David Marchand
2026-10-07  7:31   ` [PATCH v19 09/26] vfio: split get device info from setup David Marchand
2026-10-07  7:31   ` [PATCH v19 10/26] vfio: add container device assignment API David Marchand
2026-10-07  7:31   ` [PATCH v19 11/26] net/nbl: do not use VFIO group bind API David Marchand
2026-10-07  7:31   ` [PATCH v19 12/26] net/ntnic: use container device assignment API David Marchand
2026-10-07  7:31   ` [PATCH v19 13/26] vdpa/ifc: " David Marchand
2026-10-07  7:31   ` [PATCH v19 14/26] vdpa/nfp: " David Marchand
2026-10-07  7:31   ` [PATCH v19 15/26] vdpa/sfc: " David Marchand
2026-10-07  7:31   ` [PATCH v19 16/26] vhost: remove group-related API from driver David Marchand
2026-10-07  7:31   ` [PATCH v19 17/26] vfio: remove group-based API David Marchand
2026-10-07  7:31   ` [PATCH v19 18/26] vfio: rename some internal types and macros David Marchand
2026-10-07  7:31   ` [PATCH v19 19/26] vfio: declare global configuration David Marchand
2026-10-07  7:31   ` [PATCH v19 20/26] vfio: separate group-based IOMMU types David Marchand
2026-10-07  7:31   ` [PATCH v19 21/26] vfio: add some check on input parameters David Marchand
2026-10-07  7:32   ` [PATCH v19 22/26] vfio: decouple device setup from bus concerns David Marchand
2026-10-07  7:32   ` [PATCH v19 23/26] vfio: introduce IOVA mode David Marchand
2026-10-07  7:32   ` [PATCH v19 24/26] vfio: introduce VFIO mode David Marchand
2026-10-07  7:32   ` [PATCH v19 25/26] uapi: import IOMMUFD header David Marchand
2026-10-07  7:32   ` [PATCH v19 26/26] vfio: introduce cdev mode David Marchand
2026-10-07  8:04   ` [PATCH v19 00/26] Support VFIO cdev API in DPDK David Marchand
2026-10-07  8:09 ` [RESEND][PATCH " David Marchand
2026-10-07  8:09   ` [RESEND][PATCH v19 01/26] vhost: check DMA capability only once David Marchand
2026-10-07  8:09   ` [RESEND][PATCH v19 02/26] bus/fslmc: decouple from EAL VFIO David Marchand
2026-10-07  8:10   ` [RESEND][PATCH v19 03/26] bus/pci: rename mismatching error labels David Marchand
2026-10-07  8:10   ` [RESEND][PATCH v19 04/26] bus/pci: move VFIO concerns in Linux implementation David Marchand
2026-10-07  8:10   ` [RESEND][PATCH v19 05/26] eal: provide VFIO only for Linux David Marchand
2026-10-07  8:10   ` [RESEND][PATCH v19 06/26] vfio: make all functions internal David Marchand
2026-10-07  8:10   ` [RESEND][PATCH v19 07/26] vfio: add module check API David Marchand
2026-10-07  8:10   ` [RESEND][PATCH v19 08/26] vfio: teardown internals on VFIO cleanup David Marchand
2026-10-07  8:10   ` [RESEND][PATCH v19 09/26] vfio: split get device info from setup David Marchand
2026-10-07  8:10   ` [RESEND][PATCH v19 10/26] vfio: add container device assignment API David Marchand
2026-10-07  8:10   ` [RESEND][PATCH v19 11/26] net/nbl: do not use VFIO group bind API David Marchand
2026-10-07  8:10   ` [RESEND][PATCH v19 12/26] net/ntnic: use container device assignment API David Marchand
2026-10-07  8:10   ` [RESEND][PATCH v19 13/26] vdpa/ifc: " David Marchand
2026-10-07  8:10   ` [RESEND][PATCH v19 14/26] vdpa/nfp: " David Marchand
2026-10-07  8:10   ` [RESEND][PATCH v19 15/26] vdpa/sfc: " David Marchand
2026-10-07  8:10   ` [RESEND][PATCH v19 16/26] vhost: remove group-related API from driver David Marchand
2026-10-07  8:10   ` [RESEND][PATCH v19 17/26] vfio: remove group-based API David Marchand
2026-10-07  8:10   ` [RESEND][PATCH v19 18/26] vfio: rename some internal types and macros David Marchand
2026-10-07  8:10   ` [RESEND][PATCH v19 19/26] vfio: declare global configuration David Marchand
2026-10-07  8:10   ` David Marchand [this message]
2026-10-07  8:10   ` [RESEND][PATCH v19 21/26] vfio: add some check on input parameters David Marchand
2026-10-07  8:10   ` [RESEND][PATCH v19 22/26] vfio: decouple device setup from bus concerns David Marchand
2026-10-07  8:10   ` [RESEND][PATCH v19 23/26] vfio: introduce IOVA mode David Marchand
2026-10-07  8:10   ` [RESEND][PATCH v19 24/26] vfio: introduce VFIO mode David Marchand
2026-10-07  8:10   ` [RESEND][PATCH v19 25/26] uapi: import IOMMUFD header David Marchand
2026-10-07  8:10   ` [RESEND][PATCH v19 26/26] vfio: introduce cdev mode David Marchand
2026-10-07  9:59   ` [RESEND][PATCH v19 00/26] Support VFIO cdev API in DPDK David Marchand

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20261007081026.574382-21-david.marchand@redhat.com \
    --to=david.marchand@redhat.com \
    --cc=anatoly.burakov@intel.com \
    --cc=dev@dpdk.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox