[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[PATCH] vpci/msix: use host msix table address


  • To: <xen-devel@xxxxxxxxxxxxxxxxxxxx>
  • From: Stewart Hildebrand <stewart.hildebrand@xxxxxxx>
  • Date: Tue, 15 Apr 2025 14:01:56 -0400
  • Arc-authentication-results: i=1; mx.microsoft.com 1; spf=pass (sender ip is 165.204.84.17) smtp.rcpttodomain=lists.xenproject.org smtp.mailfrom=amd.com; dmarc=pass (p=quarantine sp=quarantine pct=100) action=none header.from=amd.com; dkim=none (message not signed); arc=none (0)
  • Arc-message-signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector10001; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=1yX9qihEG9ZRRl+9JNZ1O5WlZCmgIF1K6CKiWw0zST8=; b=J3GM8NhgaYrBrklDrcgwg/xZMKN+S9iQerAx2B0nNq2ypM+OW9yt4rtQk7HUNqDHrLTdsJquMRPVFMd5YgrtTVdndQ5ucv3d8eiL/caFiIf3aa+0BCStxEWPleEYaO3rr24zbYzTucc8qqjzFom/4pTgRQB/XEP5Z71J9KmMmzbgpelA8zTAy1U77jb3EsPHYBMUUuIAYQ4ShvE4Zj8SkJK+/MMkqWeB8FYr+VyccdOA+4yfbx7gqWNGz51YswIVi298aK3W/S+hgBKh4n4KbD0eXPGxdF30JCSCC4jpVTSvftZ8uo9PurCeAtfQRZGQ8/AdqcOX0nFRYjWoaUoJXw==
  • Arc-seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=HGTsIzlydB8hrE96dARo9p139yK//K9s+UBnb42U4BvoknlO+dgdlN942j0dXHL+9UuzOZBuwL7Zuz17F+g0T4uhHQo1OTLLtJtD2/Y3e6YHbMQ8IrBPXySoRejyypq4K7SiN8M01shCLDQ8o0q821M3JFG+Wy8M+CTNa0sfthuTW/oBgMGVo5Gnlz0EkIhY8E8+C9j/tmhDJ60sYVpioqA/OjtSLTgaQ6Pl1j5DDrpfYZFY7v7pZWRlrYu6s5mJWt9dOlDp6t6VS5jt/gH/qN8A9alNqScikmb5fcIVkKk5Hb8F9bDV/ckC4QDbmL6MUW2lWHB0BUD8fbhBk0xPDQ==
  • Cc: Stewart Hildebrand <stewart.hildebrand@xxxxxxx>, Roger Pau Monné <roger.pau@xxxxxxxxxx>
  • Delivery-date: Tue, 15 Apr 2025 18:02:26 +0000
  • List-id: Xen developer discussion <xen-devel.lists.xenproject.org>

Introduce vmsix_table_host_{addr,base} returning the host physical MSI-X
table address and base. Use them in update_entry() and get_table().

Remove stale comment.

Signed-off-by: Stewart Hildebrand <stewart.hildebrand@xxxxxxx>
---
I considered adding this tag:
Fixes: 52ebde3cfae2 ("vpci/header: program p2m with guest BAR view")
but I left it out since upstream currently only supports identity-mapped
vPCI.
---
 xen/drivers/vpci/msix.c | 14 ++++----------
 xen/include/xen/vpci.h  | 13 +++++++++++++
 2 files changed, 17 insertions(+), 10 deletions(-)

diff --git a/xen/drivers/vpci/msix.c b/xen/drivers/vpci/msix.c
index 6bd8c55bb48e..f3804ce047a3 100644
--- a/xen/drivers/vpci/msix.c
+++ b/xen/drivers/vpci/msix.c
@@ -57,8 +57,8 @@ static void update_entry(struct vpci_msix_entry *entry,
     }
 
     rc = vpci_msix_arch_enable_entry(entry, pdev,
-                                     vmsix_table_base(pdev->vpci,
-                                                      VPCI_MSIX_TABLE));
+                                     vmsix_table_host_base(pdev->vpci,
+                                                           VPCI_MSIX_TABLE));
     if ( rc )
     {
         gprintk(XENLOG_WARNING, "%pp: unable to enable entry %u: %d\n",
@@ -218,14 +218,14 @@ static void __iomem *get_table(const struct vpci *vpci, 
unsigned int slot)
         addr = vmsix_table_size(vpci, VPCI_MSIX_TABLE);
         fallthrough;
     case VPCI_MSIX_TBL_HEAD:
-        addr += vmsix_table_addr(vpci, VPCI_MSIX_TABLE);
+        addr += vmsix_table_host_addr(vpci, VPCI_MSIX_TABLE);
         break;
 
     case VPCI_MSIX_PBA_TAIL:
         addr = vmsix_table_size(vpci, VPCI_MSIX_PBA);
         fallthrough;
     case VPCI_MSIX_PBA_HEAD:
-        addr += vmsix_table_addr(vpci, VPCI_MSIX_PBA);
+        addr += vmsix_table_host_addr(vpci, VPCI_MSIX_PBA);
         break;
 
     default:
@@ -242,12 +242,6 @@ static unsigned int get_slot(const struct vpci *vpci, 
unsigned long addr)
 {
     unsigned long pfn = PFN_DOWN(addr);
 
-    /*
-     * The logic below relies on having the tables identity mapped to the guest
-     * address space, or for the `addr` parameter to be translated into its
-     * host physical memory address equivalent.
-     */
-
     if ( pfn == PFN_DOWN(vmsix_table_addr(vpci, VPCI_MSIX_TABLE)) )
         return VPCI_MSIX_TBL_HEAD;
     if ( pfn == PFN_DOWN(vmsix_table_addr(vpci, VPCI_MSIX_TABLE) +
diff --git a/xen/include/xen/vpci.h b/xen/include/xen/vpci.h
index 807401b2eaa2..475981cb8155 100644
--- a/xen/include/xen/vpci.h
+++ b/xen/include/xen/vpci.h
@@ -231,6 +231,19 @@ int vpci_msix_arch_print(const struct vpci_msix *msix);
  * Helper functions to fetch MSIX related data. They are used by both the
  * emulated MSIX code and the BAR handlers.
  */
+static inline paddr_t vmsix_table_host_base(const struct vpci *vpci,
+                                            unsigned int nr)
+{
+    return vpci->header.bars[vpci->msix->tables[nr] & PCI_MSIX_BIRMASK].addr;
+}
+
+static inline paddr_t vmsix_table_host_addr(const struct vpci *vpci,
+                                            unsigned int nr)
+{
+    return vmsix_table_host_base(vpci, nr) +
+           (vpci->msix->tables[nr] & ~PCI_MSIX_BIRMASK);
+}
+
 static inline paddr_t vmsix_table_base(const struct vpci *vpci, unsigned int 
nr)
 {
     return vpci->header.bars[vpci->msix->tables[nr] &

base-commit: 38d07809794e3c723a4de7e10c25c1f6cb590dc6
-- 
2.49.0




 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.