# HG changeset patch
# User Keir Fraser <keir@xxxxxxx>
# Date 1288772916 0
# Node ID 4bd91466a085b20e150b03e29e6fd8e0d341a55a
# Parent 1225153044b77f09ba9b1244d68d7dc7f830b13c
VT-d: fix device assignment failure (regression from Xen c/s 19805:2f1fa2215e60)
If the device at <secbus>:00.0 is the device the mapping operation was
initiated for, trying to map it a second time will fail, and hence
this second mapping attempt must be prevented (as was done prior to
said c/s).
While at it, simplify the code a little, too.
Signed-off-by: Jan Beulich <jbeulich@xxxxxxxxxx>
Acked-by: Weidong Han <weidong.han@xxxxxxxxx>
xen-unstable changeset: 22348:2dfba250c50b
xen-unstable date: Wed Nov 03 08:18:51 2010 +0000
---
xen/drivers/passthrough/vtd/iommu.c | 25 +++++++++----------------
1 files changed, 9 insertions(+), 16 deletions(-)
diff -r 1225153044b7 -r 4bd91466a085 xen/drivers/passthrough/vtd/iommu.c
--- a/xen/drivers/passthrough/vtd/iommu.c Sun Oct 31 19:02:13 2010 +0000
+++ b/xen/drivers/passthrough/vtd/iommu.c Wed Nov 03 08:28:36 2010 +0000
@@ -1367,23 +1367,16 @@ static int domain_context_mapping(struct
if ( find_upstream_bridge(&bus, &devfn, &secbus) < 1 )
break;
- /* PCIe to PCI/PCIx bridge */
- if ( pdev_type(bus, devfn) == DEV_TYPE_PCIe2PCI_BRIDGE )
- {
- ret = domain_context_mapping_one(domain, drhd->iommu, bus, devfn);
- if ( ret )
- return ret;
-
- /*
- * Devices behind PCIe-to-PCI/PCIx bridge may generate
- * different requester-id. It may originate from devfn=0
- * on the secondary bus behind the bridge. Map that id
- * as well.
- */
+ ret = domain_context_mapping_one(domain, drhd->iommu, bus, devfn);
+
+ /*
+ * Devices behind PCIe-to-PCI/PCIx bridge may generate different
+ * requester-id. It may originate from devfn=0 on the secondary bus
+ * behind the bridge. Map that id as well if we didn't already.
+ */
+ if ( !ret && pdev_type(bus, devfn) == DEV_TYPE_PCIe2PCI_BRIDGE &&
+ (secbus != pdev->bus || pdev->devfn != 0) )
ret = domain_context_mapping_one(domain, drhd->iommu, secbus, 0);
- }
- else /* Legacy PCI bridge */
- ret = domain_context_mapping_one(domain, drhd->iommu, bus, devfn);
break;
_______________________________________________
Xen-changelog mailing list
Xen-changelog@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-changelog
|