From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from foss.arm.com (usa-sjc-mx-foss1.foss.arm.com [217.140.101.70]) by dpdk.org (Postfix) with ESMTP id DC9025424 for ; Mon, 19 Nov 2018 03:37:33 +0100 (CET) Received: from usa-sjc-imap-foss1.foss.arm.com (unknown [10.72.51.249]) by usa-sjc-mx-foss1.foss.arm.com (Postfix) with ESMTP id 1802780D; Sun, 18 Nov 2018 18:37:33 -0800 (PST) Received: from wls-arm-softiron03.shanghai.arm.com (wls-arm-softiron03.shanghai.arm.com [10.169.41.39]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPA id 0C09E3F5A0; Sun, 18 Nov 2018 18:37:31 -0800 (PST) From: "tone.zhang" To: dev@dpdk.org Cc: gavin.hu@arm.com, honnappa.nagarahalli@arm.com, Steve.Capper@arm.com, anatoly.burakov@intel.com, nd@arm.com Date: Mon, 19 Nov 2018 10:37:24 +0800 Message-Id: <1542595044-27145-1-git-send-email-tone.zhang@arm.com> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1541743077-27994-1-git-send-email-tone.zhang@arm.com> References: <1541743077-27994-1-git-send-email-tone.zhang@arm.com> Subject: [dpdk-dev] [PATCH v3] pci_vfio: Support 64KB kernel page_size with vfio-pci driver X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 19 Nov 2018 02:37:34 -0000 With a larger PAGE_SIZE it is possible for the MSI table to very close to the end of the BAR s.t. when we align the start and end of the MSI table to the PAGE_SIZE, the end offset of the MSI table is out of the PCI BAR boundary. This patch addresses the issue by comparing both the start and the end offset of the MSI table with the BAR size, and skip the mapping if it is out of Bar scope. The patch fixes the debug log as below: EAL: Skipping BAR0 Signed-off-by: tone.zhang Reviewed-by: Gavin Hu Reviewed-by: Honnappa Nagarahalli Reviewed-by: Steve Capper Reviewed-by: Anatoly Burakov --- drivers/bus/pci/linux/pci_vfio.c | 27 ++++++++++++++++++++++----- 1 file changed, 22 insertions(+), 5 deletions(-) diff --git a/drivers/bus/pci/linux/pci_vfio.c b/drivers/bus/pci/linux/pci_vfio.c index ffd26f1..0e7bfd7 100644 --- a/drivers/bus/pci/linux/pci_vfio.c +++ b/drivers/bus/pci/linux/pci_vfio.c @@ -457,9 +457,11 @@ pci_vfio_mmap_bar(int vfio_dev_fd, struct mapped_pci_resource *vfio_res, struct pci_msix_table *msix_table = &vfio_res->msix_table; struct pci_map *bar = &vfio_res->maps[bar_index]; - if (bar->size == 0) + if (bar->size == 0) { /* Skip this BAR */ + RTE_LOG(INFO, EAL, "Skipping BAR%d\n", bar_index); return 0; + } if (msix_table->bar_index == bar_index) { /* @@ -468,8 +470,14 @@ pci_vfio_mmap_bar(int vfio_dev_fd, struct mapped_pci_resource *vfio_res, */ uint32_t table_start = msix_table->offset; uint32_t table_end = table_start + msix_table->size; - table_end = (table_end + ~PAGE_MASK) & PAGE_MASK; - table_start &= PAGE_MASK; + table_end = RTE_ALIGN(table_end, PAGE_SIZE); + table_start = RTE_ALIGN(table_start, PAGE_SIZE); + + /* If page-aligned start of MSI-X table is beyond BAR size, + * shrink the mapping size to MSI-X table start address. + */ + if (table_start >= bar->size) + table_start = msix_table->offset; if (table_start == 0 && table_end >= bar->size) { /* Cannot map this BAR */ @@ -481,8 +489,17 @@ pci_vfio_mmap_bar(int vfio_dev_fd, struct mapped_pci_resource *vfio_res, memreg[0].offset = bar->offset; memreg[0].size = table_start; - memreg[1].offset = bar->offset + table_end; - memreg[1].size = bar->size - table_end; + if (bar->size < table_end) { + /* + * If MSI-X table end is beyond BAR end, don't attempt + * to perform second mapping. + */ + memreg[1].offset = 0; + memreg[1].size = 0; + } else { + memreg[1].offset = bar->offset + table_end; + memreg[1].size = bar->size - table_end; + } RTE_LOG(DEBUG, EAL, "Trying to map BAR%d that contains the MSI-X " -- 2.7.4