All of lore.kernel.org
 help / color / mirror / Atom feed
From: Jan Viktorin <viktorin@rehivetech.com>
To: dev@dpdk.org
Cc: Jan Viktorin <viktorin@rehivetech.com>,
	Anatoly Burakov <anatoly.burakov@intel.com>,
	David Marchand <david.marchand@6wind.com>,
	Keith Wiles <keith.wiles@intel.com>,
	Santosh Shukla <sshukla@mvista.com>,
	Stephen Hemminger <stephen@networkplumber.org>,
	Shreyansh Jain <shreyansh.jain@nxp.com>
Subject: [PATCH v2 10/16] vfio: extract setup logic out of pci_vfio_map_resource
Date: Mon, 13 Jun 2016 15:02:00 +0200	[thread overview]
Message-ID: <1465822926-23742-11-git-send-email-viktorin@rehivetech.com> (raw)
In-Reply-To: <1465822926-23742-1-git-send-email-viktorin@rehivetech.com>
In-Reply-To: <1461937456-22943-1-git-send-email-viktorin@rehivetech.com>

The setup logic access the global vfio_cfg variable that will be moved in the
following commits. We need to separate all accesses to this variable to a
general code.

Signed-off-by: Jan Viktorin <viktorin@rehivetech.com>
---
v2
* fixed lost viable code (A. Burakov)
---
 lib/librte_eal/linuxapp/eal/eal_pci_vfio.c | 85 +++++++++++++++++-------------
 1 file changed, 49 insertions(+), 36 deletions(-)

diff --git a/lib/librte_eal/linuxapp/eal/eal_pci_vfio.c b/lib/librte_eal/linuxapp/eal/eal_pci_vfio.c
index 2b3dd2e..27ce6a8 100644
--- a/lib/librte_eal/linuxapp/eal/eal_pci_vfio.c
+++ b/lib/librte_eal/linuxapp/eal/eal_pci_vfio.c
@@ -411,37 +411,22 @@ clear_current_group(void)
 	vfio_cfg.vfio_groups[vfio_cfg.vfio_group_idx].fd = -1;
 }
 
-
-/*
- * map the PCI resources of a PCI device in virtual memory (VFIO version).
- * primary and secondary processes follow almost exactly the same path
+/**
+ * Setup vfio_cfg for the device indentified by its address. It discovers
+ * the configured I/O MMU groups or sets a new one for the device. If a new
+ * groups is assigned, the DMA mapping is performed.
+ * Returns 0 on success, a negative value on failure and a positive value in
+ * case the given device cannot be managed this way.
  */
-int
-pci_vfio_map_resource(struct rte_pci_device *dev)
+static int pci_vfio_setup_device(const char *pci_addr, int *vfio_dev_fd,
+		struct vfio_device_info *device_info)
 {
 	struct vfio_group_status group_status = {
 			.argsz = sizeof(group_status)
 	};
-	struct vfio_device_info device_info = { .argsz = sizeof(device_info) };
-	int vfio_group_fd, vfio_dev_fd;
+	int vfio_group_fd;
 	int iommu_group_no;
-	char pci_addr[PATH_MAX] = {0};
-	struct rte_pci_addr *loc = &dev->addr;
-	int i, ret, msix_bar;
-	struct mapped_pci_resource *vfio_res = NULL;
-	struct mapped_pci_res_list *vfio_res_list = RTE_TAILQ_CAST(rte_vfio_tailq.head, mapped_pci_res_list);
-
-	struct pci_map *maps;
-	uint32_t msix_table_offset = 0;
-	uint32_t msix_table_size = 0;
-	uint32_t ioport_bar;
-
-	dev->intr_handle.fd = -1;
-	dev->intr_handle.type = RTE_INTR_HANDLE_UNKNOWN;
-
-	/* store PCI address string */
-	snprintf(pci_addr, sizeof(pci_addr), PCI_PRI_FMT,
-			loc->domain, loc->bus, loc->devid, loc->function);
+	int ret;
 
 	/* get group number */
 	ret = pci_vfio_get_group_no(pci_addr, &iommu_group_no);
@@ -476,8 +461,8 @@ pci_vfio_map_resource(struct rte_pci_device *dev)
 	}
 
 	/*
-	 * at this point, we know at least one port on this device is bound to VFIO,
-	 * so we can proceed to try and set this particular port up
+	 * at this point, we know that this group is viable (meaning, all devices
+	 * are either bound to VFIO or not bound to anything)
 	 */
 
 	/* check if the group is viable */
