forked from pool/libvirt
43 lines
1.7 KiB
Diff
43 lines
1.7 KiB
Diff
|
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.0.3/src/xen/xend_internal.c
|
||
|
===================================================================
|
||
|
--- libvirt-1.0.3.orig/src/xen/xend_internal.c
|
||
|
+++ libvirt-1.0.3/src/xen/xend_internal.c
|
||
|
@@ -2473,6 +2473,7 @@ xenDaemonAttachDeviceFlags(virDomainPtr
|
||
|
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);
|
||
|
|
||
|
@@ -2585,8 +2586,18 @@ xenDaemonAttachDeviceFlags(virDomainPtr
|
||
|
}
|
||
|
|
||
|
sexpr = virBufferContentAndReset(&buf);
|
||
|
+ new_dev = virDomainXMLDevID(domain, def, dev, class, ref, sizeof(ref));
|
||
|
|
||
|
- if (virDomainXMLDevID(domain, def, 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(domain->conn, domain->name, "op", "device_configure",
|
||
|
+ "config", sexpr, "dev", ref, NULL);
|
||
|
+ goto cleanup;
|
||
|
+ }
|
||
|
+
|
||
|
+ if (new_dev) {
|
||
|
/* device doesn't exist, define it */
|
||
|
ret = xend_op(domain->conn, domain->name, "op", "device_create",
|
||
|
"config", sexpr, NULL);
|