[v6] bus/pci: fix legacy device IO port map

Message ID 20231114102418.409285-1-mingjinx.ye@intel.com (mailing list archive)
State Superseded, archived
Delegated to: Thomas Monjalon
Headers
Series [v6] bus/pci: fix legacy device IO port map |

Checks

Context Check Description
ci/checkpatch success coding style OK
ci/loongarch-compilation fail ninja build failure
ci/github-robot: build fail github build: failed
ci/iol-testing fail build patch failure
ci/Intel-compilation fail Compilation issues

Commit Message

Mingjin Ye Nov. 14, 2023, 10:24 a.m. UTC
  When doing IO port mapping for legacy device in secondary process, the
region information is missing, so, we need to refill it.

Fixes: 4b741542ecde ("bus/pci: avoid depending on private kernel value")
Cc: stable@dpdk.org

Signed-off-by: Mingjin Ye <mingjinx.ye@intel.com>
---
v6:
 - split patch
v5:
 - adding checks to vfio setup
v4:
 - adjusting commit log
v3:
 - adjusting variable settings
v2:
 - add release of device in pci_vfio_ioport_unmap
---
 drivers/bus/pci/linux/pci_vfio.c | 26 ++++++++++++++++++++++++++
 1 file changed, 26 insertions(+)
  

Comments

Gupta, Nipun Nov. 15, 2023, 11:26 a.m. UTC | #1
On 11/14/2023 3:54 PM, Mingjin Ye wrote:
> When doing IO port mapping for legacy device in secondary process, the
> region information is missing, so, we need to refill it.
> 
> Fixes: 4b741542ecde ("bus/pci: avoid depending on private kernel value")
> Cc: stable@dpdk.org
> 
> Signed-off-by: Mingjin Ye <mingjinx.ye@intel.com>
> ---
> v6:
>   - split patch
> v5:
>   - adding checks to vfio setup
> v4:
>   - adjusting commit log
> v3:
>   - adjusting variable settings
> v2:
>   - add release of device in pci_vfio_ioport_unmap
> ---
>   drivers/bus/pci/linux/pci_vfio.c | 26 ++++++++++++++++++++++++++
>   1 file changed, 26 insertions(+)
> 
> diff --git a/drivers/bus/pci/linux/pci_vfio.c b/drivers/bus/pci/linux/pci_vfio.c
> index 3f3201daf2..a18161c27b 100644
> --- a/drivers/bus/pci/linux/pci_vfio.c
> +++ b/drivers/bus/pci/linux/pci_vfio.c
> @@ -1230,6 +1230,32 @@ pci_vfio_ioport_map(struct rte_pci_device *dev, int bar,
>   		return -1;
>   	}
>   
> +	if (rte_eal_process_type() == RTE_PROC_SECONDARY) {

Please add a comment why we are doing this in secondary only. With this 
change/comment incorporated

Acked-by: Nipun Gupta <nipun.gupta@amd.com>
  
Mingjin Ye Nov. 24, 2023, 10:38 a.m. UTC | #2
Hi,

can you please take a look at this patch.

Thanks,
Mingjin

> -----Original Message-----
> From: Ye, MingjinX <mingjinx.ye@intel.com>
> Sent: Wednesday, November 22, 2023 6:23 PM
> To: dev@dpdk.org
> Cc: Yang, Qiming <qiming.yang@intel.com>; Ye, MingjinX
> <mingjinx.ye@intel.com>
> Subject: [PATCH v7 0/2] fix legacy device missing region info
> 
> Fill in missing region information for legacy devices in secondary processes.
> And added rte_vfio_get_device_info API for EAL, which makes it easier and
> more generic to get device information through vfio driver.
> 
> Mingjin Ye (2):
>   vfio: add get device info API
>   bus/pci: fix legacy device missing region info
> 
>  drivers/bus/pci/linux/pci_vfio.c | 26 ++++++++++++++++++++++++++
>  lib/eal/include/rte_vfio.h       | 29 +++++++++++++++++++++++++++++
>  lib/eal/linux/eal_vfio.c         | 27 +++++++++++++++++++++++++++
>  lib/eal/version.map              |  3 +++
>  4 files changed, 85 insertions(+)
> 
> --
> 2.25.1
  

Patch

diff --git a/drivers/bus/pci/linux/pci_vfio.c b/drivers/bus/pci/linux/pci_vfio.c
index 3f3201daf2..a18161c27b 100644
--- a/drivers/bus/pci/linux/pci_vfio.c
+++ b/drivers/bus/pci/linux/pci_vfio.c
@@ -1230,6 +1230,32 @@  pci_vfio_ioport_map(struct rte_pci_device *dev, int bar,
 		return -1;
 	}
 
+	if (rte_eal_process_type() == RTE_PROC_SECONDARY) {
+		struct vfio_device_info device_info = { .argsz = sizeof(device_info) };
+		char pci_addr[PATH_MAX];
+		int vfio_dev_fd;
+		struct rte_pci_addr *loc = &dev->addr;
+
+		/* store PCI address string */
+		snprintf(pci_addr, sizeof(pci_addr), PCI_PRI_FMT,
+				loc->domain, loc->bus, loc->devid, loc->function);
+
+		vfio_dev_fd = rte_intr_dev_fd_get(dev->intr_handle);
+		if (vfio_dev_fd < 0) {
+			return -1;
+		} else if (vfio_dev_fd == 0) {
+			if (rte_vfio_get_device_info(rte_pci_get_sysfs_path(), pci_addr,
+				&vfio_dev_fd, &device_info) != 0)
+				return -1;
+			/* we need save vfio_dev_fd, so it can be used during release */
+			if (rte_intr_dev_fd_set(dev->intr_handle, vfio_dev_fd))
+				return -1;
+
+			if (pci_vfio_fill_regions(dev, vfio_dev_fd, &device_info) != 0)
+				return -1;
+		}
+	}
+
 	if (pci_vfio_get_region(dev, bar, &size, &offset) != 0) {
 		RTE_LOG(ERR, EAL, "Cannot get offset of region %d.\n", bar);
 		return -1;