* Re: [dpdk-dev] [PATCH v2 09/16] Enable VFIO device binding
@ 2014-05-27 3:23 Xu, HuilongX
0 siblings, 0 replies; 3+ messages in thread
From: Xu, HuilongX @ 2014-05-27 3:23 UTC (permalink / raw)
To: dev, Burakov, Anatoly
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 <anatoly.burakov at intel.com>
Test-by: HuilongX Xu huilongx.xu@intel.com
Compile pass
>>Compile OS: FC20 x86_64
>>Kernel version: 3.13.6-200
>>GCC version: 4.8.2
>>Server: Crownpass
---
lib/librte_eal/linuxapp/eal/eal_pci.c | 55 ++++++++++++++++++++++++++++++++-
1 files changed, 54 insertions(+), 1 deletions(-)
diff --git a/lib/librte_eal/linuxapp/eal/eal_pci.c b/lib/librte_eal/linuxapp/eal/eal_pci.c
index 7256406..953abe6 100644
--- a/lib/librte_eal/linuxapp/eal/eal_pci.c
+++ b/lib/librte_eal/linuxapp/eal/eal_pci.c
@@ -401,6 +401,7 @@ rte_eal_pci_probe_one_driver(struct rte_pci_driver *dr, struct rte_pci_device *d
{
struct rte_pci_id *id_table;
int ret = 0;
+ int mapped = 0;
for (id_table = dr->id_table ; id_table->vendor_id != 0; id_table++) {
@@ -435,8 +436,17 @@ 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) {
+ /* try mapping the NIC resources using VFIO if it exists */
+#ifdef VFIO_PRESENT
+ if (vfio_cfg.vfio_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 ((ret = pci_uio_map_resource(dev)) != 0)
+ if (!mapped && (ret = pci_uio_map_resource(dev)) != 0)
return ret;
} else if (dr->drv_flags & RTE_PCI_DRV_FORCE_UNBIND &&
rte_eal_process_type() == RTE_PROC_PRIMARY) {
@@ -471,5 +481,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 = 0; i < VFIO_MAX_GROUPS; i++) {
+ vfio_cfg.vfio_groups[i].fd = -1;
+ vfio_cfg.vfio_groups[i].group_no = -1;
+ }
+ vfio_cfg.vfio_container_fd = -1;
+
+ /* check if we have VFIO driver enabled */
+ if (access(VFIO_DIR, F_OK) == 0) {
+ static int socket_fd;
+
+ vfio_cfg.vfio_enabled = 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 == RTE_PROC_PRIMARY) {
+ /* set up local socket */
+ if ((socket_fd = pci_vfio_socket_setup()) < 0) {
+ RTE_LOG(ERR, EAL, "Failed to set up local socket!\n");
+ return -1;
+ }
+ ret = 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;
}
--
1.7.0.7
^ permalink raw reply [flat|nested] 3+ messages in thread
* Re: [dpdk-dev] [PATCH v2 09/16] Enable VFIO device binding
2014-05-19 15:51 ` [dpdk-dev] [PATCH v2 09/16] Enable VFIO device binding Anatoly Burakov
@ 2014-05-22 12:03 ` Thomas Monjalon
0 siblings, 0 replies; 3+ messages in thread
From: Thomas Monjalon @ 2014-05-22 12:03 UTC (permalink / raw)
To: Anatoly Burakov; +Cc: dev
2014-05-19 16:51, Anatoly Burakov:
> 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.
You have renamed RTE_PCI_DRV_NEED_IGB_UIO. Please update this log :)
> --- a/lib/librte_eal/linuxapp/eal/eal_pci.c
> +++ b/lib/librte_eal/linuxapp/eal/eal_pci.c
> @@ -401,6 +401,7 @@ rte_eal_pci_probe_one_driver(struct rte_pci_driver *dr,
> struct rte_pci_device *d {
> struct rte_pci_id *id_table;
> int ret = 0;
> + int mapped = 0;
>
> for (id_table = dr->id_table ; id_table->vendor_id != 0; id_table++) {
>
> @@ -435,8 +436,17 @@ 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) {
> + /* try mapping the NIC resources using VFIO if it exists */
> +#ifdef VFIO_PRESENT
> + if (vfio_cfg.vfio_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 ((ret = pci_uio_map_resource(dev)) != 0)
> + if (!mapped && (ret = pci_uio_map_resource(dev)) != 0)
> return ret;
I think creating a function pci_map_resource() could be cleaner (you won't
need variable mapped).
> +#ifdef VFIO_PRESENT
> + memset(&vfio_cfg, 0, sizeof(vfio_cfg));
> +
> + /* initialize group list */
> + int i, ret;
> +
> + for (i = 0; i < VFIO_MAX_GROUPS; i++) {
> + vfio_cfg.vfio_groups[i].fd = -1;
> + vfio_cfg.vfio_groups[i].group_no = -1;
> + }
> + vfio_cfg.vfio_container_fd = -1;
> +
> + /* check if we have VFIO driver enabled */
> + if (access(VFIO_DIR, F_OK) == 0) {
> + static int socket_fd;
> +
> + vfio_cfg.vfio_enabled = 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 == RTE_PROC_PRIMARY) {
> + /* set up local socket */
> + if ((socket_fd = pci_vfio_socket_setup()) < 0) {
> + RTE_LOG(ERR, EAL, "Failed to set up local socket!\n");
> + return -1;
> + }
> + ret = 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;
> + }
> + }
Also here, it could help to have a dedicated function for vfio init.
> + }
> + else
checkpatch.pl reports an error: "else should follow close brace '}'"
> + RTE_LOG(INFO, EAL, "VFIO driver not loaded or wrong permissions\n");
> +#endif
Thanks
--
Thomas
^ permalink raw reply [flat|nested] 3+ messages in thread
* [dpdk-dev] [PATCH v2 09/16] Enable VFIO device binding
2014-05-01 11:05 [dpdk-dev] [PATCH 00/16] [RFC] [VFIO] Add VFIO support to DPDK Burakov, Anatoly
@ 2014-05-19 15:51 ` Anatoly Burakov
2014-05-22 12:03 ` Thomas Monjalon
0 siblings, 1 reply; 3+ messages in thread
From: Anatoly Burakov @ 2014-05-19 15:51 UTC (permalink / raw)
To: dev
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 <anatoly.burakov@intel.com>
---
lib/librte_eal/linuxapp/eal/eal_pci.c | 55 ++++++++++++++++++++++++++++++++-
1 files changed, 54 insertions(+), 1 deletions(-)
diff --git a/lib/librte_eal/linuxapp/eal/eal_pci.c b/lib/librte_eal/linuxapp/eal/eal_pci.c
index 7256406..953abe6 100644
--- a/lib/librte_eal/linuxapp/eal/eal_pci.c
+++ b/lib/librte_eal/linuxapp/eal/eal_pci.c
@@ -401,6 +401,7 @@ rte_eal_pci_probe_one_driver(struct rte_pci_driver *dr, struct rte_pci_device *d
{
struct rte_pci_id *id_table;
int ret = 0;
+ int mapped = 0;
for (id_table = dr->id_table ; id_table->vendor_id != 0; id_table++) {
@@ -435,8 +436,17 @@ 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) {
+ /* try mapping the NIC resources using VFIO if it exists */
+#ifdef VFIO_PRESENT
+ if (vfio_cfg.vfio_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 ((ret = pci_uio_map_resource(dev)) != 0)
+ if (!mapped && (ret = pci_uio_map_resource(dev)) != 0)
return ret;
} else if (dr->drv_flags & RTE_PCI_DRV_FORCE_UNBIND &&
rte_eal_process_type() == RTE_PROC_PRIMARY) {
@@ -471,5 +481,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 = 0; i < VFIO_MAX_GROUPS; i++) {
+ vfio_cfg.vfio_groups[i].fd = -1;
+ vfio_cfg.vfio_groups[i].group_no = -1;
+ }
+ vfio_cfg.vfio_container_fd = -1;
+
+ /* check if we have VFIO driver enabled */
+ if (access(VFIO_DIR, F_OK) == 0) {
+ static int socket_fd;
+
+ vfio_cfg.vfio_enabled = 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 == RTE_PROC_PRIMARY) {
+ /* set up local socket */
+ if ((socket_fd = pci_vfio_socket_setup()) < 0) {
+ RTE_LOG(ERR, EAL, "Failed to set up local socket!\n");
+ return -1;
+ }
+ ret = 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;
}
--
1.7.0.7
^ permalink raw reply [flat|nested] 3+ messages in thread
end of thread, other threads:[~2014-05-27 3:23 UTC | newest]
Thread overview: 3+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2014-05-27 3:23 [dpdk-dev] [PATCH v2 09/16] Enable VFIO device binding Xu, HuilongX
-- strict thread matches above, loose matches on Subject: below --
2014-05-01 11:05 [dpdk-dev] [PATCH 00/16] [RFC] [VFIO] Add VFIO support to DPDK Burakov, Anatoly
2014-05-19 15:51 ` [dpdk-dev] [PATCH v2 09/16] Enable VFIO device binding Anatoly Burakov
2014-05-22 12:03 ` Thomas Monjalon
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).