From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: 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 Content-Transfer-Encoding: 8bit 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 --- 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; -- 2.25.1