@@ -495,11 +480,6 @@ pci_vfio_map_resource(struct rte_pci_device *dev)
 		return -1;
 	}
 
-	/*
-	 * at this point, we know that this group is viable (meaning, all devices
-	 * are either bound to VFIO or not bound to anything)
-	 */
-
 	/* check if group does not have a container yet */
 	if (!(group_status.flags & VFIO_GROUP_FLAGS_CONTAINER_SET)) {
 
@@ -546,8 +526,8 @@ pci_vfio_map_resource(struct rte_pci_device *dev)
 	}
 
 	/* get a file descriptor for the device */
-	vfio_dev_fd = ioctl(vfio_group_fd, VFIO_GROUP_GET_DEVICE_FD, pci_addr);
-	if (vfio_dev_fd < 0) {
+	*vfio_dev_fd = ioctl(vfio_group_fd, VFIO_GROUP_GET_DEVICE_FD, pci_addr);
+	if (*vfio_dev_fd < 0) {
 		/* if we cannot get a device fd, this simply means that this
 		 * particular port is not bound to VFIO
 		 */
@@ -557,14 +537,47 @@ pci_vfio_map_resource(struct rte_pci_device *dev)
 	}
 
 	/* test and setup the device */
-	ret = ioctl(vfio_dev_fd, VFIO_DEVICE_GET_INFO, &device_info);
+	ret = ioctl(*vfio_dev_fd, VFIO_DEVICE_GET_INFO, device_info);
 	if (ret) {
 		RTE_LOG(ERR, EAL, "  %s cannot get device info, "
 				"error %i (%s)\n", pci_addr, errno, strerror(errno));
-		close(vfio_dev_fd);
+		close(*vfio_dev_fd);
 		return -1;
 	}
 
+	return 0;
+}
+
+/*
+ * map the PCI resources of a PCI device in virtual memory (VFIO version).
+ * primary and secondary processes follow almost exactly the same path
+ */
+int
+pci_vfio_map_resource(struct rte_pci_device *dev)
+{
+	struct vfio_device_info device_info = { .argsz = sizeof(device_info) };
+	char pci_addr[PATH_MAX] = {0};
+	int vfio_dev_fd;
+	struct rte_pci_addr *loc = &dev->addr;
+	int i, ret, msix_bar;
+	struct mapped_pci_resource *vfio_res = NULL;
+	struct mapped_pci_res_list *vfio_res_list = RTE_TAILQ_CAST(rte_vfio_tailq.head, mapped_pci_res_list);
+
+	struct pci_map *maps;
+	uint32_t msix_table_offset = 0;
+	uint32_t msix_table_size = 0;
+	uint32_t ioport_bar;
+
+	dev->intr_handle.fd = -1;
+	dev->intr_handle.type = RTE_INTR_HANDLE_UNKNOWN;
+
+	/* store PCI address string */
+	snprintf(pci_addr, sizeof(pci_addr), PCI_PRI_FMT,
+			loc->domain, loc->bus, loc->devid, loc->function);
+
+	if ((ret = pci_vfio_setup_device(pci_addr, &vfio_dev_fd, &device_info)))
+		return ret;
+
 	/* get MSI-X BAR, if any (we have to know where it is because we can't
 	 * easily mmap it when using VFIO) */
 	msix_bar = -1;
-- 
2.8.0

  parent reply	other threads:[~2016-06-13 13:07 UTC|newest]

Thread overview: 49+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2016-04-29 13:44 [PATCH 00/15] Make VFIO support independent on PCI Jan Viktorin
2016-04-29 13:44 ` [PATCH 01/15] vfio: fix include of eal_private.h to be local Jan Viktorin
2016-04-29 13:44 ` [PATCH 02/15] vfio: move VFIO-specific stuff to eal_vfio.h Jan Viktorin
2016-04-29 13:44 ` [PATCH 03/15] vfio: move common vfio constants " Jan Viktorin
2016-04-29 13:44 ` [PATCH 04/15] vfio: move vfio_iommu_type and dma_map functions to eal_vfio Jan Viktorin
2016-04-29 13:44 ` [PATCH 05/15] vfio: generalize pci_vfio_set_iommu_type Jan Viktorin
2016-04-29 13:44 ` [PATCH 06/15] vfio: generalize pci_vfio_has_supported_extensions Jan Viktorin
2016-04-29 13:44 ` [PATCH 07/15] vfio: move vfio-specific SOCKET_* constants Jan Viktorin
2016-04-29 13:44 ` [PATCH 08/15] vfio: generalize pci_vfio_get_container_fd Jan Viktorin
2016-04-29 13:44 ` [PATCH 09/15] vfio: generalize pci_vfio_get_group_no Jan Viktorin
2016-04-29 13:44 ` [PATCH 10/15] vfio: extract setup logic out of pci_vfio_map_resource Jan Viktorin
2016-05-10 11:53   ` Burakov, Anatoly
2016-05-10 12:58     ` Jan Viktorin
2016-05-10 13:17       ` Jan Viktorin
2016-04-29 13:44 ` [PATCH 11/15] vfio: move global vfio_cfg to eal_vfio.c Jan Viktorin
2016-05-10 11:56   ` Burakov, Anatoly
2016-05-10 12:55     ` Jan Viktorin
2016-05-13 15:34   ` Jan Viktorin
2016-04-29 13:44 ` [PATCH 12/15] vfio: make vfio_*_dma_map and iommu_types private Jan Viktorin
2016-04-29 13:44 ` [PATCH 13/15] vfio: rename and generalize eal_pci_vfio_mp_sync Jan Viktorin
2016-04-29 13:44 ` [PATCH 14/15] vfio: initialize vfio out of the PCI subsystem Jan Viktorin
2016-04-29 13:44 ` [PATCH 15/15] vfio: change VFIO init to be extendable Jan Viktorin
2016-05-10 11:50   ` Burakov, Anatoly
2016-05-10 12:54     ` Jan Viktorin
2016-05-10 13:15       ` Burakov, Anatoly
2016-05-10 12:18 ` [PATCH 00/15] Make VFIO support independent on PCI Santosh Shukla
2016-05-10 12:45   ` Jan Viktorin
2016-06-13 13:01 ` [PATCH v2 00/16] Make VFIO support less dependent " Jan Viktorin
2016-06-13 13:01 ` [PATCH v2 01/16] vfio: fix include of eal_private.h to be local Jan Viktorin
2016-07-04 10:22   ` Burakov, Anatoly
2016-07-04 10:55     ` Jan Viktorin
2016-07-04 15:00     ` Jan Viktorin
2016-07-04 15:09       ` Burakov, Anatoly
2016-06-13 13:01 ` [PATCH v2 02/16] vfio: move VFIO-specific stuff to eal_vfio.h Jan Viktorin
2016-06-13 13:01 ` [PATCH v2 03/16] vfio: move common vfio constants " Jan Viktorin
2016-06-13 13:01 ` [PATCH v2 04/16] vfio: move vfio_iommu_type and dma_map functions to eal_vfio Jan Viktorin
2016-06-13 13:01 ` [PATCH v2 05/16] vfio: generalize pci_vfio_set_iommu_type Jan Viktorin
2016-06-13 13:01 ` [PATCH v2 06/16] vfio: generalize pci_vfio_has_supported_extensions Jan Viktorin
2016-06-13 13:01 ` [PATCH v2 07/16] vfio: move vfio-specific SOCKET_* constants Jan Viktorin
2016-06-13 13:01 ` [PATCH v2 08/16] vfio: generalize pci_vfio_get_container_fd Jan Viktorin
2016-06-13 13:01 ` [PATCH v2 09/16] vfio: generalize pci_vfio_get_group_no Jan Viktorin
2016-06-13 13:02 ` Jan Viktorin [this message]
2016-06-13 13:02 ` [PATCH v2 11/16] vfio: move global vfio_cfg to eal_vfio.c Jan Viktorin
2016-06-13 13:02 ` [PATCH v2 12/16] vfio: fix typo in doc for vfio_setup_device Jan Viktorin
2016-06-24 15:55   ` Mcnamara, John
2016-06-13 13:02 ` [PATCH v2 13/16] vfio: make vfio_*_dma_map and iommu_types private Jan Viktorin
2016-06-13 13:02 ` [PATCH v2 14/16] vfio: rename and generalize eal_pci_vfio_mp_sync Jan Viktorin
2016-06-13 13:02 ` [PATCH v2 15/16] vfio: initialize vfio out of the PCI subsystem Jan Viktorin
2016-06-13 13:02 ` [PATCH v2 16/16] vfio: change VFIO init to be extendable Jan Viktorin

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1465822926-23742-11-git-send-email-viktorin@rehivetech.com \
    --to=viktorin@rehivetech.com \
    --cc=anatoly.burakov@intel.com \
    --cc=david.marchand@6wind.com \
    --cc=dev@dpdk.org \
    --cc=keith.wiles@intel.com \
    --cc=shreyansh.jain@nxp.com \
    --cc=sshukla@mvista.com \
    --cc=stephen@networkplumber.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.