Fix PCI device attach in xend driver When attaching PCI device using the xend driver, the 'device_create' RPC is called, which is not sufficient to fully prepare/configure the device for attachment to a domain. In the xen tools, xm pci-attach uses the 'device_configure' RPC. This patch changes the xend driver to always call 'device_configure' for PCI devices to be consistent with the usage in the xen tools. Index: libvirt-1.2.6/src/xen/xend_internal.c =================================================================== --- libvirt-1.2.6.orig/src/xen/xend_internal.c +++ libvirt-1.2.6/src/xen/xend_internal.c @@ -2222,6 +2222,7 @@ xenDaemonAttachDeviceFlags(virConnectPtr virBuffer buf = VIR_BUFFER_INITIALIZER; char class[8], ref[80]; char *target = NULL; + int new_dev; virCheckFlags(VIR_DOMAIN_AFFECT_LIVE | VIR_DOMAIN_AFFECT_CONFIG, -1); @@ -2320,8 +2321,18 @@ xenDaemonAttachDeviceFlags(virConnectPtr } sexpr = virBufferContentAndReset(&buf); + new_dev = virDomainXMLDevID(conn, minidef, dev, class, ref, sizeof(ref)); - if (virDomainXMLDevID(conn, minidef, dev, class, ref, sizeof(ref))) { + /* always call 'device_configure' for pci device */ + if (dev->type == VIR_DOMAIN_DEVICE_HOSTDEV && + dev->data.hostdev->mode == VIR_DOMAIN_HOSTDEV_MODE_SUBSYS && + dev->data.hostdev->source.subsys.type == VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_PCI) { + ret = xend_op(conn, def->name, "op", "device_configure", + "config", sexpr, "dev", ref, NULL); + goto cleanup; + } + + if (new_dev) { /* device doesn't exist, define it */ ret = xend_op(conn, def->name, "op", "device_create", "config", sexpr, NULL);