Add support for binding VFIO devices if RTE_PCI_DRV_NEED_MAPPING is set
for this driver. Try VFIO first, if not mapped then try IGB_UIO too.

Signed-off-by: Anatoly Burakov <anatoly.burakov at intel.com>
---
 lib/librte_eal/linuxapp/eal/eal_pci.c | 42 ++++++++++++++++++++++++++++++++---
 1 file changed, 39 insertions(+), 3 deletions(-)

diff --git a/lib/librte_eal/linuxapp/eal/eal_pci.c 
b/lib/librte_eal/linuxapp/eal/eal_pci.c
index a0abec8..8a9cbf9 100644
--- a/lib/librte_eal/linuxapp/eal/eal_pci.c
+++ b/lib/librte_eal/linuxapp/eal/eal_pci.c
@@ -393,6 +393,27 @@ error:
        return -1;
 }

+static int
+pci_map_device(struct rte_pci_device *dev)
+{
+       int ret, mapped = 0;
+
+       /* try mapping the NIC resources using VFIO if it exists */
+#ifdef VFIO_PRESENT
+       if (pci_vfio_is_enabled()) {
+               if ((ret = pci_vfio_map_resource(dev)) == 0)
+                       mapped = 1;
+               else if (ret < 0)
+                       return ret;
+       }
+#endif
+       /* map resources for devices that use igb_uio */
+       if (!mapped && (ret = pci_uio_map_resource(dev)) != 0)
+               return ret;
+
+       return 0;
+}
+
 /*
  * If vendor/device ID match, call the devinit() function of the
  * driver.
@@ -400,8 +421,8 @@ error:
 int
 rte_eal_pci_probe_one_driver(struct rte_pci_driver *dr, struct rte_pci_device 
*dev)
 {
+       int ret;
        struct rte_pci_id *id_table;
-       int ret = 0;

        for (id_table = dr->id_table ; id_table->vendor_id != 0; id_table++) {

@@ -436,8 +457,7 @@ rte_eal_pci_probe_one_driver(struct rte_pci_driver *dr, 
struct rte_pci_device *d
                }

                if (dr->drv_flags & RTE_PCI_DRV_NEED_MAPPING) {
-                       /* map resources for devices that use igb_uio */
-                       if ((ret = pci_uio_map_resource(dev)) != 0)
+                       if ((ret = pci_map_device(dev)) != 0)
                                return ret;
                } else if (dr->drv_flags & RTE_PCI_DRV_FORCE_UNBIND &&
                           rte_eal_process_type() == RTE_PROC_PRIMARY) {
@@ -473,5 +493,21 @@ rte_eal_pci_init(void)
                RTE_LOG(ERR, EAL, "%s(): Cannot scan PCI bus\n", __func__);
                return -1;
        }
+#ifdef VFIO_PRESENT
+       pci_vfio_enable();
+
+       if (pci_vfio_is_enabled()) {
+
+               /* if we are primary process, create a thread to communicate 
with
+                * secondary processes. the thread will use a socket to wait for
+                * requests from secondary process to send open file 
descriptors,
+                * because VFIO does not allow multiple open descriptors on a 
group or
+                * VFIO container.
+                */
+               if (internal_config.process_type == RTE_PROC_PRIMARY &&
+                               pci_vfio_mp_sync_setup() < 0)
+                       return -1;
+       }
+#endif
        return 0;
 }
-- 
1.8.1.4

Reply via email to