From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mga03.intel.com (mga03.intel.com [143.182.124.21]) by dpdk.org (Postfix) with ESMTP id F347158EB for ; Thu, 1 May 2014 13:06:05 +0200 (CEST) Received: from azsmga001.ch.intel.com ([10.2.17.19]) by azsmga101.ch.intel.com with ESMTP; 01 May 2014 04:06:09 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="4.97,964,1389772800"; d="scan'208";a="426314622" Received: from irsmsx103.ger.corp.intel.com ([163.33.3.157]) by azsmga001.ch.intel.com with ESMTP; 01 May 2014 04:06:08 -0700 Received: from irsmsx101.ger.corp.intel.com ([169.254.1.249]) by IRSMSX103.ger.corp.intel.com ([163.33.3.157]) with mapi id 14.03.0123.003; Thu, 1 May 2014 12:06:08 +0100 From: "Burakov, Anatoly" To: "dev@dpdk.org" Thread-Topic: [PATCH 09/16] [RFC] [VFIO] Enable VFIO device binding Thread-Index: Ac9lLKnefFmqd3HDTtSFelNOFFN/UQ== Date: Thu, 1 May 2014 11:06:07 +0000 Message-ID: Accept-Language: en-US Content-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: x-originating-ip: [163.33.239.180] Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Subject: [dpdk-dev] [PATCH 09/16] [RFC] [VFIO] Enable VFIO device binding X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: patches and discussions about DPDK List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Thu, 01 May 2014 11:06:06 -0000 Add support for binding VFIO devices if RTE_PCI_DRV_NEED_IGB_UIO is set for this driver. Try VFIO first, if not mapped then try IGB_UIO too. Signed-off-by: Anatoly Burakov diff --git a/lib/librte_eal/linuxapp/eal/eal_pci.c b/lib/librte_eal/linuxap= p/eal/eal_pci.c index dc21645..3f659ff 100644 --- a/lib/librte_eal/linuxapp/eal/eal_pci.c +++ b/lib/librte_eal/linuxapp/eal/eal_pci.c @@ -400,7 +400,7 @@ int rte_eal_pci_probe_one_driver(struct rte_pci_driver *dr, struct rte_pci_dev= ice *dev) { struct rte_pci_id *id_table; - int ret =3D 0; + int ret, mapped =3D 0; =20 for (id_table =3D dr->id_table ; id_table->vendor_id !=3D 0; id_table++) = { =20 @@ -435,10 +435,15 @@ rte_eal_pci_probe_one_driver(struct rte_pci_driver *d= r, struct rte_pci_device *d } =20 if (dr->drv_flags & RTE_PCI_DRV_NEED_MAPPING) { + /* try mapping the NIC resources using VFIO if it exists */ +#ifdef VFIO_PRESENT + if (vfio_cfg.vfio_enabled && pci_vfio_map_resource(dev) =3D=3D 0) { + mapped =3D 1; + } +#endif /* map resources for devices that use igb_uio */ - if ((ret =3D pci_uio_map_resource(dev)) !=3D 0) + if (!mapped && (ret =3D pci_uio_map_resource(dev)) !=3D 0) return ret; - } else if (dr->drv_flags & RTE_PCI_DRV_FORCE_UNBIND && rte_eal_process_type() =3D=3D RTE_PROC_PRIMARY) { /* unbind current driver */ @@ -472,5 +477,48 @@ rte_eal_pci_init(void) RTE_LOG(ERR, EAL, "%s(): Cannot scan PCI bus\n", __func__); return -1; } +#ifdef VFIO_PRESENT + memset(&vfio_cfg, 0, sizeof(vfio_cfg)); + + /* initialize group list */ + int i, ret; + + for (i =3D 0; i < VFIO_MAX_GROUPS; i++) { + vfio_cfg.vfio_groups[i].fd =3D -1; + vfio_cfg.vfio_groups[i].group_no =3D -1; + } + vfio_cfg.vfio_container_fd =3D -1; + + /* check if we have VFIO driver enabled */ + if (access(VFIO_DIR, F_OK) =3D=3D 0) { + static int socket_fd; + + vfio_cfg.vfio_enabled =3D 1; + + /* 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 =3D=3D RTE_PROC_PRIMARY) { + /* set up local socket */ + if ((socket_fd =3D pci_vfio_socket_setup()) < 0) { + RTE_LOG(ERR, EAL, "Failed to set up local socket!\n"); + return -1; + } + ret =3D pthread_create(&socket_thread, NULL, + pci_vfio_socket_thread, (void*) &socket_fd); + if (ret) { + RTE_LOG(ERR, EAL, + "Failed to create thread for communication with secondary " + "processes!\n"); + return -1; + } + } + } + else + RTE_LOG(INFO, EAL, "VFIO driver not loaded or wrong permissions\n"); +#endif return 0; } --=20 1.8.1.4