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 C9A8F532C for ; Wed, 24 Oct 2018 04:20:29 +0200 (CEST) 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 CBB33341; Tue, 23 Oct 2018 19:20:28 -0700 (PDT) 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 46BAA3F627; Tue, 23 Oct 2018 19:20:28 -0700 (PDT) From: "tone.zhang" To: dev@dpdk.org Cc: nd@arm.com Date: Wed, 24 Oct 2018 10:20:04 +0800 Message-Id: <1540347604-18590-1-git-send-email-tone.zhang@arm.com> X-Mailer: git-send-email 2.7.4 Subject: [dpdk-dev] [PATCH] 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: Wed, 24 Oct 2018 02:20:30 -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 MSI table to the PAGE_SIZE, the end offset of the MSI table is out 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. 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 --- drivers/bus/pci/linux/pci_vfio.c | 25 +++++++++++++++++++++---- 1 file changed, 21 insertions(+), 4 deletions(-) diff --git a/drivers/bus/pci/linux/pci_vfio.c b/drivers/bus/pci/linux/pci_vfio.c index b1f0683..1373345 100644 --- a/drivers/bus/pci/linux/pci_vfio.c +++ b/drivers/bus/pci/linux/pci_vfio.c @@ -445,9 +445,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 this BAR%d\n", bar_index); return 0; + } if (msix_table->bar_index == bar_index) { /* @@ -457,7 +459,12 @@ 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_start = (table_start + ~PAGE_MASK) & PAGE_MASK; + /* after rounding to PAGE_SIZE, it is over the bar->size, + * fall back to the MSI-X table offset in the bar. + */ + if (table_start >= bar->size) + table_start = msix_table->offset; if (table_start == 0 && table_end >= bar->size) { /* Cannot map this BAR */ @@ -469,8 +476,18 @@ 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) { + /* + * after rounding to PAGE_SIZE we don't have any space + * left after the MSI table, so don't try and map it. + */ + 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