Jan Beulich
2010-Nov-02 08:04 UTC
[Xen-devel] [PATCH] 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).
Once at it, simplify the code a little, too.
Signed-off-by: Jan Beulich <jbeulich@novell.com>
--- a/xen/drivers/passthrough/vtd/iommu.c
+++ b/xen/drivers/passthrough/vtd/iommu.c
@@ -1371,23 +1371,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;
+ 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.
- */
+ /*
+ * 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-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel
Weidong Han
2010-Nov-03 00:54 UTC
[Xen-devel] Re: [PATCH] VT-d: fix device assignment failure (regression from Xen c/s 19805:2f1fa2215e60)
Jan Beulich wrote:> 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). > > Once at it, simplify the code a little, too. > > Signed-off-by: Jan Beulich <jbeulich@novell.com> > > --- a/xen/drivers/passthrough/vtd/iommu.c > +++ b/xen/drivers/passthrough/vtd/iommu.c > @@ -1371,23 +1371,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; > + 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. > - */ > + /* > + * 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; > > > > Acked-by: Weidong Han <weidong.han@intel.com> >_______________________________________________ Xen-devel mailing list Xen-devel@lists.xensource.com http://lists.xensource.com/xen-devel