From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from dpdk.org (dpdk.org [92.243.14.124]) by inbox.dpdk.org (Postfix) with ESMTP id B1FE5A04BB; Fri, 25 Sep 2020 04:15:40 +0200 (CEST) Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id 62F971DFF1; Fri, 25 Sep 2020 04:15:39 +0200 (CEST) Received: from alln-iport-4.cisco.com (alln-iport-4.cisco.com [173.37.142.91]) by dpdk.org (Postfix) with ESMTP id EF5F71DD1D for ; Fri, 25 Sep 2020 04:15:37 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=cisco.com; i=@cisco.com; l=3040; q=dns/txt; s=iport; t=1601000138; x=1602209738; h=from:to:cc:subject:date:message-id:mime-version: content-transfer-encoding; bh=gRDZzdpxyjCzI/lAdWuTxKPQvMKW+AJdERbJ9g3iZCI=; b=a4GLTLZTYvXCkRda9Z+u6pplNIVDIMMeNEJOWCLLJnMu3nDNAttCvvpy d7gNfLQg2wDBd31fTNzinQSE6XgoRv34AJXxppKcgBuvzVQZ9ozGPnTd9 8+YkzjG1nG379cFHX9+vV0v4JxvXTfi78zylndDJN9sdn+gZYwkMTZSSN k=; X-IronPort-AV: E=Sophos;i="5.77,300,1596499200"; d="scan'208";a="548338113" Received: from alln-core-7.cisco.com ([173.36.13.140]) by alln-iport-4.cisco.com with ESMTP/TLS/DHE-RSA-SEED-SHA; 25 Sep 2020 02:15:37 +0000 Received: from cisco.com (savbu-usnic-a.cisco.com [10.193.184.48]) by alln-core-7.cisco.com (8.15.2/8.15.2) with ESMTP id 08P2FaDl019457; Fri, 25 Sep 2020 02:15:36 GMT Received: by cisco.com (Postfix, from userid 508933) id 9292120F2005; Thu, 24 Sep 2020 19:15:36 -0700 (PDT) From: Hyong Youb Kim To: Ferruh Yigit , David Marchand , Thomas Monjalon Cc: dev@dpdk.org, John Daley , Hyong Youb Kim , Anatoly Burakov Date: Thu, 24 Sep 2020 19:14:35 -0700 Message-Id: <20200925021435.16114-1-hyonkim@cisco.com> X-Mailer: git-send-email 2.26.2 MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Outbound-SMTP-Client: 10.193.184.48, savbu-usnic-a.cisco.com X-Outbound-Node: alln-core-7.cisco.com Subject: [dpdk-dev] [PATCH] bus/pci: fix mapping BAR containing MSI-X table 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: , Errors-To: dev-bounces@dpdk.org Sender: "dev" When the BAR contains MSI-X table, pci_vfio_mmap_bar() tries to skip the table and map the rest. "map around it" is the phrase used in the source. The function splits the BAR into two regions: the region before the table (first part or memreg[0]) and the region after the table (second part or memreg[1]). For hardware that has MSI-X vector table offset 0, the first part does not exist (memreg[0].size == 0). Capabilities: [60] MSI-X: Enable- Count=48 Masked- Vector table: BAR=2 offset=00000000 PBA: BAR=2 offset=00001000 The mapping part of the function maps the first part, if it exists. Then, it maps the second part, if it exists and "if mapping the first part succeeded". The recent change that replaces MAP_FAILED with NULL breaks the "if mapping the first part succeeded" condition (1) in the snippet below. void *map_addr = NULL; if (memreg[0].size) { /* actual map of first part */ map_addr = pci_map_resource(...); } /* if there's a second part, try to map it */ if (map_addr != NULL // -- (1) && memreg[1].offset && memreg[1].size) { [...] } if (map_addr == NULL) { RTE_LOG(ERR, EAL, "Failed to map pci BAR%d\n", bar_index); return -1; } When the first part does not exist, (1) sees map_addr is still NULL, and the function fails. This behavior is a regression and fails probing hardware with vector table offset 0. Previously, (1) was "map_addr != MAP_FAILED", which meant pci_map_resource() was actually attempted and failed. So, expand (1) to check if the first part exists as well, to match the semantics of MAP_FAILED. Bugzilla ID: 539 Fixes: e200535c1ca3 ("mem: drop mapping API workaround") Signed-off-by: Hyong Youb Kim --- drivers/bus/pci/linux/pci_vfio.c | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/drivers/bus/pci/linux/pci_vfio.c b/drivers/bus/pci/linux/pci_vfio.c index 34b5da80df..d2073994fa 100644 --- a/drivers/bus/pci/linux/pci_vfio.c +++ b/drivers/bus/pci/linux/pci_vfio.c @@ -564,8 +564,20 @@ pci_vfio_mmap_bar(int vfio_dev_fd, struct mapped_pci_resource *vfio_res, RTE_MAP_FORCE_ADDRESS); } + /* + * Regarding "memreg[0].size == 0": + * If this BAR has MSI-X table, memreg[0].size (the + * first part or the part before the table) can + * legitimately be 0 for hardware using vector table + * offset 0 (i.e. first part does not exist). + * + * When memreg[0].size is 0, "mapping the first part" + * never happens, and map_addr is NULL at this + * point. So check that mapping has been actually + * attempted. + */ /* if there's a second part, try to map it */ - if (map_addr != NULL + if ((map_addr != NULL || memreg[0].size == 0) && memreg[1].offset && memreg[1].size) { void *second_addr = RTE_PTR_ADD(bar_addr, (uintptr_t)(memreg[1].offset - -- 2.26.2