From patchwork Wed Nov 22 10:22:31 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Mingjin Ye X-Patchwork-Id: 134526 X-Patchwork-Delegate: thomas@monjalon.net Return-Path: X-Original-To: patchwork@inbox.dpdk.org Delivered-To: patchwork@inbox.dpdk.org Received: from mails.dpdk.org (mails.dpdk.org [217.70.189.124]) by inbox.dpdk.org (Postfix) with ESMTP id CA2FF4339B; Wed, 22 Nov 2023 11:38:05 +0100 (CET) Received: from mails.dpdk.org (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id BA91240A81; Wed, 22 Nov 2023 11:38:05 +0100 (CET) Received: from mgamail.intel.com (mgamail.intel.com [198.175.65.10]) by mails.dpdk.org (Postfix) with ESMTP id AB48340A77 for ; Wed, 22 Nov 2023 11:38:03 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1700649484; x=1732185484; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=cufHr8mNyUc91pqOAeiKkzE6kSAjmEr+8oi2XGq9PDE=; b=Dqs1ala0Qlx7HHiAXjbmgFejgErMouFheXg+cCADFbyIS4Cr+EgnXO7q 0Q1iBcHexPsWImY0Oh20NSVQjHHV+Lkz82V8lQ8b+QxT7VbUreq74jgnL mLMt9eeu7lNFc5a2/3PwYcA9rota3bc7JxOVxqqe32ql/BSPuB9ZfVnmP x2G3NeiCn31Njj5k7IrzJJ6LXjyOEUH5p+Z9WYp4pvp6VNoHbLZpZRiVn F9zDIUuSFn6hiOfARlMchvY1MqEZ35RydQ0oM6XI1RPRzRnxbH9blzkT5 BQp5p6GzASWZWXScmOJzbNhljvI2IZAasXMvWKIcaV9ba9N4L/aNrHI9Q Q==; X-IronPort-AV: E=McAfee;i="6600,9927,10901"; a="5221088" X-IronPort-AV: E=Sophos;i="6.04,218,1695711600"; d="scan'208";a="5221088" Received: from fmviesa002.fm.intel.com ([10.60.135.142]) by orvoesa102.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 22 Nov 2023 02:38:03 -0800 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="6.04,218,1695711600"; d="scan'208";a="8389755" Received: from unknown (HELO localhost.localdomain) ([10.239.252.253]) by fmviesa002-auth.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 22 Nov 2023 02:38:01 -0800 From: Mingjin Ye To: dev@dpdk.org Cc: qiming.yang@intel.com, Mingjin Ye , Anatoly Burakov Subject: [PATCH v7 1/2] vfio: add get device info API Date: Wed, 22 Nov 2023 10:22:31 +0000 Message-Id: <20231122102232.108299-2-mingjinx.ye@intel.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20231122102232.108299-1-mingjinx.ye@intel.com> References: <20231114102418.409285-1-mingjinx.ye@intel.com> <20231122102232.108299-1-mingjinx.ye@intel.com> MIME-Version: 1.0 X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org This patch adds an API to support getting device information. The driver can use the "rte_vfio_get_device_info" helper to get device information from EAL. Signed-off-by: Mingjin Ye Acked-by: Nipun Gupta --- lib/eal/include/rte_vfio.h | 29 +++++++++++++++++++++++++++++ lib/eal/linux/eal_vfio.c | 27 +++++++++++++++++++++++++++ lib/eal/version.map | 3 +++ 3 files changed, 59 insertions(+) diff --git a/lib/eal/include/rte_vfio.h b/lib/eal/include/rte_vfio.h index 22832afd0f..50c4f5b617 100644 --- a/lib/eal/include/rte_vfio.h +++ b/lib/eal/include/rte_vfio.h @@ -17,6 +17,8 @@ extern "C" { #include #include +#include + /* * determine if VFIO is present on the system */ @@ -239,6 +241,33 @@ int rte_vfio_get_group_num(const char *sysfs_base, const char *dev_addr, int *iommu_group_num); +/** + * Get device information + * + * This function is only relevant to linux and will return + * an error on BSD. + * + * @param sysfs_base + * sysfs path prefix. + * + * @param dev_addr + * device location. + * + * @param vfio_dev_fd + * VFIO fd. + * + * @param device_info + * Device information. + * + * @return + * 0 on success. + * <0 on failure. + */ +__rte_experimental +int +rte_vfio_get_device_info(const char *sysfs_base, const char *dev_addr, + int *vfio_dev_fd, struct vfio_device_info *device_info); + /** * Open a new VFIO container fd * diff --git a/lib/eal/linux/eal_vfio.c b/lib/eal/linux/eal_vfio.c index ad3c1654b2..05a0091006 100644 --- a/lib/eal/linux/eal_vfio.c +++ b/lib/eal/linux/eal_vfio.c @@ -1222,6 +1222,33 @@ vfio_set_iommu_type(int vfio_container_fd) return NULL; } +int +rte_vfio_get_device_info(const char *sysfs_base, const char *dev_addr, + int *vfio_dev_fd, struct vfio_device_info *device_info) +{ + int ret; + + if (!device_info || *vfio_dev_fd < 0) + return -1; + + if (*vfio_dev_fd == 0) { + ret = rte_vfio_setup_device(sysfs_base, dev_addr, + vfio_dev_fd, device_info); + if (ret) + return -1; + } else { + 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", dev_addr, errno, + strerror(errno)); + return -1; + } + } + + return 0; +} + int vfio_has_supported_extensions(int vfio_container_fd) { diff --git a/lib/eal/version.map b/lib/eal/version.map index 5e0cd47c82..c06ceaad50 100644 --- a/lib/eal/version.map +++ b/lib/eal/version.map @@ -393,6 +393,9 @@ EXPERIMENTAL { # added in 23.07 rte_memzone_max_get; rte_memzone_max_set; + + # added in 23.11 + rte_vfio_get_device_info; # WINDOWS_NO_EXPORT }; INTERNAL { From patchwork Wed Nov 22 10:22:32 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Mingjin Ye X-Patchwork-Id: 134527 X-Patchwork-Delegate: thomas@monjalon.net Return-Path: X-Original-To: patchwork@inbox.dpdk.org Delivered-To: patchwork@inbox.dpdk.org Received: from mails.dpdk.org (mails.dpdk.org [217.70.189.124]) by inbox.dpdk.org (Postfix) with ESMTP id 61A714339B; Wed, 22 Nov 2023 11:38:10 +0100 (CET) Received: from mails.dpdk.org (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id EA39040A89; Wed, 22 Nov 2023 11:38:06 +0100 (CET) Received: from mgamail.intel.com (mgamail.intel.com [198.175.65.10]) by mails.dpdk.org (Postfix) with ESMTP id 3E0E140A77 for ; Wed, 22 Nov 2023 11:38:05 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1700649485; x=1732185485; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=Wkc4l3P/PqjfwgjKkaHSiDHeNDfa5WyI9Ff7/RNVx9w=; b=kqHhORwrkRyovGXvAbIIvNZzZZccVGLeoGEirbhFE0XNQT/zGhwL7KVb N3IxQ9zmbFr2c9F0FzIUYAL6tgqiyeN7OuDocnDVh6JRMCUVl5EYDM0Gr mIx0Cw0i8xHWNquV2qAXYA0peh+niHNfpshvtPbkH9Pjkrik3W+Nr6dK6 gQw7R675Z/491Z7YOglHH+p0kjGh1PDHDoAvSXXe0UJnY7glNzQgkyPv1 ikG2oa5hKPeyk4Hzi6FrqsW3/2mt7uE0x8791SioWsRmcjFEWZXQERP29 vWOZ8wp3ItXI4z5IuXbN7sxQv3A6iOcL+Asc1InQzO/23hTCf2QBtJ4Eu w==; X-IronPort-AV: E=McAfee;i="6600,9927,10901"; a="5221090" X-IronPort-AV: E=Sophos;i="6.04,218,1695711600"; d="scan'208";a="5221090" Received: from fmviesa002.fm.intel.com ([10.60.135.142]) by orvoesa102.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 22 Nov 2023 02:38:05 -0800 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="6.04,218,1695711600"; d="scan'208";a="8389783" Received: from unknown (HELO localhost.localdomain) ([10.239.252.253]) by fmviesa002-auth.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 22 Nov 2023 02:38:02 -0800 From: Mingjin Ye To: dev@dpdk.org Cc: qiming.yang@intel.com, Mingjin Ye , Anatoly Burakov , Chenbo Xia , Nipun Gupta Subject: [PATCH v7 2/2] bus/pci: fix legacy device missing region info Date: Wed, 22 Nov 2023 10:22:32 +0000 Message-Id: <20231122102232.108299-3-mingjinx.ye@intel.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20231122102232.108299-1-mingjinx.ye@intel.com> References: <20231114102418.409285-1-mingjinx.ye@intel.com> <20231122102232.108299-1-mingjinx.ye@intel.com> MIME-Version: 1.0 X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org If the legacy device in the primary process does not support mapping the io port bar, the secondary process needs to proactively get the device information and fil the region information. Fixes: 4b741542ecde ("bus/pci: avoid depending on private kernel value") Signed-off-by: Mingjin Ye Acked-by: Nipun Gupta --- v7: Modify commit log --- 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..ee4cfb2598 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) != 0) + 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;