[v6] bus/pci: fix legacy device IO port map
Checks
Commit Message
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
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>
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
@@ -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;