On 17-Jan-19 5:30 PM, Anatoly Burakov wrote:
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>
---

<...>

+       /* we now have an fd for default container, as well as its IOMMU type.
+        * now, set up default VFIO container config to match.
+        */
+       for (i = 0; i < RTE_DIM(iommu_types); i++) {
+               const struct vfio_iommu_type *t = &iommu_types[i];
+               if (t->type_id != iommu_type_id)
+                       continue;
+
+               /* we found our IOMMU type */
+               default_vfio_cfg->vfio_enabled = 1;
+               default_vfio_cfg->vfio_container_fd = vfio_container_fd;
+               default_vfio_cfg->vfio_iommu_type = t;
+               break;
+       }

Self-review: if IOMMU type wasn't found, we still return 0. Will fix in v2.

+
+       return 0;
+}
+
  int
  rte_vfio_clear_group(int vfio_group_fd)
  {
@@ -745,6 +805,26 @@ rte_vfio_setup_device(const char *sysfs_base, const char 
*dev_addr,
                        else
                                RTE_LOG(DEBUG, EAL, "Installed memory event callback 
for VFIO\n");

--
Thanks,
Anatoly

Reply via email to