On 19-Jan-19 3:23 AM, Wang, Xiao W wrote:
Hi Anatoly,
-----Original Message-----
From: Burakov, Anatoly
Sent: Friday, January 18, 2019 6:25 PM
To: dev@dpdk.org
Cc: Wang, Xiao W <xiao.w.w...@intel.com>; Zhang, Qi Z
<qi.z.zh...@intel.com>; qingfu....@alibaba-inc.com; tho...@monjalon.net;
Stojaczyk, Dariusz <dariusz.stojac...@intel.com>; sta...@dpdk.org
Subject: [PATCH v2] vfio: allow secondary process to query IOMMU type
It is only possible to know IOMMU type of a given VFIO container
by attempting to initialize it. Since secondary process never
attempts to set up VFIO container itself (because they're shared
between primary and secondary), it never knows which IOMMU type
the container is using, and never sets up the appropriate config
structures. This results in inability to perform DMA mappings in
secondary process.
Fix this by allowing secondary process to query IOMMU type of
primary's default container at device initialization.
Note that this fix is assuming we're only interested in default
container.
Bugzilla ID: 174
Fixes: 6bcb7c95fe14 ("vfio: share default container in multi-process")
Cc: dariusz.stojac...@intel.com
Cc: sta...@dpdk.org
Signed-off-by: Anatoly Burakov <anatoly.bura...@intel.com>
---
Notes:
v2:
- Check if we found our IOMMU type within list of IOMMU types
- Don't request new default container fd as this should have
been done during rte_vfio_enable()
lib/librte_eal/linuxapp/eal/eal_vfio.c | 88 +++++++++++++++++++
lib/librte_eal/linuxapp/eal/eal_vfio.h | 12 ++-
.../linuxapp/eal/eal_vfio_mp_sync.c | 16 ++++
3 files changed, 115 insertions(+), 1 deletion(-)
diff --git a/lib/librte_eal/linuxapp/eal/eal_vfio.c
b/lib/librte_eal/linuxapp/eal/eal_vfio.c
index 72cc65151..c821e8382 100644
--- a/lib/librte_eal/linuxapp/eal/eal_vfio.c
+++ b/lib/librte_eal/linuxapp/eal/eal_vfio.c
@@ -549,6 +549,65 @@ vfio_mem_event_callback(enum rte_mem_event
type, const void *addr, size_t len,
}
}
+static int
+vfio_sync_default_container(void)
+{
+ struct rte_mp_msg mp_req, *mp_rep;
+ struct rte_mp_reply mp_reply;
+ struct timespec ts = {.tv_sec = 5, .tv_nsec = 0};
+ struct vfio_mp_param *p = (struct vfio_mp_param *)mp_req.param;
+ int iommu_type_id;
+ unsigned int i;
+
+ /* cannot be called from primary */
+ if (rte_eal_process_type() != RTE_PROC_SECONDARY)
+ return -1;
+
+ /* default container fd should have been opened in rte_vfio_enable()
*/
+ if (!default_vfio_cfg->vfio_enabled ||
+ default_vfio_cfg->vfio_container_fd < 0) {
+ RTE_LOG(ERR, EAL, "VFIO support is not initialized\n");
+ return -1;
+ }
+
+ /* find default container's IOMMU type */
+ p->req = SOCKET_REQ_IOMMU_TYPE;
Since this function is to sync IOMMU type for the default container, should we
make the req type as
SOCKET_REQ_DEFAULT_IOMMU_TYPE?
Hi,
Sure, that can be done. However, i don't think it warrants a respin
unless there's more important stuff to fix also. This patch is a
stop-gap, and this stuff will be rewritten for 19.05, so getting this
right is not that important :).
BRs,
Xiao
--
Thanks,
Anatoly