WARNING - OLD ARCHIVES

This is an archived copy of the Xen.org mailing list, which we have preserved to ensure that existing links to archives are not broken. The live archive, which contains the latest emails, can be found at http://lists.xen.org/
   
 
 
Xen 
 
Home Products Support Community News
 
   
 

xen-changelog

[Xen-changelog] [xen-unstable] VT-d: handle return value of deassign_dev

To: xen-changelog@xxxxxxxxxxxxxxxxxxx
Subject: [Xen-changelog] [xen-unstable] VT-d: handle return value of deassign_device
From: Xen patchbot-unstable <patchbot-unstable@xxxxxxxxxxxxxxxxxxx>
Date: Thu, 21 Jan 2010 01:20:27 -0800
Delivery-date: Thu, 21 Jan 2010 01:20:35 -0800
Envelope-to: www-data@xxxxxxxxxxxxxxxxxxx
List-help: <mailto:xen-changelog-request@lists.xensource.com?subject=help>
List-id: BK change log <xen-changelog.lists.xensource.com>
List-post: <mailto:xen-changelog@lists.xensource.com>
List-subscribe: <http://lists.xensource.com/mailman/listinfo/xen-changelog>, <mailto:xen-changelog-request@lists.xensource.com?subject=subscribe>
List-unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-changelog>, <mailto:xen-changelog-request@lists.xensource.com?subject=unsubscribe>
Reply-to: xen-devel@xxxxxxxxxxxxxxxxxxx
Sender: xen-changelog-bounces@xxxxxxxxxxxxxxxxxxx
# HG changeset patch
# User Keir Fraser <keir.fraser@xxxxxxxxxx>
# Date 1264065066 0
# Node ID acd7d3f06d9aea147dcd7ea3830574cb64bce41b
# Parent  6a5d8284b6e686fd3570bdb1d4ad8aba65b41bf7
VT-d: handle return value of deassign_device

deassign_device may fail, so need to capture its failure for
appropriate handling. This patch captures return values of
deassign_device, and prints error messages if it fails.

In addition, this patch also fixes some code style issues.

Signed-off-by: Weidong Han <Weidong.han@xxxxxxxxx>
---
 xen/arch/ia64/xen/dom0_ops.c    |   18 ++++++++++++------
 xen/arch/x86/domctl.c           |   25 ++++++++++++-------------
 xen/drivers/passthrough/iommu.c |   16 ++++++++++++----
 xen/drivers/passthrough/pci.c   |    5 ++++-
 4 files changed, 40 insertions(+), 24 deletions(-)

diff -r 6a5d8284b6e6 -r acd7d3f06d9a xen/arch/ia64/xen/dom0_ops.c
--- a/xen/arch/ia64/xen/dom0_ops.c      Thu Jan 21 09:03:20 2010 +0000
+++ b/xen/arch/ia64/xen/dom0_ops.c      Thu Jan 21 09:11:06 2010 +0000
@@ -354,8 +354,10 @@ long arch_do_domctl(xen_domctl_t *op, XE
         }
 
         ret = assign_device(d, bus, devfn);
-        gdprintk(XENLOG_INFO, "XEN_DOMCTL_assign_device: bdf = %x:%x.%x\n",
-                 bus, PCI_SLOT(devfn), PCI_FUNC(devfn));
+        if ( ret )
+            gdprintk(XENLOG_ERR, "XEN_DOMCTL_assign_device: "
+                     "assign device (%x:%x.%x) failed\n",
+                     bus, PCI_SLOT(devfn), PCI_FUNC(devfn));
         put_domain(d);
     }
     break;
@@ -388,10 +390,14 @@ long arch_do_domctl(xen_domctl_t *op, XE
         if ( !device_assigned(bus, devfn) )
             break;
 
-        ret = 0;
-        deassign_device(d, bus, devfn);
-        gdprintk(XENLOG_INFO, "XEN_DOMCTL_deassign_device: bdf = %x:%x.%x\n",
-            bus, PCI_SLOT(devfn), PCI_FUNC(devfn));
+        spin_lock(&pcidevs_lock);
+        ret = deassign_device(d, bus, devfn);
+        spin_unlock(&pcidevs_lock);
+        if ( ret )
+            gdprintk(XENLOG_ERR, "XEN_DOMCTL_deassign_device: "
+                     "deassign device (%x:%x.%x) failed\n",
+                     bus, PCI_SLOT(devfn), PCI_FUNC(devfn));
+
         put_domain(d);
     }
     break;
diff -r 6a5d8284b6e6 -r acd7d3f06d9a xen/arch/x86/domctl.c
--- a/xen/arch/x86/domctl.c     Thu Jan 21 09:03:20 2010 +0000
+++ b/xen/arch/x86/domctl.c     Thu Jan 21 09:11:06 2010 +0000
@@ -842,11 +842,8 @@ long arch_do_domctl(
         if ( !iommu_pv_enabled && !is_hvm_domain(d) )
         {
             ret = -ENOSYS;
-            put_domain(d);
-            break;
-        }
-
-        ret = -EINVAL;
+            goto assign_device_out;
+        }
 
         ret = assign_device(d, bus, devfn);
         if ( ret )
