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

[PATCH v3 10/11] vpci/msi: Free MSI resources when init_msi() fails


  • To: <xen-devel@xxxxxxxxxxxxxxxxxxxx>
  • From: Jiqian Chen <Jiqian.Chen@xxxxxxx>
  • Date: Mon, 21 Apr 2025 14:19:02 +0800
  • 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=ZbhJV+X4QM6DUMRC6Mk8VHfG8AJ7SeVNQi3bNQIZl1M=; b=VzCtQcUJ0o37Hg9XcIRfv5HJokUGDAABEhA3S0FqaE3KkJnAVycg0t/k9E4PG6Q9HP1/xJj40VTZ9xas6NPmbDJ+jXncGyMfT+hOzcESX+40Hc+vhc6I64JPZXsG31lg/xI7yjSTXkhAQQbyukxdrTqQGE9TC8keYIk2fLXr67w2xfDn8GI//zqFSkxjk34iQb2fRpAJ/D+Wh3N2GrV+WwqAJfrJrWhndOYalWvL46s/iPE/hM7P90XFATSIRXOdd+Tu5Nv8ZYesqwpvNDzd4JuU9YI2kgVE8OGITN/bhby1Ql5w/p/U5Zu5lyJnEbHip04/WWmp+QxWcginRXGhyA==
  • Arc-seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=b3GbvFWV3T9sbOndCdAGYgCAvTEFxxs4bZGA9p8oLrb+l79UO7dEMS0mmA8qHpcMdMDIGsxlqfNWnhXiGDh1sSDiYCSAvwdcEtI6392rA6QK+MGr+5qVrjvyPTFBkYSxBfrF+inNKEWuCulIlDSXJ557/x7fsrJAb7G4Hb3OeCl0USt2Wyj1sNr9eL+YSplQpFMU7dB4oCQnSGSJ255lvTJ1JPPRGzzHzbAEWeOKwy/M1kg1d7fcELlBG7g08ju1UvR/6qwp7SPoMDLS4LfKAPWVzrT3lACZJLjbl8Uou9mmYfYh8Tw2PN5m0g3SmesvdrT5ZgqDH7p3Z60QpuiDSA==
  • Cc: Huang Rui <ray.huang@xxxxxxx>, Jiqian Chen <Jiqian.Chen@xxxxxxx>, Roger Pau Monné <roger.pau@xxxxxxxxxx>
  • Delivery-date: Mon, 21 Apr 2025 06:19:48 +0000
  • List-id: Xen developer discussion <xen-devel.lists.xenproject.org>

When init_msi() fails, the previous new changes will hide MSI
capability, it can't rely on vpci_deassign_device() to remove
all MSI related resources anymore, those resources must be
cleaned up in failure path of init_msi.

To do that, add a new function to free MSI resources.

Signed-off-by: Jiqian Chen <Jiqian.Chen@xxxxxxx>
---
cc: "Roger Pau Monné" <roger.pau@xxxxxxxxxx>
---
v2->v3 changes:
* Remove all fail path, and use fini_msi() hook instead.
* Change the method to calculating the size of msi registers.

v1->v2 changes:
* Added a new function fini_msi to free all MSI resources instead of using an 
array to record registered registers.

Best regards,
Jiqian Chen.
---
 xen/drivers/vpci/msi.c | 28 +++++++++++++++++++++++++++-
 1 file changed, 27 insertions(+), 1 deletion(-)

diff --git a/xen/drivers/vpci/msi.c b/xen/drivers/vpci/msi.c
index ea7dc0c060ea..18b06b789827 100644
--- a/xen/drivers/vpci/msi.c
+++ b/xen/drivers/vpci/msi.c
@@ -193,6 +193,32 @@ static void cf_check mask_write(
     msi->mask = val;
 }
 
+static void fini_msi(struct pci_dev *pdev)
+{
+    unsigned int end, size;
+    struct vpci *vpci = pdev->vpci;
+    const unsigned int msi_pos = pdev->msi_pos;
+
+    if ( !msi_pos || !vpci->msi )
+        return;
+
+    if ( vpci->msi->masking )
+        end = msi_pending_bits_reg(msi_pos, vpci->msi->address64);
+    else
+        end = msi_mask_bits_reg(msi_pos, vpci->msi->address64) - 2;
+
+    size = end - msi_control_reg(msi_pos);
+
+    /*
+     * Remove all possible registered registers except capability ID
+     * register if guest and next capability pointer register, which
+     * will be removed in mask function.
+     */
+    vpci_remove_registers(vpci, msi_control_reg(msi_pos), size);
+    xfree(vpci->msi);
+    vpci->msi = NULL;
+}
+
 static int cf_check init_msi(struct pci_dev *pdev)
 {
     unsigned int pos = pdev->msi_pos;
@@ -270,7 +296,7 @@ static int cf_check init_msi(struct pci_dev *pdev)
 
     return 0;
 }
-REGISTER_VPCI_LEGACY_CAP(PCI_CAP_ID_MSI, init_msi, NULL);
+REGISTER_VPCI_LEGACY_CAP(PCI_CAP_ID_MSI, init_msi, fini_msi);
 
 void vpci_dump_msi(void)
 {
-- 
2.34.1




 


Rackspace

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