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

Re: [Xen-devel] PCI Passthrough Problems/Questions



Konrad Rzeszutek Wilk wrote:
On Mon, Oct 25, 2010 at 12:50:41PM -0600, Nick Couchman wrote:
On Mon, 2010-10-25 at 14:48 -0400, Konrad Rzeszutek Wilk wrote:
On Mon, Oct 25, 2010 at 12:33:09PM -0600, Nick Couchman wrote:
On Mon, 2010-10-25 at 13:40 -0400, Konrad Rzeszutek Wilk wrote:

What do you see on your Xen serial output? I presume you cranked up logging:
loglevel=all guest_lvl=all iommu=verbose on your Xen command line.

Is there anything that shows up when you get the 'Failed to assign.." ?

The only messages I get on the serial console after setting those
parameters on the xen.gz kernel line in grub (and rebooting, of course)
are the following:

(XEN) [VT-D]iommu.c:1496: d0:PCI: unmap bdf = 2:0.0
(XEN) [VT-D]iommu.c:1364: d1:PCI: map bdf = 2:0.0
(XEN) domctl.c:848:d0 XEN_DOMCTL_assign_device: assign device (2:0.0)
failed
(XEN) event_channel.c:192:d0 EVTCHNOP failure: domain 1, error -22
Nick,

I think the issue is 02:00.0 was mapped twice. Could you try with below patch? Then post the xen log. Pls post all output of 'lspci -v' on your system.

diff -r eff592364826 xen/drivers/passthrough/vtd/iommu.c
--- a/xen/drivers/passthrough/vtd/iommu.c   Wed Sep 01 11:23:49 2010 +0100
+++ b/xen/drivers/passthrough/vtd/iommu.c   Wed Oct 27 14:33:23 2010 +0800
@@ -1225,7 +1225,11 @@ static int domain_context_mapping_one(
        if (!pdev)
            res = -ENODEV;
        else if (pdev->domain != domain)
-            res = -EINVAL;
+        {
+ dprintk(VTDPREFIX, "context_present: %x:%x.%x: pdev->domain=%d domain=%d\n", + bus, PCI_SLOT(devfn), PCI_FUNC(devfn), pdev->domain, domain->domain_id);
+        //    res = -EINVAL;
+        }
        unmap_vtd_domain_page(context_entries);
        spin_unlock(&iommu->lock);
        return res;
@@ -1352,6 +1356,8 @@ static int domain_context_mapping(struct
        /* PCIe to PCI/PCIx bridge */
        if ( pdev_type(bus, devfn) == DEV_TYPE_PCIe2PCI_BRIDGE )
        {
+            dprintk(VTDPREFIX, "d%d:PCI: map PCIe2PCI bdf = %x:%x.%x\n",
+ domain->domain_id, bus, PCI_SLOT(devfn), PCI_FUNC(devfn)); ret = domain_context_mapping_one(domain, drhd->iommu, bus, devfn);
            if ( ret )
                return ret;
@@ -1362,6 +1368,8 @@ static int domain_context_mapping(struct
             * on the secondary bus behind the bridge. Map that id
             * as well.
             */
+            dprintk(VTDPREFIX, "d%d:PCI: map secbus (%d) with devfn 0\n",
+                    domain->domain_id, secbus);
ret = domain_context_mapping_one(domain, drhd->iommu, secbus, 0);
        }
        else /* Legacy PCI bridge */

So, -EINVAL. How comfortable are you sticking a bunch of
dprintk(VTDPREFIX, " in the drivers/passthrough/vtd/iommu.c file? Basically
you need to figure which of the functions that are past line 1364
are being called and return -EINVAL.
I'm happy to give it a shot...it'll take a while to get the devel
environment configured, as I'm using packages right now and I don't even
think I have a compiler on this system.  I'll report back once I get
that done and give that a try.

Excellent. You might also want to CC Weidong (weidong.han@xxxxxxxxx) in the 
future
who is right now on travel and he might have better suggestions. CC-ing him on 
this e-mail.


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


 


Rackspace

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