From: David Marchand <david.marchand@redhat.com>
To: dev@dpdk.org
Cc: Anatoly Burakov <anatoly.burakov@intel.com>
Subject: [PATCH v19 20/26] vfio: separate group-based IOMMU types
Date: Wed, 7 Oct 2026 09:31:58 +0200 [thread overview]
Message-ID: <20261007073206.567001-21-david.marchand@redhat.com> (raw)
In-Reply-To: <20261007073206.567001-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, ®);
- 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, ®);
- 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(¶m, 0, sizeof(param));
- if (rte_memseg_list_walk(vfio_spapr_size_walk, ¶m) < 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(¶m) < 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, ®);
+ 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, ®);
+ 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(¶m, 0, sizeof(param));
+ if (rte_memseg_list_walk(vfio_spapr_size_walk, ¶m) < 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(¶m) < 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
next prev parent reply other threads:[~2026-10-07 7:34 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 ` David Marchand [this message]
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 ` [RESEND][PATCH v19 20/26] vfio: separate group-based IOMMU types David Marchand
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=20261007073206.567001-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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.