This blog post [1] explains how to apply some OpenSuse patches [2]
(especially xen-domctl-ver7.patch) to the libvirt 0.8.1 Debian package
in order to get Xen 4.0 support.
On IRC jonnyt reported problems with PCI passthrough in such a setup.
Debugging and XenD hacking revealed that XenD 4.0 extended the sexpr
format for PCI devices from
(device (pci (dev (domain 0x0000)(bus 0x02)(slot 0x00)(func 0x0))))
to this, including a new key part
(device (pci (dev (domain 0x0000)(bus 0x02)(slot 0x00)(func
0x0)(key <whatever-value-xend-expects-here>))))
The Xen upstream commit [3] that added this doesn't explain much about it.
I came up with the attached prove-of-concept patch that just hardcodes
(key 0x0) for XenD 4.0.
On IRC jonnyt confirmed that this patch fixes the immediate error for him:
error : xend_post:434 : POST operation failed: xend_post: error
from xen daemon: (xend.err "Error creating domain: 'key'")
Matthias
[1]
http://spblinux.de/blog/2010/05/xen-4-0-with-libvirt-0-8-1-replace-xm-new-by-virsh/
[2]
https://build.opensuse.org/stage/package/files?package=libvirt&project=Virtualization
[3] http://lists.xensource.com/archives/html/xen-changelog/2009-06/msg00298.html
diff --git a/src/xen/xend_internal.c b/src/xen/xend_internal.c
index e763bad..ccfc401 100644
--- a/src/xen/xend_internal.c
+++ b/src/xen/xend_internal.c
@@ -87,7 +87,8 @@ xenDaemonFormatSxprNet(virConnectPtr conn ATTRIBUTE_UNUSED,
static int
xenDaemonFormatSxprOnePCI(virDomainHostdevDefPtr def,
virBufferPtr buf,
- int detach);
+ int detach,
+ int xendConfigVersion);
static int
virDomainXMLDevID(virDomainPtr domain,
@@ -3924,7 +3925,7 @@ xenDaemonAttachDeviceFlags(virDomainPtr domain, const char *xml,
if (dev->data.hostdev->mode == VIR_DOMAIN_HOSTDEV_MODE_SUBSYS &&
dev->data.hostdev->source.subsys.type == VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_PCI) {
if (xenDaemonFormatSxprOnePCI(dev->data.hostdev,
- &buf, 0) < 0)
+ &buf, 0, priv->xendConfigVersion) < 0)
goto cleanup;
} else {
virXendError(VIR_ERR_NO_SUPPORT, "%s",
@@ -4157,7 +4158,7 @@ xenDaemonDetachDeviceFlags(virDomainPtr domain, const char *xml,
if (dev->data.hostdev->mode == VIR_DOMAIN_HOSTDEV_MODE_SUBSYS &&
dev->data.hostdev->source.subsys.type == VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_PCI) {
if (xenDaemonFormatSxprOnePCI(dev->data.hostdev,
- &buf, 1) < 0)
+ &buf, 1, priv->xendConfigVersion) < 0)
goto cleanup;
} else {
virXendError(VIR_ERR_NO_SUPPORT, "%s",
@@ -5485,19 +5486,39 @@ xenDaemonFormatSxprNet(virConnectPtr conn,
static void
xenDaemonFormatSxprPCI(virDomainHostdevDefPtr def,
- virBufferPtr buf)
+ virBufferPtr buf,
+ int xendConfigVersion)
{
- virBufferVSprintf(buf, "(dev (domain 0x%04x)(bus 0x%02x)(slot 0x%02x)(func 0x%x))",
- def->source.subsys.u.pci.domain,
- def->source.subsys.u.pci.bus,
- def->source.subsys.u.pci.slot,
- def->source.subsys.u.pci.function);
+ /* xen 4 added this new key value, not sure what value to assign, so just
+ * hardcoding it to 0 for now.
+ *
+ * http://lists.xensource.com/archives/html/xen-changelog/2009-06/msg00298.html
+ *
+ * xend: pass-through: Add key to pci device dictionary
+ *
+ * This will be used to identify the functions belonging to
+ * a multi-function device.
+ */
+ if (xendConfigVersion == 4) {
+ virBufferVSprintf(buf, "(dev (domain 0x%04x)(bus 0x%02x)(slot 0x%02x)(func 0x%x)(key 0x0))",
+ def->source.subsys.u.pci.domain,
+ def->source.subsys.u.pci.bus,
+ def->source.subsys.u.pci.slot,
+ def->source.subsys.u.pci.function);
+ } else {
+ virBufferVSprintf(buf, "(dev (domain 0x%04x)(bus 0x%02x)(slot 0x%02x)(func 0x%x))",
+ def->source.subsys.u.pci.domain,
+ def->source.subsys.u.pci.bus,
+ def->source.subsys.u.pci.slot,
+ def->source.subsys.u.pci.function);
+ }
}
static int
xenDaemonFormatSxprOnePCI(virDomainHostdevDefPtr def,
virBufferPtr buf,
- int detach)
+ int detach,
+ int xendConfigVersion)
{
if (def->managed) {
virXendError(VIR_ERR_NO_SUPPORT, "%s",
@@ -5506,7 +5527,7 @@ xenDaemonFormatSxprOnePCI(virDomainHostdevDefPtr def,
}
virBufferAddLit(buf, "(pci ");
- xenDaemonFormatSxprPCI(def, buf);
+ xenDaemonFormatSxprPCI(def, buf, xendConfigVersion);
if (detach)
virBufferAddLit(buf, "(state 'Closing')");
else
@@ -5518,7 +5539,8 @@ xenDaemonFormatSxprOnePCI(virDomainHostdevDefPtr def,
static int
xenDaemonFormatSxprAllPCI(virDomainDefPtr def,
- virBufferPtr buf)
+ virBufferPtr buf,
+ int xendConfigVersion)
{
int hasPCI = 0;
int i;
@@ -5555,7 +5577,7 @@ xenDaemonFormatSxprAllPCI(virDomainDefPtr def,
return -1;
}
- xenDaemonFormatSxprPCI(def->hostdevs[i], buf);
+ xenDaemonFormatSxprPCI(def->hostdevs[i], buf, xendConfigVersion);
}
}
virBufferAddLit(buf, "))");
@@ -5853,7 +5875,7 @@ xenDaemonFormatSxpr(virConnectPtr conn,
&buf, hvm, xendConfigVersion, 0) < 0)
goto error;
- if (xenDaemonFormatSxprAllPCI(def, &buf) < 0)
+ if (xenDaemonFormatSxprAllPCI(def, &buf, xendConfigVersion) < 0)
goto error;
/* New style PV graphics config xen >= 3.0.4,
--
libvir-list mailing list
[email protected]
https://www.redhat.com/mailman/listinfo/libvir-list