@@ -872,7 +869,7 @@ long arch_do_domctl(
         if ( unlikely((d = get_domain_by_id(domctl->domain)) == NULL) )
         {
             gdprintk(XENLOG_ERR,
-                "XEN_DOMCTL_deassign_device: get_domain_by_id() failed\n"); 
+                "XEN_DOMCTL_deassign_device: get_domain_by_id() failed\n");
             break;
         }
 
@@ -886,15 +883,15 @@ long arch_do_domctl(
         if ( !iommu_pv_enabled && !is_hvm_domain(d) )
         {
             ret = -ENOSYS;
-            put_domain(d);
-            break;
-        }
-        ret = 0;
+            goto deassign_device_out;
+        }
         spin_lock(&pcidevs_lock);
         ret = deassign_device(d, bus, devfn);
         spin_unlock(&pcidevs_lock);
-        gdprintk(XENLOG_INFO, "XEN_DOMCTL_deassign_device: bdf = %x:%x.%x\n",
-            bus, PCI_SLOT(devfn), PCI_FUNC(devfn));
+        if ( ret )
+            gdprintk(XENLOG_ERR, "XEN_DOMCTL_deassign_device: "
+                     "deassign device (%x:%x.%x) failed\n",
+                     bus, PCI_SLOT(devfn), PCI_FUNC(devfn));
 
     deassign_device_out:
         put_domain(d);
@@ -948,7 +945,7 @@ long arch_do_domctl(
         ret = -EPERM;
         if ( !IS_PRIV(current->domain) &&
              !irq_access_permitted(current->domain, bind->machine_irq) )
-            goto bind_out;
+            goto unbind_out;
 
         if ( iommu_enabled )
         {
@@ -958,6 +955,8 @@ long arch_do_domctl(
         }
         if ( ret < 0 )
             gdprintk(XENLOG_ERR, "pt_irq_destroy_bind failed!\n");
+
+    unbind_out:
         rcu_unlock_domain(d);
     }
     break;
diff -r 6a5d8284b6e6 -r acd7d3f06d9a xen/drivers/passthrough/iommu.c
--- a/xen/drivers/passthrough/iommu.c   Thu Jan 21 09:03:20 2010 +0000
+++ b/xen/drivers/passthrough/iommu.c   Thu Jan 21 09:11:06 2010 +0000
@@ -234,23 +234,31 @@ int deassign_device(struct domain *d, u8
 {
     struct hvm_iommu *hd = domain_hvm_iommu(d);
     struct pci_dev *pdev = NULL;
+    int ret = 0;
 
     if ( !iommu_enabled || !hd->platform_ops )
         return -EINVAL;
 
     ASSERT(spin_is_locked(&pcidevs_lock));
     pdev = pci_get_pdev(bus, devfn);
-    if (!pdev)
+    if ( !pdev )
         return -ENODEV;
 
-    if (pdev->domain != d)
+    if ( pdev->domain != d )
     {
         gdprintk(XENLOG_ERR VTDPREFIX,
                 "IOMMU: deassign a device not owned\n");
         return -EINVAL;
     }
 
-    hd->platform_ops->reassign_device(d, dom0, bus, devfn);
+    ret = hd->platform_ops->reassign_device(d, dom0, bus, devfn);
+    if ( ret )
+    {
+        gdprintk(XENLOG_ERR VTDPREFIX,
+                 "Deassign device (%x:%x.%x) failed!\n",
+                 bus, PCI_SLOT(devfn), PCI_FUNC(devfn));
+        return ret;
+    }
 
     if ( !has_arch_pdevs(d) && need_iommu(d) )
     {
@@ -258,7 +266,7 @@ int deassign_device(struct domain *d, u8
         hd->platform_ops->teardown(d);
     }
 
-    return 0;
+    return ret;
 }
 
 int iommu_setup(void)
diff -r 6a5d8284b6e6 -r acd7d3f06d9a xen/drivers/passthrough/pci.c
--- a/xen/drivers/passthrough/pci.c     Thu Jan 21 09:03:20 2010 +0000
+++ b/xen/drivers/passthrough/pci.c     Thu Jan 21 09:11:06 2010 +0000
@@ -286,7 +286,10 @@ void pci_release_devices(struct domain *
     {
         pci_cleanup_msi(pdev);
         bus = pdev->bus; devfn = pdev->devfn;
-        deassign_device(d, bus, devfn);
+        if ( deassign_device(d, bus, devfn) )
+            printk("domain %d: deassign device (%02x:%02x.%x) failed!\n",
+                   d->domain_id, pdev->bus, PCI_SLOT(pdev->devfn),
+                   PCI_FUNC(pdev->devfn));
     }
     spin_unlock(&pcidevs_lock);
 }

_______________________________________________
Xen-changelog mailing list
Xen-changelog@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-changelog

<Prev in Thread] Current Thread [Next in Thread>
  • [Xen-changelog] [xen-unstable] VT-d: handle return value of deassign_device, Xen patchbot-unstable <=